shell脚本学习笔记
删除某几列:awk '{$1=""; $2=""; $3=""; $4=""; $5="";sub(" ", ""); print}' aa.txt >> bb.txt
指定awk的分隔符:cat ff5.txt | awk -F '|' '{print $1,$3}' >> ret33.txt
给镜像打tag #! /usr/bin/env bash deploy_conf=$1 for srcimage in `cat $deploy_conf` do newimage=`echo $srcimage | awk -F '/' '{print $NF}' ` destimage='172.20.5.11/cupid'/$newimage echo $destimage docker tag $srcimage $destimage docker push $destimage done#
#!/bin/bash 不具有适应性,可以改成 #!/usr/bin/env bash,它会到PATH环境变量中找bash
可以用下面的命令查看本机支持的解释器:cat /etc/shells
#!/usr/bin/env bash my() { if [ $# != 2 ] then echo "not equal" else echo "equla" fi } my “$@”
太长使用反斜杠分行,反斜杠前要有空格
./configure \
–prefix=/usr \
–sbin-path=/usr/sbin/nginx \
–conf-path=/etc/nginx/nginx.conf \
在使用"$"来获取变量的时候最好加上双引号
var="*.sh"
echo $var
echo "$var"
他的运行结果如下:
a.sh
*.sh
==实现类似的main函数
#!/usr/bin/env bash func1(){ } func2(){ } main(){ func1 func2 } main "$@"
在没有任何限定说明的情况下,shell默认变量属于全局类型(变量v1的作用域从被定义的地方开始,到shell结束)
函数参数为局部类型,只能在当前函数内部使用。
向文件里写数据
cat>>./temp.conf << EOF log file = /usr/local/logs/rsyncd.log transfer logging = yes log format = %t %a %m %f %b syslog facility = local3 EOF
在脚本里直接执行pwd获得的是当前shell脚本的执行路径,而不是当前脚本的所在路径。应当先cd进当前脚本的目录然后再pwd
===shell中最简单的并行化是通过"&"以及"wait"命令来做:
这里并行的次数不能太多,否则机器会卡死。稍微正确的做法比较复杂,以后再讨论
#!/usr/bin/env bash func() { echo $1 } for((i=0;i<10;i++)) do func $i & done wait echo "oooo"
显示包含"hhh"的行到包含"omc"的行之间的行: sed -n '/hhh/,/omc/p' yum.log
多个变量的替换:find . -name '*.txt' |xargs sed -i "s/233/666/g;s/235/626/g;s/333/616/g;s/233/664/g"
find . -name '*.txt' |xargs -P $(nproc) sed -i "s/233/666/g;s/235/626/g;s/333/616/g;s/233/664/g"
-P参数指定并行度
尽量使用func(){}来定义函数,而不是func{}
尽量使用$()将命令的结果赋给变量,而不是反引号
尽量使用[[]]来代替[]
在复杂的场景下尽量使用printf代替echo进行回显
这些新写法很多功能都比旧的写法要强大,用的时候就知道了。
使用cp -r命令复制文件夹的时候要注意如果目的文件夹不存在则会创建,如果存在则会复制到该文件的子文件夹下
简单的if尽量使用&& ||,写成单行。比如[[ x > 2]] && echo x
============
交互式shell脚本:expect就是一个专门用来实现自动交互功能的工具