shell脚本学习笔记

删除某几列:awk '{$1=""; $2=""; $3=""; $4=""; $5="";sub("     ", ""); print}' aa.txt >> bb.txt

指定awk的分隔符:cat ff5.txt | awk -F '|' '{print $1,$3}' >> ret33.txt

#!/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就是一个专门用来实现自动交互功能的工具

原文地址:https://www.cnblogs.com/testzcy/p/12516882.html