linuxshell 读书笔记三 (unix shell 第三版)

[xep@localhost ~]$ cat -n casewhen_script
     1  #! /bin/bash
     2  #  check data display datatype
     3
     4  declare char=""
     5  data=""
     6  if [ $# -ne 1 ] ; then
     7     echo "please input one parameter !"
     8     exit 1
     9  fi
    10
    11  char=$1
    12
    13  data=$(echo "$char" | wc -c )
    14  #echo $data
    15  if [ $data -ne 1 ]
    16   then
    17     echo "please input one char !"
    18     exit 2
    19  fi
    20
    21  case $char in
    22  [a-z] )    echo "your input datatype is lower char";;
    23  [A-Z] )    echo "your input datatype is upper char";;
    24  [0-9] )    echo "your input datatype is number";;
    25  * )        echo "your input datatype is other";;
    26  esac
    27  exit 0
    28
    
修改脚本属性  测试结果
[xep@localhost ~]$ ./casewhen_script 1
please input one char !

--试了好几次 输入了单个字符,一调试才知道 让书给忽悠了

[xep@localhost ~]$ sh -x ./casewhen_script 1
+ declare char=
+ data=
+ '[' 1 -ne 1 ']'
+ char=1
++ echo 1
++ wc -c
+ data=2
+ '[' 2 -ne 1 ']'
+ echo 'please input one char !'
please input one char !
+ exit 2

--data居然是2 按书上写的意思是echo将输入字符1与回车一起给了wc命令
--把脚本的第15的1改成2试试

[xep@localhost ~]$ ./casewhen_script -
your input datatype is number

--for demo
[xep@localhost ~]$ cat -n for1_script
     1  #! /bin/bash
     2  #  display user input parameter
     3
     4  for i in $*
     5  do
     6    echo "$i"
     7
     8  done

[xep@localhost ~]$ cat -n for_script
     1  #! /bin/bash
     2  #  display user input parameter
     3
     4  for i in $*   # $@与$*效果类似 
     5  do
     6    echo $1
     7    shift
     8  done

--两个脚本完成的功能是一样的 输出用户输入的信息
--for 中支持文件名替换  for i in demo[1-4] 循环四次
--for i in $(cat filelist) ...


[xep@localhost ~]$ cat -n for2_script
     1  #! /bin/bash
     2  #  display user input parameter
     3
     4  for i
     5  do
     6    echo $1
     7    shift
     8  done

[xep@localhost ~]$ ./for2_script ss uu 'xx uu ' mm
ss
uu
xx uu
mm

--以上代码只有一个 for i  shell默认是把输入的参数补在for 后 in $@

[xep@localhost ~]$ cat -n mon_script             
     1  #! /bin/bash                             
     2  #wait until a specified user logs on      
     3                                           
     4  if [ "$#" -ne 1 ]                        
     5  then                                     
     6     echo "Usage:mon user"                 
     7     exit 1                                
     8  fi                                       
     9                                           
    10  user=$1                                  
    11  until who | grep "^$user " > /dev/null   
    12  do                                       
    13    sleep 60                               
    14  done                                     
    15                                           
    16  echo "$user has logged on"
    
--测试 说明 用until循环监视某用户是否登录 
--登录后显示
                  
[xep@localhost ~]$ cat -n mon1_script            
     1  #! /bin/bash                             
     2  #wait until a specified user logs on     
     3                                           
     4                                           
     5  if [ "$1" = -m ]                         
     6  then                                     
     7    mailopt=TRUE                           
     8    shift                                  
     9  else                                     
    10    mailopt-FALSE                          
    11  fi                                       
    12                                           
    13  echo "there are $# parameters"           
    14                                           
    15  if [ "$#" -eq 0 -o "$#" -gt 1 ]          
    16  then                                     
    17     echo "Usage:mon [-m] user"            
    18     echo "-m means to be informed by mail"
    19                                           
    20  fi                                       
    21                                           
    22  user=$1                                  
    23                                           
    24  until who | grep "^$user " > /dev/null   
    25  do                                       
    26    sleep 60                               
    27  done                                     
    28                                           
    29  if [ "$mailopt" = FALSE ]                
    30   then                                    
    31     echo "$user has logged on"            
    32  else                                     
    33     echo "$user has logged on "|mail xep  
    34  fi                                       
    35  exit 0
    
--测试 加了-m 参数 这样可以放在后台执行 用户登录后,把mail发给xep
--./mon1_script -m yp &
--把程序放在后台执行 只需要在后面加上& 这样当前终端是活动的
--当所有监视的用户登录后,会显示有一邮件

--对mon_script修改一版 加上可指定的option 等待的时长
[xep@localhost ~]$ cat -n mon2_script
     1  #! /bin/bash
     2  #  wait until a specified user logs on
     3
     4  mailopt=false
     5  interval=60
     6
     7  while getopts mt: option
     8  do
     9    case "$option" in
    10  m) mailopt=TRUE;;
    11  t) interval=$OPTARG;;
    12  \?) echo "Usage: mon_3script [-m] [-t n] user"
    13      echo "-m means to be informed by mail"
    14      echo "-t means check every n sesc."
    15      exit 1 ;;
    16  esac
    17  done
    18
    19  if [ "$OPTIND" -gt "$#" ]
    20  then
    21     echo "Missing user name!"
    22     exit 2
    23  fi
    24
    25  shiftcount=$((OPTIND - 1))
    26  shift $shiftcount
    27
    28  user=$1
    29
    30  until who | grep "^$user ">/dev/null
    31  do
    32     sleep $interval
    33  done
    34
    35  if [ "$mailopt" =FALSE ]
    36  then
    37     echo "$user has logged on"
    38  else
    39     runner=$(who am i | cut -c1-8)
    40     echo "$user has logged on " | mail $runner
    41  fi

--调试结果
[xep@localhost ~]$ sh -x ./mon2_script -m -t 10 yp &
[2] 14900
[xep@localhost ~]$ + mailopt=false
+ interval=60
+ getopts mt: option
+ case "$option" in
+ mailopt=TRUE
+ getopts mt: option
+ case "$option" in
+ interval=10
+ getopts mt: option
+ '[' 4 -gt 4 ']'
+ shiftcount=3
+ shift 3
+ user=yp
+ who
+ grep '^yp '
+ '[' TRUE =FALSE ']'
./mon2_script: line 35: [: TRUE: unary operator expected
++ who am i
++ cut -c1-8
+ runner='xep     '
+ echo 'yp has logged on '
+ mail xep


You have new mail in /var/spool/mail/xep
[2]+  Done                    sh -x ./mon2_script -m -t 10 yp


--getopts是shell的内部命令 作用是处理命令行参数
--格式:getopts options variable
--说明:getopts在循环中运行,每次循环getopts去检查命令行的参数,并判断是否合法
--判断方法是参数是否已减号开头,后面跟一个在options中存在的字母,如果存在就把匹配
--options的字母存在 variable中并返回退出状态0,否则存入variable中一问号,并返回退出
--状态0,向标准输出写入一条错误信息
--具体options用法 搜一下吧

#!/bin/bash
boy=""
girl=""
nothing=""
help=""
while getopts b:g:nh OPT
do
         case $OPT in
         b)
          boy="$OPTARG"
        ;;
         g)
          girl="$OPTARG"
        ;;
         n)
           nothing=y
        ;;
         h)
          echo "$0 -b boyname -g girlname"
         help=y
        ;;
        *)
         echo "Please use -h option to see useage"
         esac
done

if [[ -n "$nothing" ]]
then
         echo "Nothing to do~"
elif [[ -n "$boy" && -n "$girl" ]]
then
         echo "$boy love $girl for ever !!!"
elif [[ -z "$help" ]]
then
         echo "$0 -b boyname -g girlname"
else
         echo "Retry"
fi
 
--朋友发的小例子    测试一下 
[xep@localhost ~]$ ./getopts_script -b yp -g wp
yp love wp for ever !!!

[xep@localhost ~]$ ./getopts_script -h
./getopts_script -b boyname -g girlname
Retry

[xep@localhost ~]$ ./getopts_script -n
./getopts_script: illegal option -- n
Please use -h option to see useage
./getopts_script -b boyname -g girlname

[xep@localhost ~]$ ./getopts_script -h
./getopts_script -b boyname -g girlname
Retry
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值