shell笔记

本笔记主要是记录一些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 # 进行第二次‘三个参数的 shift11 
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变量

 

posted @ 2017-04-18 17:54  道霖  阅读(563)  评论(0编辑  收藏  举报