Shell學習(一)
本文是個人學習shell的筆記,絕大部分來源於菜鳥教程.
SHELL
Shell 指令碼(shell script),是一種為 shell 編寫的指令碼程式。
業界所說的 shell 通常都是指 shell 指令碼,但讀者朋友要知道,shell 和 shell script 是兩個不同的概念。Bash 是大多數Linux 系統預設的 Shell。
執行 Shell 指令碼有兩種方法:
1、作為可執行程式
將上面的程式碼儲存為 test.sh,並 cd 到相應目錄:
chmod +x ./test.sh
#使指令碼具有執行許可權
./test.sh
注意,一定要寫成 ./test.sh,而不是 test.sh,執行其它二進位制的程式也一樣,直接寫 test.sh,linux 系統會去 PATH 裡尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 裡,你的當前目錄通常不在 PATH 裡,所以寫成 test.sh 是會找不到命令的,要用 ./test.sh 告訴系統說,就在當前目錄找。
注:或者不賦予許可權,使用
. . /test.sh
也可以執行.
2、作為直譯器引數
這種執行方式是,直接執行直譯器,其引數就是 shell 指令碼的檔名,如:
/bin/sh test.sh /bin/php test.php
這種方式執行的指令碼,不需要在第一行指定直譯器資訊,寫了也沒用。
SHELL變數
變數使用
定義變數:
your_name="zhangsan"
注意,變數名和等號之間不能有空格,這可能和你熟悉的所有程式語言都不一樣。同時,變數名的命名須遵循如下規則:
- 命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。
使用變數:在變數名前面加美元符號即可
your_name="zhangsan"
echo $your_name
echo ${your_name}
變數名外面的花括號是可選的,加不加都行,加花括號是為了幫助直譯器識別變數的邊界
for letter in A B C D ;
do
echo "English letter is ${letter}"
done
推薦給所有變數加上花括號,這是個好的程式設計習慣。
已定義的變數,可以被重新定義:
#!/bin/bash
your_name="zhangsan"
echo $your_name
your_name="lisi"
echo $your_name
只有使用的時候才加$.
只讀變數
使用readonly標記變數為只讀變數,重新賦值時,會報錯.
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"
readonly也可以在直接定義變數的時候使用
#!/bin/bash
readonly myUrl="http://www.google.com"
echo $myUrl
刪除變數
unset 命令,unset 命令不能刪除只讀變數.
unset variable_name
變數型別
執行shell時,會同時存在三種變數:
- 區域性變數 區域性變數在指令碼或命令中定義,僅在當前shell例項中有效,其他shell啟動的程式不能訪問區域性變數。
- 環境變數 所有的程式,包括shell啟動的程式,都能訪問環境變數,有些程式需要環境變數來保證其正常執行。必要的時候shell指令碼也可以定義環境變數。
- shell變數 shell變數是由shell程式設定的特殊變數。shell變數中有一部分是環境變數,有一部分是區域性變數,這些變數保證了shell的正常執行
Shell 字串
字串是shell程式設計中最常用最有用的資料型別,字串可以用單引號,也可以用雙引號,也可以不用引號.
單引號
str='this is a string'
單引號字串的限制:
單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的;
單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,作為字串拼接使用。
雙引號
#!/bin/bash
your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo $str
#output:Hello, I know you are "runoob"! \n
yourname2="zhangsan"
str2="hello,are you ${yourname2}"
echo $str2
#output:hello,are you zhangsan
拼接字串
#!/bin/bash
your_name="zhangsan"
# 使用雙引號拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用單引號拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
獲取字串長度
#使用${#str}來獲取字串的長度
str="zhangsan"
echo ${#str}
#output:8
# 利用expr的length方法
expr length ${str}
#使用awk的length方法
echo ${str} | awk '{print length($0)}'
提取子字串
string="runoob is a great site"
echo ${string:1:4} # 輸出 unoo
查詢子字串
查詢字元 i 或 o 的位置(哪個字母先出現就計算哪個):
string="runoob is a great site"
echo `expr index "$string" io` # 輸出 4 ,` 是反引號
Shell陣列
bash支援一維陣列(不支援多維陣列),並且沒有限定陣列的大小。陣列元素的下標由 0 開始編號。
定義陣列
在 Shell 中,用括號來表示陣列,陣列元素用"空格"符號分割開。定義陣列的一般形式為:
陣列名=(值1 值2 ... 值n)
array_name=(value0 value1 value2 value3)
讀取陣列
${陣列名[下標]}
使用 @ 符號可以獲取陣列中的所有元素,例如:
echo ${array_name[@]}
namearr=("zhangsan" "lisi" "wangwu")
echo ${namearr[1]}
echo ${namearr[@]}
#output:lisi
#output:zhangsan lisi wangwu
獲取陣列的長度
獲取陣列長度的方法與獲取字串長度的方法相同,例如:
# 取得陣列元素的個數
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得陣列單個元素的長度
lengthn=${#array_name[n]}
namearr=("zhangsan" "lisi" "wangwu")
echo ${namearr[1]}
echo ${namearr[@]}
#output:lisi
#output:zhangsan lisi wangwu
length=${#namearr[@]}
echo $length
#output:3 正確
length1=${#namearr}
echo $length1
#output:8 錯誤,獲取的不是元素的個數,獲取可能是第一個元素的長度
length2=${#namearr[2]}
echo $length2
#output:6 獲取的是第三個元素的長度
Shell註釋
以 # 開頭的行就是註釋,會被直譯器忽略。
通過每一行加一個 # 號設定多行註釋,像這樣:
#--------------------------------------------
# 這是一個註釋
# author:zhangsan
# site:www.google.com
# slogan:學習,只有學習,才能讓人不斷進步
#------------------------------------------
多行註釋可以使用:
:<<EOF
註釋內容...
註釋內容...
註釋內容...
EOF