shell腳本

#!/bin/bash


shell的兩種運行方式

改變權限chmod u+x

運行時指定解釋器


shell變量

變量類型

訪問變量

$、${}

只讀變量

readonly

刪除變量

unset取消變量,但不能取消只讀變量

1
2
3
myUrl="http://lingdandan.blog.51cto.com"
unset myUrl
echo $myUrl

運行結果:

wKiom1fAD5fRlJ6AAAATzUTtFHQ952.png

1
2
3
4
myUrl="
readonly myUrl 
unset myUrl
echo $myUrl

運行結果:

wKioL1fAEBCjEg1hAAAoRVezDBM645.png


shell字符串

字符串可以用單引號,也可以用雙引號,也可以不用引號

單引號

單引號中的字符都會原樣輸出

單引號中間不能有單引號(轉義字符也不行)

雙引號

雙引號裏面可以有變量

單引號可以有轉義字符

字符串拼接

LANGUAGE=English

echo "hello ${LANGUAGE}"

字符串長度計算  

echo ${#VAR}

echo ${VAR} | wc -c

echo $TEST_SHELL_VAR | awk '{print length ($0)}'

提取子字符串

#*字符

##*字符

%字符*

%%字符*

wKiom1fAJbmTBONLAACZDb9GjWc620.png

VAR代表變量

${VAR:0:10}  表示從左邊第一個字符開始之後的10個字符

${VAR:7}    表示從第七個字符開始之後的所有字符

${VAR:0-3:10} 表示從右邊數的第三個字符開始之後的10個字符

${VAR:0-14}  表示從右邊數的第14個字符開始之後的所有字符

wKioL1fAJyzwBjf5AABsTw22U4o569.png

查找字符串

   

Shell數組

數組定義

bash只支持一維數組,不支持多維

下標從0開始,可以是整數或者表達式

arr=(值1 值2 值3)      圓括號   空格隔開

也可以單獨定義各個分量

數組讀取

${arr[下標]}

使用@可獲得數組的所有元素  

wKiom1fAM3PzV7ouAAAILIhB1ig993.png

獲取數組長度

${#arr[@]}

${#arr[*]}

wKiom1fANG3i5bq1AAAw_c2VTnI927.png


shell傳參

腳本內獲取參數的格式:$n

$0 $1 $2

wKioL1fASsXwImgMAAAjEmIwmdg660.png

$*和$@都是引用所有參數,它們的區別在於$*把參數當作一個字符串,$@把參數當作一個一個的字符串

$*  "1 2 3"     只傳了一個參數

$@  "1" "2" "3"  傳來三個參數

wKioL1fAUn3QtuGvAAAyHsoav3k280.png


shell基本運算

原生的bash不支持簡單的算術運算,可通過別的命令如awk和expr來完成

算數運算

+ - * / % = == !=

VAR=`expr 3 \* 5`

關係運算符

-eq -nq -gt -lt -ge -le

關係運算符只支持數,不支持字符串

wKiom1fAe73Q4X74AAAsv0btqaE109.png

字符串運算

=   !=   -z  -n   str


expr  http://lingdandan.blog.51cto.com/10697032/1791485

    expr match 字符串 表達式    expr 字符串 : 表達式

    expr index 字符串 字符

    expr length 字符串

    expr substr 字符串 偏移量 長度  (偏移量從1開始)

布爾運算

! -o -a

邏輯運算符

&& ||

文件測試運算符

[ -f file ] -d  -b  -c  -p  -r  -w  -x  -s(文件是否大於0)  -e(目錄或文件是否存在)


shell echo命令

1、echo "str"     

  echo str

2、echo "\"str\""

3、echo -e "hello \nworld"      #-e開啓轉義    換行

4、echo -e "hello \c"       #-e開啓轉義   不換行 抑制輸出結果中的換行字符

  echo "world"

5、echo "$var is good!"

6、echo "hello world" >file

7、echo '$var is good!'    #原樣輸出字符串不進行轉義,使用單引號

8、echo `date`  #顯示命令結果


shell printf

默認printf不會像 echo 自動添加換行符,我們可以手動添加 \n

語法:  printf 格式控制字符串 參數列表


shell test命令

數值測試 -eq -ne -ge -le -gt -lt

字符串測試 = != -z -n

文件測試 -d -f -c -b -r -w -x -e -s



shell 流程控制

if

for

for 變量 in 列表

do

done


for var in list1 list2 list3...

do

command

done


或者寫成一行for var in list1 list2;do command1;command2; done;

wKiom1fAUc-wDOhQAABOIeeUR9o011.png

while

until

case

break

continue


shell函數

[function] func[()]

{

    action

    [return int;]

}

函數返回值,可以顯示的加return,如果不加將以最後一條命令的結果,作爲返回值,

return後面跟的數爲0-255

下圖爲加return和不加return的區別

wKiom1fBYgLjRr_gAAA7m8jJFZ0295.png

wKioL1fBYdHjxnpAAAA4A8mQaZs848.png

return的範圍

wKiom1fBY6vAsplUAABMrJ0qVo8749.png

函數參數

在函數內部通過$1 $2 $3 ...${10}... 來獲取參數

$# 傳遞到腳本的參數個數

$* 以一個單字符串顯示所有向腳本傳遞的參數

$$ 當前進程的ID

$! 後臺運行的最後一個進程ID

$@ 和$*相同

$- 記錄當前設置的shell選項 himBH是默認值 http://kodango.com/explain-shell-default-options

$? 獲取退出碼


shell輸入輸出重定向

command >file 將輸出重定向到file

command <file 將輸入重定向到file

command >>file將輸出追加到file

n >file     將文件描述符爲n的文件重定向到file

n >>file    將文件描述符爲n的文件追加到file

n >&m      將輸出文件m和n合併

n <&m      將輸入文件m和n合併

<<tag      將開始標記tag和結束標記tag之間的內容作爲輸入


默認情況下command >file將stdout重定向到file

默認情況下command <file將stdin重定向到file


輸出重定向 

comand >file

comand <file

comand <input>output


shell文件包含

有test1.sh和test2.sh兩個腳本

內容分別如下:

wKiom1fCjDij1gtsAAArnHCjAps486.png

運行test2.sh的結果如下:(其中test1.sh不需要可執行權限)

wKioL1fCjGaydX5zAAAO356OH94828.png

由上可見,test2.sh引用了test1.sh的內容,有以下兩種表示方式

. filename

source filename




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章