入门
什么是 shell?
首先打开一个终端,在终端里能做的操作, 如 cd ,cp 等
以及在终端里执行的命令,如 date,echo 等, 都能同样的写进.sh 脚本里面去,
此时,你可以把脚本文件理解成一个”命令包”, 运行一个文件相当于运行了里面的多个操作和命令. (参照 windows 下的.bat 文件来理解)
那么让我们来做一个最简单的.sh 文件文件名: simple.sh
代码示例
<code>#!/bin/bash
cd /var/tmp/
pwd/<code>
第 2 步,
加上执行权限, chmod u+x simple.sh
(脚本编辑完成后,需要加”可执行权限”这一步,在下面的脚本示例中,就不再重复写了,请大家自己加)
第 3 步
执行, ./simple.sh
看看打印什么?(和在终端直接执行 cd /var/tmp , pwd 两个命令的效果是一样的)
进阶
既然是 shell 编程,那么必然少不了变量,表达式,及控制结构这些.
分别讲解如下:
变量有三种:
1:自定义变量
2:系统变量
3:命令返回值变量
我们先来试一下自定义变量代码示例
<code>#!/bin/bash
var1=hello
var2=bash
#注意,=号两边都不要有空格
echo $var1 $var2/<code>
注意:声明变量时,不要加$,且'='号前后不要加空格, 而在引用变量时,则要加上$,如 echo $var1
再来试一下系统变量文件名: sys.sh
代码示例
<code>#!/bin/bash
echo $HOME
echo $USER/<code>
运行 sys.sh 查看结果?
对于$HOME,$USER,我们并没有定义这两个变量,但为什么可以打印出结果呢? 这是因为$HOME,$USER 是系统变量,系统已经定义好了,不用我们再定义.
最后来试一下命令返回值变量脚本: com.sh
代码示例
<code>#!/bin/bash
var1=`date +%y%m%d`
echo $var1
date +%y%m%d/<code>
运行 ./com.sh, 看看打印结果? 分析一下两行的结果各是怎么样打印出来的?
思考:命令的输出内容如何赋到变量里?
答:有时候,我们需要把命令的运行结果捕捉,并赋给某变量,则可以用反引号 `命令` 来实现. 如 pos=`pwd`,则 pwd 命令的结果将赋给 pos 变量.
提高
会定义变量,会使用系统变量,会捕捉命令的返回值,还不够, 有了变量,还要有表达式和控制结构,才能叫”程序”
表达式有”命令表达式”,”数学表达式”,”字符串表达式”,”文件判断表达式”
控制结构有 if/ case/for/while
先来看一下命令表达式和 if/else 控制结构
命令表达式 是指 如果一个命令执行成功,则返回 true,如果执行失败,则执行 false if/else 的语法格式如下:
<code>f 表达式
then
语句 1
语句 2
....
else
语句 one
语句 two
.....
fi/<code>
结合命令表达式,和 if 控制结构,我们创建一个脚本:com_exp.sh
作用:帮我们创建一个目录 dir1, 如果创建成功,则显示 ok;如果失败,则显示 fail.
代码示例:
<code>#!/bin/bash
if mkdir dir1
then
echo ok
else
echo fail
fi/<code>
先保证当前目录下没有 dir1 目录,然后运行 2 次此脚本,看看分别打印什么结果,并思考为什么?
数学比较表达式
数学比较表达式的作用: 比较两数的大小关系
数学表达式是这样的结构[ $var1 -gt/-lt/-eq/-ge/-le/-ne $var2 ]
注意:中括号两端各有 1 空格比较运算符的含义见下:
-gt >
-lt <
-ge >=
-le <=
-eq =
-ne !=
创建脚本 math.sh
作用:判断两个变量的大小,并打印结果. 代码示例:
<code>#!/bin/bash
var1=8
var2=12
if [ $var1 -gt $var2 ]
then
echo $var1 more than $var2
elif [ $var1 -eq $var2 ]
then
echo $var1 equal $var2 else
echo $var1 less than $var2
fi/<code>
字符串判断表达式
字符串表达式的作用: 用于判断两字符串是否相同格式:[ $str1 =/!= str2 ]
注意:中括号两端各有 1 空格代码示例
#!/bin/bash
var1=hello
var2=world
if [ $var1 = $var2 ]
then
echo $var1 is $var2
else
echo $var1 is not $var2
文件判断表达式
文件表达式作用:判断文件是否存在,是否可读/可写/可执行,是否是目录或普通文件等, 以及用来比较两个文件的新旧顺序.
格式 1: [ -d/-f/-e/-r/-w/-x filename ]
分别判断
-d 文件是否存在且是目录
-f 文件是否存在且是文件
-e 是否存在
-r 是否可读
-w 是否可写
-x 是否可执行
格式 2: [ file1 -nt/-ot file2 ]
分别判断
-nt 检查 file1 是否为 file2 新
-ot 检查 file1 是否为 file2 旧
创建脚本: file.sh
作用:判断当前目录下有没有 dir2
目录代码示例:
<code>#!/bin/bash
if [ -d ./dir2 ]
then
ls dir2
else
echo dir2 is not exists
fi/<code>
控制结构:
if/else 结构(上面有很多例子,跳过)
for 结构 (for 循环有两种)
1: bash 风格的 for 循环格式如下:
for 变量名 in 值 1 值 2 值 3 值 n
do
语句 1
语句 2
....
done
创建脚本 bash_for.sh 作用: 打印 A B C D E 代码示例:
<code>#!/bin/bash
for i in A B C D E
do
echo $i
done/<code>
2:C 风格的 for 循环格式如下:
for((变量=初始值;变量<=n;变量++)) do
语句 1
语句 2
...
done
创建脚本:c_bash.sh 作用:计算 1-100 的和代码示例:
<code>#!/bin/bash
for((i=1;i<=100;i++))
sum=0
do
sum=$[ $sum + $i ]
done
echo $sum/<code>
case 结构介绍
格式如下:
case 变量 in
可能性 1)
语句 1
语句 2
;;
可能性 2)
语句 1
语句 2
;;
*)
语句 1
语句 2
;;
创建脚本: case.sh
作用:判断当前登陆者是谁,并根据情况打印不同内容
代码示例
<code>#!/bin/bash
case $USER in shiba)
echo -n “you “
echo -n “are “
echo “shiba”;; shijiu)
echo you are shijiu*)
echo sorry!/<code>
几行语句后面,放两个;;就可以了, 而不是每行后面都放两个;;
*代表以上情况都不是时,类似于 java 中的 default
閱讀更多 冰玄6666 的文章