前言
unix/linux操作系統下的shell,是一種殼,其目的是提供一個用戶與計算機相互交互的命令接口,通過輸入各種命令,達到操作的目的。
與此同時,shell支持控制流程,進而可以組合出各種各樣的應用實例。
-
shell腳本的格式
-
首行shebang機制:
bash腳本,首行添加#!/bin/bash [options]
csh腳本,首行添加#!/bin/csh [options]
ksh腳本,首行添加#!/bin/ksh [options]
…… -
描述腳本的注釋部分:
包括Author, Version, Date, Description,……該部分是非必須項,目的是為了讓使用腳本的人能夠比較清晰地了解該腳本的背景以及功能
…… -
腳本的正文部分:
包含命令與聲明,以面向過程的形式組合在一起
-
首行shebang機制:
腳本示例如下:
#!/bin/bash #首行的shebang,表示使用bash編寫腳本 #Author: AAA #標注作者(格式規范,非必須) #Version: 1.0 #標注版本(格式規范,非必須) #Date: 2017-04-14 #標注日期(格式規范,非必須) #Description: XXXXX... #腳本功能描述(格式規范,非必須) echo "Hello World" #腳本正文部分
-
編寫腳本的一些規范
1. 腳本的第一行shebang注明調用的語言
2. 注釋上一些信息,諸如: 文件名,功能描述,作者,版本……
3. 變量名和函數名建議使用同一種命名法則
4. 有盡量多的注釋說明程序的功能,單行注釋寫在代碼行上部或者尾部
5. 代碼做的修改要加必要的版本注釋和功能說明
6. 腳本的控制流程里面建議要有縮進,使用一定數量的空格或者Tab
7. 文件名按照使用的語言,以.sh,.pl,.py等形式為后綴 -
常用的符號
符號 | 描述 |
---|---|
” | 在單引號中所有特殊符號均無特殊含義 |
“” | 在雙引號中,除“$”“\”外其他特殊符號都無特殊含義 |
$() | 在括號中使用系統命令 |
$ | 調用變量的值 |
\ | 轉義符 |
$n | 代表命令行的第n個參數,其中$0代表命令本身 |
$# | 代表命令行中參數的個數 |
$* | 代表命令行中所有的參數,把所有參數看成一個整體 |
$@ | 代表命令行中的所有參數,把每個參數個別對待 |
$? | 代表最后一次執行的命令的返回狀態,返回0代表執行成功,否則不成功 |
$$ | 代表當前進程的進程號 |
$! | 代表后臺運行的最后一個進程的進程號 |
-
變量
* 用戶自定義變量 *:
為局部變量,只對當前shell生效。默認類型為字符串類型。
定義:變量名=變量值,當變量中含有空格時,需要用引號引起來
聲明:declare [+/-] [option] 變量名
選項: +取消屬性 -設置屬性 -i 整型 -a 數組 -r 只讀
使用unset命令刪除變量
更加詳細的聲明規則,可以使用help declare查詢
* 數組 *:
定義數組: arr_name=(value1 value2 ….)或 使用arr_name[index]=value單獨為元素賦值
注意:
數組元素放在小括號內,而不是大括號,元素之間使用空格分開,而不是逗號,元素下標從0開始
獲取數組元素: {arr_name[index]} 索引號為index的元素 {array_name[*]}數組的所有元素
獲取數組長度: ${#arr_name[*]}
數組切片:${arr_name[@]:start:length}
元素匹配替換:${arr_name[@]/before/after}
* 環境變量 *:
為全局變量,對子shell仍然有效,一般定義為大寫,使用命令env或者set命令可以查詢,用命令declare -x可以自定義環境變量,使用unset命令可以刪除變量。常用的系統預定義的環境變量如下所示:
變量 | 描述 |
---|---|
$PATH | 命令的搜尋路徑 |
$OLDPWD | 前一個工作目錄 |
$LANG | 目前的工作環境語言 |
$BASH | 目前使用的shell的絕對路徑(默認為/bin/bash) |
$BASH_VERSION | 使用的shell解釋器的版本 |
$HISTCONTROL | 控制歷史記錄,常用的有ignoredups,erasedups,ignorespace,…… |
$OSTYPE | 顯示系統類型 |
存放mail的文件 | |
$MAILCHECK | 多久檢查一下郵件 |
$PWD | 當前路徑 |
$SSH_TTY | 當前登錄的TTY |
$SHLVL | 當前SHELL在第幾層 |
$RANDOM | 輸出一個隨機整數 |
注:生成0-49之間的隨機數可以用如下命令:
echo $[RANDOM%50]
-
算數運算
bash支持簡單的算數運算,實現方式如下:- let r=9+9
- r=$[9+9]; r=$[VAR1+VAR2]
- r=$((9+9)); r=$((VAR1+VAR2))
- expr 8 + 3
- declare -i r=9+9
- echo “9+9” | bc
-
賦值
可以使用如下幾種賦值符號:
=, +=, -=, *=, /=, %=
使用示例如下:
[root@centos7-front1 scripts]# a=10;b=10 [root@centos7-front1 scripts]# echo $a $b 10 10 [root@centos7-front1 scripts]# let c=a++ [root@centos7-front1 scripts]# echo $c 10 [root@centos7-front1 scripts]# let d=++b [root@centos7-front1 scripts]# echo $b 11
-
字體顏色
字體顏色示例如下:echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 紅色字 \033[0m”
echo -e “\033[32m 綠色字 \033[0m”
echo -e “\033[33m 黃色字 \033[0m”
echo -e “\033[34m 藍色字 \033[0m”
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天藍字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”帶背景的字體示例如下:
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[40;37m 紅底白字 \033[0m”
echo -e “\033[40;37m 綠底白字 \033[0m”
echo -e “\033[40;37m 黃底白字 \033[0m”
echo -e “\033[40;37m 藍底白字 \033[0m”
echo -e “\033[40;37m 紫底白字 \033[0m”
echo -e “\033[40;37m 天藍底白字 \033[0m”
echo -e “\033[40;37m 白底黑字 \033[0m” -
條件判斷
使用test命令或者[]或者[[]]對條件進行測試
關于文件的判斷,使用方式如下:
判斷符 | 解釋 |
---|---|
-e | 判斷文件是否存在,如果存在則為真 |
-d | 判斷文件是否存在并且是否是目錄(目錄是一種特殊的文件),是則返回真 |
-f | 判斷文件是否存在并且是普通文件,是則返回真 |
-r | 判斷文件是否存在并且執行判斷的用戶是否對該文件有讀的權限,是則返回真 |
-w | 判斷文件是否存在并且執行判斷的用戶是否對該文件有寫的權限,是則返回真 |
-x | 判斷文件是否存在并且執行判斷的用戶是否對該文件有執行的權限,是則返回真 |
-nt | 判斷前面的文件是否比后面的文件新,是則返回真 |
-ot | 判斷前面的文件是否比后面的文件舊,是則返回真 |
-ef | 判斷前后兩個文件的i節點是否相同,是則返回真 |
使用示例如下:
[guest@centos7-front1 ~]$ ls 1.sh attach file [guest@centos7-front1 ~]$ [ -e "/home/guest/file" ] && echo "True" || echo "False" True [guest@centos7-front1 ~]$ [ -d "/home/guest/file" ] && echo "True" || echo "False" False [guest@centos7-front1 ~]$ [ -f "/home/guest/file" ] && echo "True" || echo "False" True [guest@centos7-front1 ~]$ ls -al total 28 drwx------ 3 guest guest 144 Apr 17 16:51 . drwxr-xr-x. 3 root root 18 Mar 30 10:58 .. -rwxr-xr-x 1 guest guest 171 Apr 17 16:51 1.sh -rw-r--r-- 1 root root 1 Mar 30 13:21 attach -rw------- 1 guest guest 416 Apr 10 17:05 .bash_history -rw-r--r-- 1 guest guest 18 Nov 20 2015 .bash_logout -rw-r--r-- 1 guest guest 193 Nov 20 2015 .bash_profile -rw-r--r-- 1 guest guest 231 Nov 20 2015 .bashrc --w------- 1 guest guest 0 Apr 10 16:58 file drwxr-xr-x 4 guest guest 37 Mar 19 18:42 .mozilla -rw------- 1 guest guest 1013 Apr 17 16:51 .viminfo [guest@centos7-front1 ~]$ [guest@centos7-front1 ~]$ [ -r "/home/guest/file" ] && echo "True" || echo "False" False [guest@centos7-front1 ~]$ [ -w "/home/guest/file" ] && echo "True" || echo "False" True [guest@centos7-front1 ~]$ [ -x "/home/guest/file" ] && echo "True" || echo "False" False ...... ...... [guest@centos7-front1 ~]$ [ "/home/guest/.bash_history" -nt "/home/guest/.bash_logout" ] && echo "True" || echo " False" True [guest@centos7-front1 ~]$ [ "/home/guest/.bash_history" -ot "/home/guest/.bash_logout" ] && echo "True" || echo " False" False
關于整數的判斷,使用的方式如下:
判斷符 | 解釋 |
---|---|
-eq | 判斷前后兩個整數是否相等,是則返回真 |
-ne | 判斷前后兩個整數是否不相等,不相等則返回真 |
-gt | 判斷前一個整數是否大于后一個整數,是則返回真 |
-lt | 判斷前一個整數是否小于后一個整數,是則返回真 |
-ge | 判斷前一個整數是否大于等于后一個整數,是則返回真 |
-le | 判斷前一個整數是否小于等于后一個整數,是則返回真 |
使用示例如下:
[root@centos7-front1 ~]# a=1 b=2 c=2 [root@centos7-front1 ~]# [ $a -eq $b ] && echo "True" || echo "False" False [root@centos7-front1 ~]# [ $a -ne $b ] && echo "True" || echo "False" True [root@centos7-front1 ~]# [ $a -gt $b ] && echo "True" || echo "False" False [root@centos7-front1 ~]# [ $a -lt $b ] && echo "True" || echo "False" True [root@centos7-front1 ~]# [ $b -ge $c ] && echo "True" || echo "False" True [root@centos7-front1 ~]# [ $b -le $c ] && echo "True" || echo "False" True
關于字符串的判斷,使用方式如下:
判斷符 | 解釋 |
---|---|
-z | 判斷后面的字符串是否為空,是則返回真 |
-n | 判斷后面的字符串是否不為空,不為空則返回真 |
== | 判斷前后字符串是否相等,相等則返回真 |
!= | 判斷前后兩個字符串是否不相等,不相等則返回真 |
> | 前面字符串的ascii碼是否大于后面字符串的ascii碼,大于則返回真 |
< | 前面字符串的ascii碼是否小于后面字符串的ascii碼,小于則返回真 |
=~ | 左側的字符串是否能夠被右側的pattern所匹配,是則返回真 |
使用示例如下:
[root@centos7-front1 scripts]# cat execute.sh #!/bin/bash -x ARG=$1 if [[ -f "$ARG" ]] && [[ "$ARG" =~ .sh$ ]]; then echo "ok" else echo "fail" fi [root@centos7-front1 scripts]# bash execute.sh file fail [root@centos7-front1 scripts]# bash execute.sh 1.sh ok
-
流程控制
if語句控制流程,內容如下:
if [ 條件1 ];then expression elif [ 條件2 ];then expression ..... else expression fi
多分支case語句控制流程,內容如下:
case $變量名 in "value1") expression ;; "value2") expression ;; ....... *) expression ;; esac 使用示例如下: #!/bin/bash read -t 30 -p "please input yes or no...." VAR case $VAR in yes) echo "your input is yes." ;; no) echo "your input is no." ;; *) echo "your input is error..." ;; esac
for循環控制流程,內容如下:
形式1 for 變量 in value1 value2 value3..... do expression done 示例: #!/bin/bash cd /root/test/ ls *.tar.gz > ls.log ls *.tgz >>ls.log for i in $(cat ls.log) do tar -zxf $i &> /dev/null #將執行中顯示的信息丟到黑洞 done rm -rf ls.log 形式2 for ((初始值;循環控制條件; 變量變化)) do expression done 示例: #!/bin/bash #從1加到100 s=0; for((i=1;i<=100;i=i+1)) do s=$(($s+$i)) done echo "the sum is:$s"
while循環控制流程,只要條件為真,便一直執行下去。內容如下:
while [ 條件判斷式 ] do 程序 done 示例: #!/bin/bash #從1加到100 i=1 s=0 while [ $i -le 100 ] do s=$(($s+$i)) i=$(($i+1)) done echo "the sum is:$s"
until循環控制流程,一直執行,直到條件為真為止。內容如下:
until [ 條件判斷式 ] do 程序 done 示例: i=1 s=0 until [ $i -ge 100 ] do s=$(($s+$i)) i=$(($i+1)) done echo "the sum is:$s"
原創文章,作者:jiangche00,如若轉載,請注明出處:http://www.www58058.com/73656
主要總結了shell編程的基礎用法,內容總結的很詳細,排版也很好,下次需要注意將代碼再注釋詳細一些,尤其是在示例的代碼中