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