推荐的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

添加新评论