没有系统的整理,只是且用且记,以免日后忘了。希望对大家也会有帮助。:)
1.if语句中的或和于语法
if [ "$yn" = "y" ] || [ "$yn" = "Y" ];then
echo "welocme to "
esle
echo "stop"
fi;
2.在文件中查询关键字时,可以不仅仅只显示关键在所在行,而且可以显示关键字所在行的上下n行
cat /etc/list | grep -A 5 xxx 显示xxx所在行及此行之后的5行
cat /etc/list | grep -B 5 xxx 显示xxx所在行及此行之前的5行
cat /etc/list | grep -C 5 xxx 显示xxx所在行及此行之前的5行和此行之后的5行
3.shell脚本中的函数参数传递
例如在脚本中有函数
error()
{
echo "Error is: $1"
}
在调用此函数时只需在脚本中写上
error “can not find /etc/fstab”
其中双引号之间的即为参数,传递到函数中就是$1
4.shell脚本中,函数a调用函数b,a中定义的变量可以自动传递到函数b中,例如
check()
{
RET=$?
if [ $RET -ne 0 ]
then
error "$1"
fi
}
error()
{
echo "Error step : $1"
resault FAILED
exit $RET
}
check中的RET可以传递到error函数中.
5.sed 替换文件中的字符
表达式 描述
/./ 将与包含至少一个字符的任何行匹配
/../ 将与包含至少两个字符的任何行匹配
/^#/ 将与以 '#' 开始的任何行匹配
/^$/ 将与所有空行匹配
/}^/ 将与以 '}'(无空格)结束的任何行匹配
/} *^/ 将与以 '}' 后面跟有零或多个空格结束的任何行匹配
/[abc]/ 将与包含小写 'a'、'b' 或 'c' 的任何行匹配
/^[abc]/ 将与以 'a'、'b' 或 'c'开始的任何行匹配
如果想用shell脚本中的一个变量去替换某个文件中的指定字符,需要在变量上加单引号和双引号,如
sed -i '/DST_IP/s/192.168.29.170/'"$IPADDR"'/g' /root/pktgen_test.sh
例子是将pktgen_test.sh中,DST_IP这一行中的129.168.29.170替换成变量IPADDR所代表的IP地址
如果想得到配置文件中某个参数的值,sed命令如下:
DST_MAC=`sed -n -e '/DST_MAC=/p' pktgen_test.sh | cut -d= -f 2`
如果想得到某一行的第一个字符,则用cut -c1(cut -c1-7),如:
sed -n -e '/Daemon/p' /etc/samhainrc | cut -c1
如果想删除即包含字符串a,又包含字符串b,还包含字符串c的那一行,执行:
sed -i '/#.Daemon.=/d' /etc/samhainrc 该命令是删除包含#,且包含Daemon,且包含=的那一行。
如果想打印包含某个字符串的行的行号:
sed -n -e '/file/=' samhainrc (打印包含file的行号)
如果只打印行号及匹配行,必须使用两个s e d命令,并使用e选项。第一个命令打印模式匹配行,第二个使用=选项打印行号,格式为:
sed -n -e '/file/p' -e '/file/=' samhainrc
使用sed去掉所有行的最后一个字符:
sed 's/.$//'
在第15行前插入一行aaa
sed -i '15i/aaa/' /etc/ais/openais.conf
在第15行后插入一行aaa
sed -i '15a/aaa/' /etc/ais/openais.conf
6.awk 取指定字段
awk '{print $NF}' 取最后一个字段
awk -F: '{print $(NF-1)}' 取最后一个字段之前的一个字段 -F:表示以":"为分隔。
awk '{print $3}' 取第三个字段
spawn passwd [index $argv 1]
expect eof {exit 1}
timeout {exit 2}
"*No such user.*" {exit 3}
"*New password:"
send "[index $argv 2 "
expect eof {exit 4}
timeout {exit 2}
"*Password too long*" {exit 5}
"*Password too short*" {exit 5}
"*Retype ew password:"
send "[index $argv 3] "
expect timeout {exit 2}
"*Mismatch*" {exit 6}
"*Password unchanged*" {exit 7}
" "
expect timeout {exit 2}
"*" {exit 6}
eof
7.expect 应用举例
一个用expect实现交互的更改密码的函数
#!/bin/sh
changepasswd()
{
expect <<- END
spawn passwd $1
expect {
eof {exit 1} #如果执行passwd命令出错,返回1
"New UNIX password: " {send "$2\r"}
"Enter new password: " {send "$2\r"}
"*unkonwn user*" {exit 1}
}
expect {
eof {exit 4}
"Retype new UNIX password: " {send "$2\r"}
"Enter new password: " {send "$2\r"}
}
#一般情况下,修改密码时只用前面的脚本就可以了,但是某些系统对密码的长度做了限制,如果输入的密码不符合要求,就需要第三步继续输入符合要求的密码。
expect {
eof {exit 0}
"Enter new password: " {send "$2\r"}
}
expect eof
exit
END
}
该函数的调用方式是changepasswd $1 $2 ($1是用户名,$2是新密马)
如果想在#!/bin/sh的情况下使用expect,必须:
******
expect <<- END
END
******
也可以写expect的脚本,但是#!/bin/sh需要改成#!/bin/usr/expect
8.shell 脚本中的除法计算
#/bin/sh
num=0
total=4
rate=`echo "scale=2;$num/$total"|bc`
echo $rate
scale表示小数点后保存两位。
9. 加减计算
1)使用赋值语句:
格式:
let 赋值表达式
【tip】赋值表达式可以省略为: ((赋值表达式))
例:给自变量i加1
let i=i+1
或
((i=i+1)) -----------效率高
或
#!/bin/bash
let "t1 = ((a = 5 + 3, b = 7 - 1, c = 15 - 4))"
echo "t1 = $t1, a = $a, b = $b"
2)使用expr命令:
例:给自变量i加1
i=`expr $i + 1` -----------效率低
3)使用bc命令:
bc是UNIX下的计算器,它也可以用在命令行下面:
例:给自变量i加1
i=`echo $i + 1|bc` -----------效率低
※因为bc支持科学计算,所以这种方法功能非常强大
4)整数运算还可以使用整数变量直接进行计算
例如:
typeset -i A=1 B=3
A=A+B -----------效率高
echo $A
结果为4
10.使用select在shell脚本中建立菜单,在脚本rbacpp-config.sh中。一定要有break,否则将会不停的循环。
使用select来创建菜单
#!/bin/bash
PS3='Choose your favorite vegetable: ' # 设置提示符字串.
echo
select vegetable in "beans" "carrots" "potatoes" "onions" "rutabagas"
do
echo
echo "Your favorite veggie is $vegetable."
echo "Yuck!"
echo
break # 如果这里没有 'break' 会发生什么?
done
exit 0
如果忽略了in list列表, 那么select命令将会使用传递到脚本的命令行参数($@), 或者是函数参数(当select是在函数中时).
11.cp命令可以备份
cp -b --suffix=.${DATE}, -b参数表示要备份,--suffix表示备份文件的后缀,在例子中是DATE变量。DATE变量可以设置为DATE=`date +%F-%H-%M`。
如果不加--suffix参数,备份出来的文件是以“~”为后缀的。
12.sed命令也可以备份
sed -i.${DATE} '/\/etc\/init\.d/d' /etc/grsec/learn_config。DATE=`date +%F-%H-%M`
13.给shell脚本传递多个参数
while getopts "rich" opt; do
case $opt in
r ) o_restore=$opt ;;
i ) o_interactive=$opt ;;
c ) o_purge=$opt ;;
h ) o_help=help ;;
* ) o_other=other ;;
esac
done
echo o_restore $o_restore
echo o_interactive $o_interactive
echo o_purge $o_purge
echo o_help $o_help
该方法可以同时传递多个参数给shell脚本,注意,传递参数时要加"-",例如:./test -r -i -h。
14.Shell特殊变量:
命令 意义
$# 传递到脚本的参数个数
$? 前个命令执行情况,0成功,其它值失败
$$ 脚本运行的当前进程号
$! 运行脚本最后一个命令
$* 显示所有传递给脚本的参数。
阅读(1554) | 评论(0) | 转发(0) |