shell 编程
1. echo 参数
- -n 不换行(默认换行)
- -e 使得转移字符有效
例子
ss='abc\n' echo -e $ss abc #换行起作用 echo $ss abc
2. 赋值
2.1 =左右两侧不要带空格
a = "hello" #错误 a="hello"
2.2 左边变量名不可加$
$a='134' [jihite] $a=$a'abc' [jihite] $echo a a [jihite] $echo $a 134abc
3. shell运算
b=4 let "c=$b+1" echo $c
小例
i=9000 while [ $i -lt 9010 ] do let "i=$i+1" echo $i done
9001 9002 9003 9004 9005 9006 9007 9008 9009 9010
4. 单引号和双引号区别
单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外。
举例
bb="hello" echo "$bb" hello echo '$bb' $bb
注意ecoh -e '$bb' 结果还是$bb,因为'$bb'就是字面值,不会转义。
5. 数组
5.1 声明、定义
- array['a']=1
- array=('a', 'b')
- array=([1]='a' [2]='b')
5.2 访问
- echo ${array['a']}
- echo ${array[0]}
5.3 遍历
for var in ${array[*]} do echo $var done
5.4 数组长度
num=${#array[@]}
对比:获取字符串长度:num=${#str}
6. Linux shell实现多线程
for ((i=0;i<5;i++)); do { sleep 3; echo "hello" $i } done wait
对比
for ((i=0;i<5;i++)); do { sleep 3; echo "hello" $i }& done wait
这个在上面的基础上多加了一个后台执行&符号,此时5个循环任务并发执行,最后需要3s多一点的时间(效果非常明显)。wait的作用是完成后台所有的任务后才往下执行,否则程序本身会等待。
7. 去除一行最后的'\r'
字符串最后有个'\r'是非常恶心的,可以通过tr命令去掉
a="hello\r" echo $a | tr -d '\r' hello\r echo $a | tr -d "\r" hello\r echo -e $a | tr -d '\r' hello #转移字符起作用 echo -e $a | tr -d "\r" hello
8. 编译shell文件
bash -x ***.sh
+开头的是编译的中间过程,不带+的为正常的输出。效果非常明显。
9. if else
#!/bin/bash proc=$1 proc_num=`ps -ef | grep root | grep $proc | wc -l` echo $proc_num if [ $proc_num = 2 ] then exit 0 else exit 2 fi
注:if [ con ], 条件con和[]之间有空格
- -ne —比较两个参数是否不相等
- -lt —参数1是否小于参数2
- -le —参数1是否小于等于参数2
- -gt —参数1是否大于参数2
- -ge —参数1是否大于等于参数2
e.g. if [ $proc_num -gt 1 ]
以上为数字的比较,字符串的比较用'='、'!='。e.g.
rev=$(cat /etc/ld.so.conf | grep usr/local/lib) if [[ $rev != '/usr/local/lib' ]] then echo "hello" fi
10. for循环
例1:
- sleep 1 睡眠1秒
- sleep 1s 睡眠1秒
- sleep 1m 睡眠1分
- sleep 1h 睡眠1小时
例如:以下shell脚本每隔10秒钟就打印出“Hell, dansir”
#!/bin/shell while true do echo "Hello, dansir" sleep 10s done
例2:
ids=" 123 456 789" for i in $ids do echo $i done
执行
$sh del.sh 123 456 789
11. 执行变量里的命令
$(eval echo $v_endcomm)