shell 编程
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 |
|
| 参数处理 | 说明 |
|---|---|
| $# | 传递到脚本的参数个数 |
| $* | 以一个单字符串显示所有向脚本传递的参数 |
| $$ | 脚本运行的当前进程ID号 |
| $! | 后台运行的最后一个进程的ID号 |
| $@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
| $- | 显示Shell使用的当前选项,与set命令功能相同。 |
| $? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
文件包含
1 | . test.sh |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 这里是文耀的space!
