Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304239
  • 博文数量: 26
  • 博客积分: 2052
  • 博客等级: 大尉
  • 技术积分: 686
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-23 22:02
文章分类

全部博文(26)

文章存档

2013年(1)

2011年(1)

2010年(12)

2009年(2)

2008年(10)

我的朋友

分类: LINUX

2010-11-22 13:57:07

没有系统的整理,只是且用且记,以免日后忘了。希望对大家也会有帮助。:)
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成功,其它值失败
    $$                   脚本运行的当前进程号
    $!                   运行脚本最后一个命令
    $*                   显示所有传递给脚本的参数。
阅读(1853) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~