本笔记主要是记录一些shell中使用的重要知识点,方便以后查询。
1. 关于编写shell脚本的良好习惯
--列出脚本的功能
--列出脚本的版本资讯
--列出脚本的作者和联系方式
--列出脚本的修改记录
--提前设置环境变量
--在特殊的代码位置,加上注释,方便别人查看
注意:以上建议只是参考了别人的说法,具体使用与否请根据实际情况而定。
2. 利用read命令获取用户的输入信息
1 read -p "请输入一个值:" var 2 3 echo $var
使用者输入的信息将会保存到变量var中。
3. 利用date命令获取日期
1 date1=$(date --date='2 days ago' +%Y%m%d) # 前两天的日期 2 date2=$(date --date='1 days ago' +%Y%m%d) # 前一天的日期 3 date3=$(date +%Y%m%d) # 今天的日期
4. 在shell中做数学计算
1 read -p "first number: " firstnu 2 read -p "second number: " secnu 3 total=$(($firstnu*$secnu)) # 注意是两个括号 4 echo $total
还有一种方式,如下:
1 declare -i total=$firstnu*$secnu 2 echo $total
但推荐第一种方式,$(( ))。
5. 使用test命令做判断
使用格式:test -option filename
1 判断用户是否输入信息,-z用于判断字符串的长度是否为0: 2 read -p "Input a filename : " filename 3 test -z $filename && echo "You MUST input a filename." && exit 0 4 5 判断文件是否存在: 6 test ! -e $filename && echo "The filename '$filename' DO NOT exist" && exit 0 7 8 判断文件的类型和权限(对于当前用户的权限) 9 test -f $filename && filetype="regulare file" 10 test -d $filename && filetype="directory" 11 test -r $filename && perm="readable" 12 test -w $filename && perm="$perm writable" 13 test -x $filename && perm="$perm executable"
6. 使用中括号[]做判断
1 read -p "Please input (Y/N): " yn 2 [ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK, continue" && exit 0 3 [ "$yn" == "N" -o "$yn" == "n" ] && echo "Oh, interrupt!" && exit 0 4 5 这里的-o表示或的意思。
7. 关于脚本参数
1 echo "The script name is ==> $0"
2 echo "Total parameter number is ==> $#"
3 [ "$#" -lt 2 ] && echo "The number of parameter is less than 2. Stop here." && exit 0
4
5 echo "Your whole parameter is ==> '$@'"
6 echo "The 1st parameter ==> $1"
7 echo "The 2nd parameter ==> $2"
8
9 执行结果:
10 [root@www scripts]# sh sh07.sh theone haha quot
11 The script name is ==> sh07.sh <==档名
12 Total parameter number is ==> 3 <==果然有三个参数
13
14 Your whole parameter is ==> 'theone haha quot' <==参数的内容全部
15 The 1st parameter ==> theone <==第一个参数
16 The 2nd parameter ==> haha <==第二个参数
1 关于shift命令的作用,主要是移除脚本的参数: 2 echo "Total parameter number is ==> $#" 3 echo "Your whole parameter is ==> '$@'" 4 5 shift # 进行第一次‘一个参数的 shift ’ 6 7 echo "Total parameter number is ==> $#" 8 echo "Your whole parameter is ==> '$@'" 9 10 shift 3 # 进行第二次‘三个参数的 shift ’ 11 12 echo "Total parameter number is ==> $#" 13 echo "Your whole parameter is ==> '$@'"
8. 条件判断
1 read -p "Please input (Y/N): " yn 2 3 if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then 4 echo "OK, continue" 5 exit 0 6 fi 7 if [ "$yn" == "N" ] || [ "$yn" == "n" ]; then 8 echo "Oh, interrupt!" 9 exit 0 10 fi
多重复杂的条件判断:
1 read -p "Please input (Y/N): " yn 2 3 if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then 4 echo "OK, continue" 5 elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then 6 echo "Oh, interrupt!" 7 else 8 echo "I don't know what your choice is" 9 fi
参数的内容判断:
1 if [ "$1" == "hello" ]; then 2 echo "Hello, how are you ?" 3 elif [ "$1" == "" ]; then 4 echo "You MUST input parameters, ex> {$0 someword}" 5 else 6 echo "The only parameter is 'hello', ex> {$0 hello}" 7 fi
关于网络服务检测:
1 testing=$(netstat -tuln | grep ":80 ") # 查看 port 80 在否? 2 3 if [ "$testing" != "" ]; then 4 echo "WWW is running in your system." 5 fi 6 testing=$(netstat -tuln | grep ":22 ") # 查看 port 22 在否? 7 if [ "$testing" != "" ]; then 8 echo "SSH is running in your system." 9 fi
综合使用:
1 read -p "Please input your demobilization date (YYYYMMDD ex>20090401): " date2 2 3 4 # 2. 测试一下,这个输入的内容是否正确?利用正规表示法啰~ 5 date_d=$(echo $date2 |grep '[0-9]{8}') # 看看是否有八个数字 6 if [ "$date_d" == "" ]; then 7 echo "You input the wrong date format...." 8 exit 1 9 fi
9. case语句
1 case $1 in # 现在使用,可以用上面两行替换! 2 "one") 3 echo "Your choice is ONE" 4 ;; 5 "two") 6 echo "Your choice is TWO" 7 ;; 8 "three") 9 echo "Your choice is THREE" 10 ;; 11 *) 12 echo "Usage $0 {one|two|three}" 13 ;; 14 esac
10. 在case中使用函数
1 function printit(){ 2 echo -n "Your choice is " # 加上 -n 可以不断行继续在同一行显示 3 } 4 5 echo "This program will print your selection !" 6 case $1 in 7 "one") 8 printit; echo $1 | tr 'a-z' 'A-Z' # 将参数做大小写转换! 9 ;; 10 11 "two") 12 printit; echo $1 | tr 'a-z' 'A-Z' 13 ;; 14 15 "three") 16 printit; echo $1 | tr 'a-z' 'A-Z' 17 ;; 18 19 *) 20 echo "Usage $0 {one|two|three}" 21 ;; 22 esac
11. 区分脚本的参数和函数的参数
1 function printit(){ 2 echo "Your choice is $1" 3 } 4 5 # 这里的$1是脚本的参数 6 case $1 in 7 "one") 8 printit 1 # 请注意,这里的1会当作函数的参数使用 9 10 ;; 11 "two") 12 printit 2 13 ;; 14 "three") 15 printit 3 16 ;; 17 *) 18 echo "Usage $0 {one|two|three}" 19 ;; 20 esac
12. while循环
当条件为真时,才执行循环。
1 s=0 # 这是加总的数值变数 2 i=0 # 这是累计的数值,亦即是 1, 2, 3.... 3 while [ "$i" != "100" ] 4 do 5 i=$(($i+1)) # 每次 i 都会增加 1 6 s=$(($s+$i)) # 每次都会加总一次! 7 8 done
13. until循环
当条件成立时,循环停止。
1 until [ "$yn" == "yes" -o "$yn" == "YES" ] 2 do 3 read -p "Please input yes/YES to stop this program: " yn 4 done
14. for循环
1 for animal in dog cat elephant 2 do 3 echo "There are ${animal}s.... " 4 done
1 users=$(cut -d ':' -f1 /etc/passwd) # 撷取帐号名称 2 for username in $users # 开始回圈进行! 3 do 4 id $username 5 finger $username 6 done
1 network="192.168.1" 2 for sitenu in $(seq 1 100) 3 do 4 # 底下的程式在取得 ping 的回传值是正确的还是失败的! 5 ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1 6 7 # 开始显示结果是正确的启动 (UP) 还是错误的没有连通 (DOWN) 8 if [ "$result" == 0 ]; then 9 echo "Server ${network}.${sitenu} is UP." 10 else 11 echo "Server ${network}.${sitenu} is DOWN." 12 fi 13 done
扫描目录下的文件:
1 read -p "Please input a directory: " dir 2 if [ "$dir" == "" -o ! -d "$dir" ]; then 3 echo "The $dir is NOT exist in your system." 4 exit 1 5 fi 6 7 filelist=$(ls $dir) # 列出所有在该目录下的档案名称 8 9 for filename in $filelist 10 do 11 perm="" 12 test -r "$dir/$filename" && perm="$perm readable" 13 test -w "$dir/$filename" && perm="$perm writable" 14 test -x "$dir/$filename" && perm="$perm executable" 15 echo "The file $dir/$filename's permission is $perm " 16 done
1 for (( i=1; i<=$nu; i=i+1 )) 2 do 3 s=$(($s+$i)) 4 done
15. 脚本的语法检查和调试
1 语法检查 2 # sh -n script 3 4 调试 5 # sh -x script
脚本中的常用格式是:
1. 变量设定
2. 函数定义
3. case ... esac语句使用
4. RETVAL变量