1. Shell的注释
在shell脚本中也可以有注释,不过和大多数编程语言不同的是,shell中采用#来添加注释。
#!/bin/bash
i=10
str="hello world"
#以下是输出
echo $i
echo $str
在要注释的行开头加上#号就可以将改行注释。但是如果要注释很多行的时候,给每一行加#号非常繁琐,效率低。在c语言中可以用/* */来注释一个代码块。在shell中则可以用:<<+注释名来注释整块代码。
其注释的一般形式为:
:<< a
注释的代码
a
可以把a理解为这块注释的名字,结束的时候也需要以该名字结束。看一个实例:
#!/bin/bash
a=1
b=2
c=3
:<<a
str="hello"
str2="world"
str3="linux"
str4="shell"
a
2. Shell中的运算符
在shell中支持许多的运算符,常用的运算符类型主要有以下几种:
- 算术运算符
- 关系运算符
- 布尔运算符
- 文件测试运算符
- 字符串运算符
3. Shell中的算术运算
shell本身不能直接算术运算,需要借助数学计算命令才能完成计算。因为在shell中,如不是特别指明,变量的存储都是以字符串的形式存储的。
#!/bin/bash
i=10
j=20
echo i+j
输出:
i+j
可见,shell并没有把i和j相加输出。要想输出30,就要数学计算命令出马了。常用的数学计算命令有以下:
计算指令 | 描述 |
---|---|
(()) | 用于整数的计算 |
expr | 可用于整数的计算,也可以用于处理字符串 |
let | 用于整数的计算 |
bc | 支持整数与小数的计算 |
expr的使用
#!/bin/bash
val=`expr 30 + 10`
echo "30+10=${val}"
i=10
j=20
val=`expr $i + $j`
echo "i+j=${val}"
输出:
30+10=40
i+j=30
使用expr完成的计算的任务。在使用expr的时候有两个点需要注意:
- 表达式要被反引号包含,键盘Esc下面那个
- 表达式与运算符之间需要有空格。
val=expr 20 + 30 #error 没有用反引号包含表达式
val=`expr 20+30` #error 运算符两边需要有空格
(())的使用
使用(())计算的一般格式:
val=$((表达式)) #将表达式的结果赋值给val
下面看一个具体的例子。
#!/bin/bash
i=10
j=20
sum=$((i+j))
sub=$((j-i))
echo "sum=$sum"
echo "sub=$sub"
注意,表达式里的变量如i和j就不用再用$取值了,因为(())会自动解析表达式里变量的值。
除了将(())计算的结果赋值给变量,也可以将表达式的结果直接使用echo命令输出,但是要记得加上美元符号。另外,在()中也可以包含多个表达式,每一个表达式用逗号隔开,(())命令返回的值将会是最后一个表达式的值。
#!/bin/bash
i=10
j=20
echo $((i+j))
val=$((i+j,j-i))
echo $val
输出:
30
10
第二个(())包含了两个表达式,从结果来看确实是返回了第二个表达式的值。
bc命令的使用
bc是Linux内置的计算程序,能够处理小数的运算。在shell如有浮点数的运算都是用bc来进行计算。
其在shell中使用的一般形式为:
val=`echo "表达式" | bc`
如果表达式的值不需要赋给变量,则可以直接用下面的形式:
echo "表达式"|bc
#!/bin/bash
i=1.1
j=2.2
val=`echo "i+j" | bc`
echo $val
输出
0
这就奇怪了,难道不是3.3吗?为什么是0呢?其实是因为bc是不知道i和j变量的存在的,他只能使用""里面定义的变量,如下:
#!/bin/bash
val=`echo "i=1.1;j=2.2;i+j" | bc`
echo $val
输出3.3。另外需要注意的是在""里面定义的i和j变量在shell脚本中是不可以使用的。
那如果非要计算shell中定义的变量呢?可以如下做:
#!/bin/bash
i=1.1
j=2.2
val=`echo "a=$i;b=$j;a+b"|bc`
echo $val
在""定义变量采用shell中的变量赋值就可以了。bc命令中的内置变量scale可以指定精度。
#!/bin/bash
val=`echo "scale=2;i=1.111;j=2.222;i+j" |bc`
echo $val
输出3.333。
4. Shell中的其他运算
关系运算符
关系运算符只支持数字,不支持字符串。常用的关系运算符及其含义如下:
-eq:两数相等返回true,不相等返回false
-ne:两数不相等返回false,相等返回false
-gt:左边的数大于右边的数返回true,否则返回false
-lt:左边的数小于右边的数返回true,否则返回false
-ge:左边的数大于等于右边的数返回true,否则返回false
-le:左边的数小于等于右边的数返回true,否则返回false
文件测试运算符
文件运算符主要是测试linux中文件的各种属性,例如是否存在,是否可读可写等等,常用的有如下:
-e:检测文件是否存在,存在返回true
-r:检测文件是否可读,可读返回true
-w:检测文件是否可写,可写返回true
-x:检测文件是否可执行,可执行返回true
-d:检测该文件是否为目录,是目录返回true
-f:检测该文件是否为普通文件(不是目录),是普通文件返回true
-s:检测文件大小是否大于0,大于0返回true
字符串运算符
=:两个字符串相等返回true
!=:两个字符串不相等返回true
$:检测是否是空串,不为空返回0
-z:字符串的长度是否为0,为0返回true
-n:字符串的长度是否不为0,不为0返回tue
布尔运算符
!:非运算,表达式为真则返回false,为假返回true
-o:或运算,有一个表达式为真则返回true
-a:与运算,所有的表达式都为真则返回true,否则返回false
逻辑运算符
&&:逻辑与
||:逻辑或
shell中的关系运算符,字符串运算符等其他运算符将会在下一篇文章中结合if…else语句做一些示例。