shell笔记
推荐的shell教程:http://c.biancheng.net/view/706.html
获取前一个命令结果的第X行第X列的值
#第5行的第2行
ls -l | awk '{print $2}' | sed -n '5p'
重启进程脚本
#! /bin/bash
PID=`ps aux| grep "weixinmsgtask send" |grep -v 'grep weixinmsgtask send' | awk '{print $2}' | sed -n '1p'`
echo "PID: ${PID}"
if [[ $PID -gt 0 ]]; then
echo -e "kill -9 -${PID}\n"
kill -9 -${PID} | /web/tell/protected/yiic weixinmsgtask unlock
echo -e "Process ended, and unlocked\n"
fi
test命令
test 命令有很多选项,可以进行数值、字符串和文件三个方面的检测.
相关参数可参考:http://c.biancheng.net/view/2742.html
Shell test 命令的用法为:
test expression
#test 命令也可以简写为[],它的用法为:
[ expression ]
#注意[]和expression之间的空格,这两个空格是必须的, test 和 [] 是等价的, []的写法更加简洁,比 test 使用频率高
请注意,==、>、< 在大部分编程语言中都用来比较数字,而在 Shell 中,它们只能用来比较字符串,不能比较数字,这是非常奇葩的,大家要习惯。
其次,不管是比较数字还是字符串,Shell 都不支持 >= 和 <= 运算符,切记
常用比较
num1 -eq num2 判断 num1 是否和 num2 相等。
num1 -ne num2 判断 num1 是否和 num2 不相等。
num1 -gt num2 判断 num1 是否大于 num2 。
num1 -lt num2 判断 num1 是否小于 num2。
num1 -ge num2 判断 num1 是否大于等于 num2。
num1 -le num2 判断 num1 是否小于等于 num2。
-z str 判断字符串 str 是否为空。
-n str 判断宇符串 str 是否为非空。
str1 = str2
str1 == str2 =和==是等价的,都用来判断 str1 是否和 str2 相等。
str1 != str2 判断 str1 是否和 str2 不相等。
str1 \> str2 判断 str1 是否大于 str2。\>是>的转义字符,这样写是为了防止>被误认为成重定向运算符。
str1 \< str2 判断 str1 是否小于 str2。同样,\<也是转义字符。
几乎完全兼容 test ,并且比 test 更加强大,比 test 更加灵活的是[[ ]];[[ ]]不是命令,而是 Shell 关键字
[[ ]] 语法
test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;test 做不到的,[[ ]] 还能做到。可以认为 [[ ]] 是 test 的升级版,对细节进行了优化,并且扩展了一些功能。
[[ expression ]]
当 [[ ]] 判断 expression 成立时,退出状态为 0,否则为非 0 值。注意[[ ]]和expression之间的空格,这两个空格是必须的
[[ ]] 是 Shell 内置关键字,不是命令,在使用时没有给函数传递参数的过程,所以 test 命令的某些注意事项在 [[ ]] 中就不存在了,具体包括:
- 不需要把变量名用双引号""包围起来,即使变量是空值,也不会出错。
- 不需要、也不能对 >、< 进行转义,转义后会出错。
注意,[[ ]] 剔除了 test 命令的-o和-a选项,你只能使用 || 和 &&。
[[ ]] 支持正则表达式
[[ str =~ regex ]]
有了 [[ ]],你还有什么理由使用 test 或者 [ ],[[ ]] 完全可以替代之,而且更加方便,更加强大。
但是 [[ ]] 对数字的比较仍然不友好,所以我建议,以后大家使用 if 判断条件时,用 (()) 来处理整型数字,用 [[ ]] 来处理字符串或者文件。
(( )) 的用法
双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令。
注意:(( )) 只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。 bc 命令可以用于小数运算。
((表达式))
表达式可以只有一个,也可以有多个,多个表达式之间以逗号,分隔。对于多个表达式的情况,以最后一个表达式的值作为整个 (( )) 命令的执行结果。
可以使用$获取 (( )) 命令的结果,这和使用$获得变量值是类似的。
运算操作符/运算命令 说明
((a=10+66)
((b=a-15))
((c=a+b))
这种写法可以在计算完成后给变量赋值。以 ((b=a-15)) 为例,即将 a-15 的运算结果赋值给变量 c。
注意,使用变量时不用加$前缀,(( )) 会自动解析变量名。
a=$((10+66)
b=$((a-15))
c=$((a+b))
可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=$((a+b)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。
注意,类似 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果。
((a>7 && b==c)) (( )) 也可以进行逻辑运算,在 if 语句中常会使用逻辑运算。
echo $((a+10)) 需要立即输出表达式的运算结果时,可以在 (( )) 前面加$符号。
((a=3+5, b=a+10)) 对多个表达式同时进行计算。
去掉换行符
可以利用管道符 | tr -d '\n' 去掉换行符
kubectl version | base64 | tr -d '\n'
base64编码
echo 123 | base64
生成随机密码
date +%s | sha256sum | base64 | head -c 32 ; echo
#YzVjNjg0YWNkMTJlMmU2YjdiMjM2NWI4
< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;
#nOT5RKplZ689lcwbwLB9PTMnZ8VDwLzt
openssl rand -base64 32
#APl8Zv5Y8BJnI/kpqXcmh3YuUejIgr+0fz/TA+oDBQg=
tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1
#bazTHhoGkq0rn5GPTTbMkZpCWKUVOF
strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo
#u1g3IgBpACnvvcS329YPH7Z896PA2k
< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6
#Djo_8F
dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev
#MXD3KvG5snnfIJ8FRmXC9Iyh+vBrt+a2usaZ2EUpPDc
</dev/urandom tr -dc '12345!@#$%qwertQWERTasdfgASDFGzxcvbZXCVB' | head -c8; echo ""
#eeZssXs%
randpw(){ < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-16};echo;}
#这里创建了一个函数,执行这条命令以后,可以直接使用 randpw 命令显示一个随机字符串,可以保存到.bashrc 中
#rPjx0ebwzFpaBwL0
date | md5sum
#95ab2c81968e94b80ac29c57535b0a11 -
检查域名A记录
dig -t A www.baidu.com +short