[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
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