shell编程记录

VIM使用

使用ctags插件看代码特别方便
https://blog.csdn.net/haifeng_gu/article/details/72934188

Shell特殊变量

变量	含义
$0	当前脚本的文件名
$n	传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#	传递给脚本或函数的参数个数。
$*	传递给脚本或函数的所有参数。
$@	传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?	上个命令的退出状态,或函数的返回值。
$$	当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

运算:
1.使用$[]
 最常用的就是$[]方法进行计算,简单方便,适合不太复杂的计算。
x=1
echo $[$x+=1]

2.使用(()) 
使用方法:((表达式1,表达式2,表达式3))
相比上面的方法,(())这种方法略显强大,它的强大之处在于:
1) 支持a++,a--操作(是不是找到C语言的感觉)
2) 支持多个表达式运算,各个表达式之间用“,”分开
3) 双括号可以进行逻辑运算,四则运算
4) 双括号结构 扩展了for,while,if条件测试运算
5) 在双括号结构中,所有变量可以不加入:“$”符号前缀
 
x=1
((y = x + 1,z = y + 1))
echo $z

z=((y = x + 1,z = y + 1))
双括号的提值:c=$((z))   # c=((z))c只能获得表达式

发送email

1.三种常用格式发信

mail -s test admin@aispider.com #第一种方法,你可以把当前shell当成编辑器来用,编辑完内容后Ctrl-D结束

echo “mail content”|mail -s test admin@aispider.com #第二种方法,我用的最多,可能是喜欢管道的缘故吧

mail -s test admin@aispider.com< file #第三种方法,以file的内容为邮件内.容发信

mail -s test  admin@aispider.com < file #第三种方法,以file的内容为邮件内容发信

mail -s test -c admin@aispider.com  root@aispider.com< file #第四种方法,给多个用户发送邮件

2.带附件的邮件

 如果你的系统里没有uuencode命令的话,请先安装sharutils(yum install  -y sharutils)

 uuencode 需要两个参数,第一个是你要发送的文件(们),当然这个也可以用管道来做,第二个是显示的文件名

 uuencode /home/yfang/a.gif a.gif|mail -s pictest admin@aispider.com

tar czf - /home/yfang/ | uuencode home.tgz |mail -s pictest admin@aispider.com

ps: 顺便补一句,slackware下的mail好像有一个-a参数,可以直接添加附件,我没有用过。

continue结束本次循环,而break是跳出循环,要分清楚

[root@congji shell]# cat continue.sh 

#/bin/bash
for i in `seq 1 5`
do 
    echo $i
	if [ $i -eq 3 ]
        then
           continue
        fi
        echo $i
done

[root@congji shell]# sh continue.sh 
1
1
2
2
3
4
4
5
5


[root@congji shell]# cat break.sh 

#/bin/bash
for i in `seq 1 5`
do 
     echo $i
if [ $i == 3 ]
    then
       break
fi
    echo $i
done

[root@congji shell]# sh break.sh 
1
1
2
2
3

对比两个脚本我们可以发现,break相当于跳出循环,结束。而continue相当于结束本次循环,开始新的循环,

shell命令之间的关系

1.分号";"
command1 ; command2
命令之间没有逻辑关系。分号连接的命令会按照顺序从前向后依次执行,但分号两端的命令之间没有任何逻辑关系,所有写出来的命令最终都会被执行,即使分号前面的命令出错也不影响后面的命令。
2.&&
command1  &&  command2
逻辑与。&&连接的命令会按照顺序从前向后执行,但只有当command1正确执行才执行command2,如果command1不正确执行,则不执行command2。在bash中,通过预定义变量“$?”来判断命令是否正确执行,如果"$?"的值为0则表示前一条命令正确执行,其他任意值都表示不正确执行。
3.||
command1 || command2
逻辑或。||连接的命令会按照顺序从前向后执行,但只有当command1不正确执行才执行command2,command1正确执行则不会执行command2。||和&&都是短路符号,符号左右的命令之间具有逻辑关系。

一般要联合使用&&和||的时候,基本上都会先逻辑与再逻辑或:command1 && command2 || command3。因为在实际中,command2和command3应该都是想要执行的命令。如果command1正确执行,$?就等于0,执行command2,再看情况执行command3,如果command1错误执行,$?就不等于0,所以不执行command2,根据$?为非0值,判断了 || 右边的命令应该被执行。
通俗点的理解方法是根据语义判断。“如果...就...否则...就...”的语句使用“cmd1 && cmd2 || cmd3”,“如果不...就...否则...就...”使用“!cmd1 && cmd2 || cmd3”。
例如,如果用户user1存在,就显示用户已经存在,否则,就添加此用户。
[root@xuexi tmp]# id user1 && echo "user1 exists" || useradd user1
如果用户user2不存在,则添加此用户,否则显示用户已存在。
[root@xuexi tmp]# !id user2 && useradd user2 || echo "user2 exists"
如果用户user3不存在,则添加此用户,并设定其密码为用户名本身,否则显示用户已存在。
[root@xuexi tmp]# !id user3 && useradd user3 && echo "user3" | passwd --stdin user3 || echo "user3 exists"


4.&
command1 &
command1 & command2
&表示将其前面的命令放入后台执行,放入后台后会立即返回到bash环境让用户可以继续和bash交互。如果&符号连接了两个命令,则其前面的命令被放入后台,立即执行后面的命令,所以可以简单地认为这两个命令是并行执行的,两端的命令之间也没有任何逻辑关系。
需要注意的一点是,在终端的bash环境下,子shell中的后台的进程不受终端控制,在终端被关闭时它会挂靠在init/systemd进程下,!!!因此退出终端或脚本shell环境,无法中断这些后台进程。!!!

注释

<<'COMMENT'
...
...
COMMENT

shell文件名,路径

basename
从文件名中去掉路径信息, 只打印出文件名
$0
$0显示会包括当前脚本或命令的路径
dirname
从带路径的文件名中去掉文件名, 只打印出路径信息.

awk去除指定符号

cat aa | awk '{gsub(/\[/, "");print}' | awk '{gsub(/\]/, "");print}'   #去除[ ]符号
cat avg_w_out-avg | awk '{for(i=1;i<=NF;++i){a[i]+=$i}}1;END{print "-avg-";for(x in a){printf "%s",a[x]/NR" "}print ""}'   #输出每行,且按列求平均
cat avg_w_out-avg | awk '{for(i=1;i<=NF;++i){a[i]+=$i}};END{print "-avg-";for(x in a){printf "%s",a[x]/NR" "}print ""}'   #输出按列平均

字符串切分


#!/bin/bash
 
string="hello,shell,split,test"  
array=(${string//,/ })  
 
for var in ${array[@]}
do
   echo $var
done

wget

wget -r -np -nH -R index.html  {afs-地址}

sort 关于字符的处理
参考资料:23 Sort does not sort in normal order!

sort 在对字符排序时出现乱序
因为本地的 $LANG 变量 = "en_US.UTF-8" ,sort排序时会忽略符号再排序
在sort排序前设置 变量 LC_ALL=C
LC_ALL=C sort -k1,1 file > file_sort
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值