下面所有操作,都是基于一个已经建立好的 1.sh
脚本
变量声明
Shell变量的声明和 python 语言的变量声明类似,即
变量名=值
a=123
a=123
b=456
c="hello world !"
值得注意的是
- 等于号的前后不能有空格
- 变量命名规则,要比较规范,不能以下划线,问号什么的开头
- 变量默认类型是字符串,即使 a=123,a其实是
“123”
,至于怎么加减,下面细说
变量使用
使用一个变量,不能直接打变量名,因为我们可以把脚本想象成在命令行里打字,我们直接打一个a,系统怎么知道打的是 a 命令 还是调用a变量?
变量的引用,需要在前面加 $
,即美元符号,告诉系统这是一个变量,此外,如果使用 ${变量名}
,即括号括起来,那么会进一步精确化变量的名字,更不容易出错,不过这个括号不是必须的
编写一个简单的脚本验证:
#!/bin/bash
a=123
b=456
c="hello world !"
echo $a+$b
echo $c
可以看到,a+b并没有产生加法运算,因为默认的变量类型是字符串,而且我们这个 + 号,也是字符串,这里类似C++中宏定义的替换。。。
格式化输出
有时候我们想在变量前面,输出说明字符串,比如 “这个字符串的值是: abc”
,abc是某个变量的值,这时候想起printf的好 ,可以使用类似printf的方式,引号也可以去掉,其实也可以理解成简单的宏定义替换
echo "说明语句 $变量名"
echo 说明语句 $变量名
运行这个脚本
#!/bin/bash
a=123
b=456
c="Hello World"
echo "a+b=$a+$b"
echo a+b=$a+$b
echo c is :$c
echo "c is :$c"
变量的加减乘除
expr语句
使用expr语句以宣告这是一条表达式,注意expr要用 反引号
括起来,和 ~
是一个键,按shift是 ~
,不按是反引号
,在ESC下面
`expr $变量a 运算符 $变量b`
修改刚刚的脚本
#!/bin/bash
a=123
b=456
c=`expr $a + $b`
echo $a+$b
echo $c
再次验证了上面的说法,可以看到第一行是直接 $a+$b
,相当于宏定义字符串得到简单替换,第二行使用expr语句,真正做到了加减法,值得注意的是,运算符左右必须有空格
其他运算符
加减乘除
#!/bin/bash
a=123
b=10
echo a + b = `expr $a + $b`
echo a - b = `expr $a - $b`
echo a \* b = `expr $a \* $b`
echo a / b = `expr $a / $b`
echo *
乘法的转义
值得注意的是,乘法需要用 \*
来转义,直接打 *
,遍历当前文件夹下的所有文件名,和java的import java.xxx.*;
类似,下面这个例子证明了使用 \*
来转义的重要性
关系判断
[ $变量1 == $变量2 ] :变量1是否 [等于] 变量2, 返回true or false
[ $变量1 != $变量2 ] :变量1是否 [不等于] 变量2, 返回true or false
[ $变量1 -eq $变量2 ] :变量1是否 [等于] 变量2, 返回true or false
[ $变量1 -ne $变量2 ] :变量1是否 [不等于] 变量2, 返回true or false
[ $变量1 -gt $变量2 ] :变量1是否 [大于] 变量2, 返回true or false
[ $变量1 -lt $变量2 ] :变量1是否 [小于] 变量2, 返回true or false
[ $变量1 -ge $变量2 ] :变量1是否 [大于等于] 变量2, 返回true or false
[ $变量1 -le $变量2 ] :变量1是否 [小于等于] 变量2, 返回true or false
解释:
eq : equal 等于
ne : not equal 不等于
gt : greater than 大于
lt : less than 小于
ge : greater equal 大于等于
le : less equal 小于等于
if判断语句
if语句和大多数的变成语句类似,只是结束if的 } 变成了 fi,可以理解为final,终结的意思 ,结尾记得加fi
if 条件语句
then
语句1
语句2
...
语句n
fi
也可以加入else语句
if 条件语句
then
语句1
语句2
...
语句n
else
语句1
语句2
...
语句n
fi
演示
执行以下脚本,产生以下输出
#!/bin/bash
a=123
b=124
if [ $a == $b ]
then
echo a=b
echo a=b hhhhh
else
echo a!=b
echo a!=b AAhhhh
fi
另一种形式
值得注意的是,用两个括号括住,然后像一般编程语言一样判断,即直接写大于小于符号即可
执行以下脚本,将产生以下输出
#!/bin/bash
a=123
b=124
if (($a < $b))
then
echo a=b
echo a=b hhhhh
else
echo a!=b
echo a!=b AAhhhh
fi
循环语句
while语句
同if类似,结束的 } 被替换为 done
while 条件
do
语句1
语句2
...
语句n
done
还记得刚刚创建了5个txt吗,我们循环删除他们,删除的同时打印当前目录下的文件,执行以下脚本,产生以下输出
#!/bin/bash
ls
i=1
while (($i <= 5))
do
rm $i.txt
i=`expr $i + 1`
ls
done
关于自增,其他的详细方法
i=`expr $i + 1`
let i+=1
let "i++"
((i++))
for语句
枚举迭代变量
通过枚举 v1,v2,来实现循环
for 迭代变量 in v1 v2 v3 ... vn
do
语句
...
语句
done
#!/bin/bash
for i in 1 2 3
do
echo $i
let "i++"
done
for+seq序列实现循环
seq语句:(别忘了反引号)
`seq 首项 公差 末项`
执行以下脚本,产生以下输出
#!/bin/bash
for i in `seq 0 2 8`
do
echo $i
done