2024年简洁的Bash编程技巧文档
[Sun Nov 04 05:35 AM] [kodango@devops] ~/workspace $ sh test.sh --2-- --3-- a: 登录后复制发现a这个变量没有被赋值,为什么呢?因为管道后面的代码是在在一个子shell中执行的,所做的任何更改都不会对当前shell有影响,自然a这个变量就不会有赋值了。
换一种思路,可以这样做:
grep -v 1 /tmp/test.txt > /tmp/test.tmp while read line; do let a++ echo --$line-- done < /tmp/test.tmp echo a:$a rm -f /tmp/test.tmp 登录后复制不过多了一个临时文件,最后还要删除。这里其实可以用到here document:
while read line2; do let b++ echo ??$line2?? done < < EOF `grep -v 1 /tmp/test.txt` EOF echo b: $b 登录后复制here document往往用于需要输出一大段文本的地方,例如脚本的help函数。
删除字符串中的第一个或者最后一个字符:假设字符串为:
[Sun Nov 04 10:21 AM] [kodango@devops] ~/workspace $ str="aremoveb" 登录后复制可能你第一个想法是通过sed或者其它命令来完成这个功能,但是其实有很简单的方法:
[Sun Nov 04 10:24 AM] [kodango@devops] ~/workspace $ echo "${str#?}" removeb [Sun Nov 04 10:24 AM] [kodango@devops] ~/workspace $ echo "${str%?}" aremove 登录后复制类似地,你也可以删除2个、3个、4个……
有没有一次性删除第一个和最后一个字符的方法呢?答案当然是肯定的:
[Sun Nov 04 10:26 AM] [kodango@devops] ~/workspace $ echo "${str:1:-1}" remove 登录后复制关于这些变量替换的内容在bash的man手册中都有说明。
使用逗号join数组元素:假设数组元素没有空格,可以用这种方法:
[Sun Nov 04 10:14 AM] [kodango@devops] ~/workspace $ a=(1 2 3) $ b="${a[*]}" [Sun Nov 04 10:15 AM] [kodango@devops] ~/workspace $ echo ${b// /,} 1,2,3 登录后复制注意:当该数组的长度非常长时,使用这种替换的时间开销很高,性能很差,推荐用sed。
假设数组元素包含有空格,可以借用printf命令来达到:
[Sun Nov 04 10:15 AM] [kodango@devops] ~/workspace $ a=(1 "2 3" 4) [Sun Nov 04 10:15 AM] [kodango@devops] ~/workspace $ printf ",%s" "${a[@]}" | cut -c2- 1,2 3,4 登录后复制 Shell中的多进程:在命令行下,我们会在命令行后面加上&符号来让该命令在后台执行,在shell脚本中,使用"(cmd)"可以让fork一个子shell来执行该命令。利用这两点,可以实现shell的多线程:
job_num=10 function do_work() { echo "Do work.." } for ((i=0; i < job_num ;i++)); do echo "Fork job $i" (do_work) & done wait # wait for all job done echo "All job have been done!" 登录后复制注意最后的wait命令,作用是等待所有子进程结束。
附几则小技巧:
1)sudo iptables -L -n | vim - 2)grep -v xxx | vim - 3)echo $''' 4)set -- 1 2 3; echo "$@" 5)搜索stackoverflow/superuser等站点 6)VIM编辑远程文件 vim scp://xxx//etc/vimrc 7)远程执行脚本 ssh xxx bash < xxx.sh 登录后复制
文章版权声明:除非注明,否则均为泥小猴系统网网络收集而来,如有任何问题请联系站长。