Chinaunix首页 | 论坛 | 博客
  • 博客访问: 123052
  • 博文数量: 25
  • 博客积分: 1436
  • 博客等级: 上尉
  • 技术积分: 256
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-17 10:10
文章分类

全部博文(25)

文章存档

2016年(1)

2015年(5)

2012年(1)

2011年(3)

2010年(6)

2009年(8)

2008年(1)

我的朋友

分类: LINUX

2010-01-28 15:49:58

SHELL

A.字符操作

1. 得到长度
x="abcd"
方法一:expr length $x  方法二: expr "$x" : ".*"

2. 查找子串的位置
x="abcd"
expr index $x "b"

3. 得到子串
x="abcdefgh"
expr substr "$x" 2 6    结果是:bcdef

4. 截取
方法一:
echo $a|cut -d',' -f3
cut:对标准输入的字符串进行处理
cut -bn-m:以byte为单位,从第n个byte开始,取m个
cut -bn,m:以byte为单位,截取第n,m个byte
cut -b-n,m:以byte为单位,截取1-n,和第m个
-c:以charactor为单位
-d:指定分隔符,默认为tab
-s:使标准输入中没有delimeter
cut -f1:截取第1个域
方法二:
expr substr “$a” 1 8    #  截取$a中的1到8个字符。
方法三:
${varible##*string} 从左向右截取最后一个string之后的字符串。
${varible%%string*} 从右向左截取最后一个string之后的字符串。
${varible#*string} 从左向右截取第一个string之后的字符串
${varible%string*} 从右向左截取第一个string之后的字符串

5. grep 参数介绍
grep -c 只输出匹配的行数。
grep -i 忽略大小写
grep -h 查询多文件时不显示文件名。
grep -H 显示文件名。
grep -l 查询多文件时只输出包含匹配字符的文件名。
grep -n 显示匹配行及行号。
grep -s 不显示不存在或不匹配文本的错误信息。
grep -v 显示不包含匹配文本的所有行。
grep -A NUM pattern filename   打印匹配行和之后的NUM行
grep -B NUM pattern filename   打印匹配行和之前的NUM行
grep -A NUM pattern filename   打印匹配行和前后的NUM行

[[:upper:]]    相当于[A-Z]
[[:lower:]]    相当于[a-z]
[[:alnum:]]    相当于[0-9a-zA-Z]
[[:digit:]]    相当于[0-9]
[[:alpha:]]    相当于[a-zA-Z]
[[:space:]]    相当于空格或tab健

5.1 grep实例
   ps | grep -v grep | grep 'httpd\(.*\)-p 1010'


6. awk和eval组合把一段有规律的字符串划分为若干个变量。
   eval `echo "$FORM_chkbox" | awk -F@ '{printf "y1=%s\ny2=%s\n",$1,$2}'`
   eval `echo "$FORM_chkbox" | awk -F@ '{printf "y1=%s y2=%s\n",$1,$2}'`
   实例:
   value="Long:/usb1-disk2/SAMBA/"
   eval $(echo $value | awk -F: '{printf "name=%s\npath=%s\n",$1,$2}')
6.1. awk实例
ifconfig eth0 | awk '$2~/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/'

7. eval 函数可以把两字符串重组然后再变成一个变量。
    a=123
    b=-----------2345
    eval temp=$a$b
    zhong123=adsfjsdgjsdjfgjksldjf
    eval temp1="zhong"$a
    eval temp2="$zhong"$a
    eval temp3="$""zhong"$a
    echo $temp                            //结果是:123-----------2345
    echo "$temp1"                        //结果是:zhong123
    echo "$temp2"                        //结果是:123          因为$zhong不存在

。所以结果只有$a的值。
    echo "$temp3"                        //结果是:adsfjsdgjsdjfgjksldjf            

这正是我想要的结果。

8.sed技巧
    sed 's@^/lib/ld-linux.so.2@/tools&@g'         ### "@" is a separate symbol.
    sed 's:/usr/local/bin:/bin:' configure.bak > configure    ### ":" is a separate.
    sed -e "$"d            ### remove the last line.
    $ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就

是说,如果某一行开头的test被替换成mytest,就打印它。
    $ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以

192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。

9.sed 实例
9.1. 替换文件中的内容。
    path=\/usb1-disk1\/Download\/Bt
    a=$(sed -n "/Btstorepath=/=" usbnas.conf)
    sed -i -e "$a i\Btstorepath=$path" -e "$a"d usbnas.conf
或:
    path=/usb1-disk1/
    sed -i -e "/Btstorepath/i\Btstorepath=$path" -e "/Btstorepath/"d usbnas.conf

9.2. 替换文件中的内容。
    sed -i "s/runbtdownload.*/runbtdownload=yes/" usbnas.conf
    sed -i "s|Btstorepath=.*\(.*\)|Btstorepath=\1$path|" usbnas.conf
    sed -i "s|$variable=.*\(.*\)|$variable=\1$value|" usbnas.conf

B.shell 中固定次数的for循环。
1. n=10
   for i in `seq $n`
   do
   echo "$i"
   done

2.read和while结合用法
    #!/bin/sh
    logfile="/sdb/path.list"

    while read t1 t2 t3        ### read one line once, and each line has three elements, so

here use three                     ###variables to contain the three elements.
    do
    echo [$t1] >> /etc/smb.conf
    echo "        comment="$discription"" >>  /etc/smb.conf
    echo "        path = "$t3"        " >>  /etc/smb.conf
    echo "        valid users = "$t2"" >>  /etc/smb.conf
    echo "    
    done  < $logfile        ### use standard input( < ) to input.

C. 创建swap文件
   cd /rdisk0/disk1/usb1-disk1
   dd if=/dev/zero of=./swapfile bs=1M count=64
   mkswap swapfile
   swapon swapfile    #turn on swap
   swapoff swapfile    #turn off swap

D.cp和mv技巧。
    cp configure{,.bak}        ### cp configure configure.bak
    mv configure{,.bak}        ### mv configure configure.bak

E. Shell函数返回值的方法
1. echo 法
    #!/bin/bash
    #  echo法,返回一个字符串的长度
    varCnt()
    {
      var=$1   ret=0
      if [ "$var" != "" ] ; then
        ret=${#var}  
      fi
      echo $ret
    }

    main()
    {
      printf "varCnt's 's return value is %s "  `varCnt ""`
      printf "varCnt's 's return value is %s "  `varCnt "1234"`
    }
    
    main
    exit
2. 全局变量法
声明一个全局变量 declare -i g_ret ,在function的返回值存储在全局变量中。调用处在函数执行完后,使用就可以

了.
#!/bin/bash
declare -i g_ret=0
varCntGlobeVar()
{
  var=$1  
  if [ "$var" != "" ] ; then
    g_ret=${#var}      #返回一个字符串的长度
  fi
}

main()
{
  varCntGlobeVar ""
  printf "varCntGlobeVar's 's return value is %d "  $g_ret
  varCntGlobeVar "1234"
  printf "varCntGlobeVar's 's return value is %d "  $g_ret
}

main
exit

F. case 在shell中的用法
case $str in
   "en")
        /usr/sbin/httpd -p 1010 -h /www
        ;;
   "sp")
        /usr/sbin/httpd -p 1010 -h /sp_www
        ;;
   "cn")
        /usr/sbin/httpd -p 1010 -h /cn_www
        ;;
      *)
        /usr/sbin/httpd -p 1010 -h /www
        ;;
esac

E 在vi中的命令
:set mouse=a 就可以使用鼠标了。
阅读(741) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-12 17:49:02

对楼主 "E. Shell函数返回值的方法 "的补充: 3.通过echo $val 给一个全局变量修改值。 a=1 test(){ a=15 echo $a } a=`test` echo "$a" #result is 15;