linux shell 编程
- 最近在用Linux倒腾一些东西,发现好多东西都可以使用写成一个shell脚本来简化,所以学习一下shell.
示例
1 |
|
shell 变量
1 | //注意不能加空格 |
数组
- bash 只支持一维数组。
- shell用小括号表示数组,数组元素用空格分开。
1 | myarray=(1 2 3 4) |
运算符
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | `expr $a + $b` |
- | 减法 | `expr $a - $b` |
* | 乘法 | `expr $a * $b` |
/ | 除法 | `expr $a / $b` |
% | 取余 | `expr $a % $b` |
= | 赋值 | `expr $a = $b` |
== | 相等。 | `expr $a == $b` |
!= | 不相等。 | `expr $a != $b` |
1 | #! /bin/bash |
关系运算符
运算符 | 说明 | 举例 |
---|---|---|
-eq | 相等 | [${a} -eq ${b}] |
-ne | 不相等 | [${a} -ne ${b}] |
-gt | 大于 | [${a} -gt ${b}] |
-lt | 小于 | [${a} -lt ${b}] |
-ge | 大于等于 | [${a} -ge ${b}] |
-le | 小于等于 | [${a} -le ${b}] |
! | 非 | [!false] |
-o | 或 | [${a} -lt 20 -o ${b} -gt 100] |
-a | 与 | [${a} -lt 20 -a ${b} -gt 100] |
|| | 或 | [[${a} -lt 20 || ${b} -gt 100]] |
&& | 与 | [[${a} -lt 20 && ${b} -gt 100]] |
字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否为0,不为0返回 true。 | [ -n $a ] 返回 true。 |
str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
文件测试运算符
运算符 | 说明 | 举例 |
---|---|---|
-b | 是否是块设备文件 | [ -b $file ] |
-c | 是否是字符设备文件 | [ -c $file ] |
-d | 是否是目录 | [ -d $file ] |
-f | 是否是普通文件(既不是目录,也不是设备文件) | [ -f $file ] |
-g | 是否设置了 SGID 位 | [ -g $file ] |
-k | 是否设置了粘着位 | [ -k $file ] |
-p | 是否是有名管道 | [ -p $file ] |
-u | 是否设置了 SUID 位 | [ -u $file ] |
-r | 文件是否可读 | [ -r $file ] |
-w | 是否可写 | [ -w $file ] |
-x | 是否可执行 | [ -x $file ] |
-s | 是否为空 | [ -s $file ] |
-e | 检测文件(包括目录)是否存在 | [ -e $file ] |
流程控制
- shell的流程不可为空。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
num1=$[2*4]
num2=$[1+5]
if test $[num1] -eq 8
then
echo '两个数字相等!'
elif test $[num1] -lt $[num2]
then
echo '两个数字不相等!'
else
echo 'this is else'
fi
array=(1 2 3 4)
for var in ${array[@]}
do
echo ${var}
done
echo "while 测试 1"
var=5
while (( ${var}<=10 ))
do
echo ${var}
var=`expr ${var} + 1`
done
echo "while 测试 2"
var=5
while test ${var} -ne 10
do
echo ${var}
let "var++"
done
echo "while 测试 3"
echo "按下ctrl+d退出"
echo "输入a,b的值,我会帮你输出和"
while read a b
do
if test ${a} -eq 10
then
echo "退出"
break
fi
echo `expr ${a} + ${b}`
done
echo "until 测试 1"
var=0
until test ${var} -eq 10
do
echo ${var}
var=`expr ${var} + 1`
echo ${var}
let "var++"
done
echo "case 测试 1"
var=1
case ${var} in
1)
echo "1"
;;
2)
echo "2"
;;
esac
shell 函数
1 |
|
参数处理 | 说明 |
---|---|
$1 | 显示第一个参数 |
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
文件包含
1 | . test.sh |