1、sh/bash要注意空格的使用
2、
for循環:
for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then if [ "${-#*i}" != "$-" ]; then . "$i" else . "$i" >/dev/null 2>&1 fi fi done
while循環和多選擇語句
#!/bin/bash while : do echo -n "輸入 1 到 5 之間的數字: " read aNum case $aNum in 1|2|3|4|5) echo "你輸入的數字為 $aNum!" ;;
7|8)
echo 'ok'
;; *) echo "你輸入的數字不是 1 到 5 之間的!" continue echo "游戲結束" ;; esac done
函數定義方法:
pathmunge () { case ":${PATH}:" in *:"$1":*) ;; *) if [ "$2" = "after" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi esac }
函數參數:在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...
帶參數的函數示例:
#!/bin/bash # author:菜鳥教程 # url:www.runoob.com funWithParam(){ echo "第一個參數為 $1 !" echo "第二個參數為 $2 !" echo "第十個參數為 $10 !" echo "第十個參數為 ${10} !" echo "第十一個參數為 ${11} !" echo "參數總數有 $# 個!" echo "作為一個字符串輸出所有參數 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73 輸出結果: 第一個參數為 1 ! 第二個參數為 2 ! 第十個參數為 10 ! 第十個參數為 34 ! 第十一個參數為 73 ! 參數總數有 11 個! 作為一個字符串輸出所有參數 1 2 3 4 5 6 7 8 9 34 73 !
注意,$10 不能獲取第十個參數,獲取第十個參數需要${10}。當n>=10時,需要使用${n}來獲取參數。另外,還有幾個特殊字符用來處理參數:
$# | 傳遞到腳本的參數個數 |
$* | 以一個單字符串顯示所有向腳本傳遞的參數 |
$$ | 腳本運行的當前進程ID號 |
$! | 后台運行的最后一個進程的ID號 |
$@ | 與$*相同,但是使用時加引號,並在引號中返回每個參數。 |
$- | 顯示Shell使用的當前選項,與set命令功能相同。 |
$? | 顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 |
-r 是否可讀
-x 是否可執行
-w 是否可寫
-n str 字符串不為null,長度大於零
-z str 字符串為null,長度為零
-d 存在且是一個目錄
-e 文件存在
-f 存在且是一個常規文件,非目錄,非特殊類型文件
-s 文件存在且不為空
-O own所屬的文件
-G group所屬的文件
- -N file :在上次讀取后,文件有改動
- file1 -nt file2 :file1 比 file2 更新,以最后更新時間為准
- file1 -ot file2 :file1 比 file2 更舊 ,以最后更新時間為准
>或者<或者=是用於字符串的比較
整數比較
-gt 大於
-ge 大於等於
-lt 小於
-le 不大於
-eq 等於
-ne 不等於
&& 與
||
$1 第一個變量 $2依次類推
$?上次的執行結果
exit 0、exit 1等,表示程序運行完的執行結果
export 把某個變量變為全局變量
source 或者 . 執行,表示立即生效
符號的用法:
1、`cmd`
2、[]:中括號兩邊都要有空格
if [ "$EUID" = "0" ]; then pathmunge /sbin pathmunge /usr/sbin pathmunge /usr/local/sbin else pathmunge /usr/local/sbin after pathmunge /usr/sbin after pathmunge /sbin after fi
3、{} :{ cmd1;cmd2;cmd3;} 在當前shell順序執行命令cmd1,cmd2,cmd3, 各命令之間用分號隔開, 最后一個命令后必須有分號, 第一條命令和左括號之間必須用空格隔開
4、() :(cmd1;cmd2;cmd3) 新開一個子shell順序執行命令cmd1,cmd2,cmd3, 各命令之間用分號隔開, 最后一個命令后可以沒有分號
5、;
6、'' :里面的變量,不取值 a=2;echo 'shen $a'--->shen $a
7、"" :里面的表里取值 a=2;echo "shen $a"--->shen 2
shell內建命令:
1、unset 命令用於刪除已定義的shell變量(包括環境變量)和shell函數。unset命令不能夠刪除具有只讀屬性的shell變量和環境變量。-f:僅刪除函數(function); -v:僅刪除變量(variable)。
2、set 命令作用主要是顯示系統中已經存在的shell變量,以及設置shell變量的新變量值。使用set更改shell特性時,符號"+"和"-"的作用分別是打開和關閉指定的模式。set命令不能夠定義新的shell變量。如果要定義新的變量,可以使用declare命令以變量名=值的格式進行定義即可。
字符串提取和替換: ${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}
第一種模式:${var:num},這種模式時,shell在var中提取第num個字符到末尾的所有字符。若num為正數,從左邊0處開始;若num為負數,從右邊開始提取字串,但必須使用在冒號后面加空格或一個數字或整個num加上括號,如${var: -2}、${var:1-3}或${var:(-2)}。
第二種模式:${var:num1:num2},num1是位置,num2是長度。表示從$var字符串的第$num1個位置開始提取長度為$num2的子串。不能為負數。
第三種模式:${var/pattern/pattern}表示將var字符串的第一個匹配的pattern替換為另一個pattern。。
第四種模式:${var//pattern/pattern}表示將var字符串中的所有能匹配的pattern替換為另一個pattern。
[root@centos ~]# var=/home/centos [root@centos ~]# echo $var /home/centos [root@centos ~]# echo ${var:5} /centos [root@centos ~]# echo ${var: -6} centos [root@centos ~]# echo ${var:(-6)} centos [root@centos ~]# echo ${var:1:4} home [root@centos ~]# echo ${var/o/h} /hhme/centos [root@centos ~]# echo ${var//o/h} /hhme/cenths
參考:
1、 http://man.linuxde.net/set
2、http://www.runoob.com/linux/linux-shell-func.html
3、http://blog.csdn.net/taiyang1987912/article/details/39551385