1. 程式人生 > >Shell學習(一)

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時,會同時存在三種變數:

  1. 區域性變數 區域性變數在指令碼或命令中定義,僅在當前shell例項中有效,其他shell啟動的程式不能訪問區域性變數。
  2. 環境變數 所有的程式,包括shell啟動的程式,都能訪問環境變數,有些程式需要環境變數來保證其正常執行。必要的時候shell指令碼也可以定義環境變數。
  3. 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