Shell 變量/echo命令
Shell 教程
Shell 是一個用C語言編寫的程序,它是用戶使用Linux的橋梁。Shell既是一種命令語言,又是一種程序設計語言。
Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。
Ken Thompson的sh是第一種Unix Shell,Windows Explorer是一個典型的圖形界面Shell。
Shell 腳本
Shell 腳本(shell script),是一種為shell編寫的腳本程序。
業界所說的shell通常都是指shell腳本,但讀者朋友要知道,shell和shell script是兩個不同的概念。
Shell 環境
Shell 編程跟java、php編程一樣,只要有一個能編寫代碼的文本編輯器和一個能解釋執行的腳本解釋器就可以了。
Linux的Shell種類眾多,常見的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
Bash,也就是 Bourne Again Shell,由於易用和免費,Bash在日常工作中被廣泛使用。同時,Bash也是大多數Linux系統默認的Shell。
在一般情況下,人們並不區分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同樣也可以改為#!/bin/bash。
#!告訴系統其後路徑所指定的程序即是解釋此腳本文件的Shell程序。
第一個shell腳本
打開文本編輯器(可以使用vi/vim命令來創建文件),新建一個文件test.sh,擴展名為sh(sh代表shell),
擴展名並不影響腳本執行,見名知意就好,如果你用php寫shell 腳本,擴展名就用php好了。
輸入一些代碼,第一行一般是這樣:
#!/bin/bash
echo "Hello World !"
"#!" 是一個約定的標記,它告訴系統這個腳本需要什麽解釋器來執行,即使用哪一種Shell。
echo命令用於向窗口輸出文本。
運行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告訴系統說,就在當前目錄找。
2、作為解釋器參數
這種運行方式是,直接運行解釋器,其參數就是shell腳本的文件名,如:
/bin/sh test.sh
/bin/php test.php
這種方式運行的腳本,不需要在第一行指定解釋器信息,寫了也沒用。
Shell 變量
定義變量時,變量名不加美元符號($,PHP語言中變量需要),如:
your_name="ghf.com"
註意,變量名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變量名的命名須遵循如下規則:
首個字符必須為字母(a-z,A-Z)。
中間不能有空格,可以使用下劃線(_)。
不能使用標點符號。
不能使用bash裏的關鍵字(可用help命令查看保留關鍵字)。
除了顯式地直接賦值,還可以用語句給變量賦值,如:
for file in `ls /etc`
以上語句將 /etc 下目錄的文件名循環出來。
使用變量
使用一個定義過的變量,只要在變量名前面加美元符號即可,如:
your_name="gaohf"
echo $your_name
echo ${your_name}
變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,比如下面這種情況:
for skill in Ada Coffe Action Java do
echo "I am good at ${skill}Script"
done
如果不給skill變量加花括號,寫成echo "I am good at $skillScript",解釋器就會把$skillScript當成一個變量(其值為空),代碼執行結果就不是我們期望的樣子了。
推薦給所有變量加上花括號,這是個好的編程習慣。
已定義的變量,可以被重新定義,如:
your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name
這樣寫是合法的,但註意,第二次賦值的時候不能寫$your_name="alibaba",使用變量的時候才加美元符($)。
Shell 字符串
字符串是shell編程中最常用最有用的數據類型(除了數字和字符串,也沒啥其它類型好用了),
字符串可以用單引號,也可以用雙引號,也可以不用引號。單雙引號的區別跟PHP類似。
單引號
str=‘this is a string‘
單引號字符串的限制:
單引號裏的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
單引號字串中不能出現單引號(對單引號使用轉義符後也不行)。
雙引號
your_name=‘qinjx‘
str="Hello, I know your are \"$your_name\"! \n"
雙引號的優點:
雙引號裏可以有變量
雙引號裏可以出現轉義字符
拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
獲取字符串長度
string="abcd"
echo ${#string} #輸出 4
提取子字符串
string="alibaba is a great company"
echo ${string:1:4} #輸出liba
查找子字符串
string="alibaba is a great company"
echo `expr index "$string" is`
Shell 數組
bash支持一維數組(不支持多維數組),並且沒有限定數組的大小。
類似與C語言,數組元素的下標由0開始編號。獲取數組中的元素要利用下標,下標可以是整數或算術表達式,其值應大於或等於0。
定義數組
在Shell中,用括號來表示數組,數組元素用"空格"符號分割開。定義數組的一般形式為:
數組名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
還可以單獨定義數組的各個分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
可以不使用連續的下標,而且下標的範圍沒有限制。
讀取數組
讀取數組元素值的一般格式是:
${數組名[下標]}
例如:
valuen=${array_name[n]}
使用@符號可以獲取數組中的所有元素,例如:
echo ${array_name[@]}
獲取數組的長度
獲取數組長度的方法與獲取字符串長度的方法相同,例如:
# 取得數組元素的個數
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得數組單個元素的長度
lengthn=${#array_name[n]}
Shell 註釋
以"#"開頭的行就是註釋,會被解釋器忽略。
sh裏沒有多行註釋,只能每一行加一個#號。只能像這樣:
#--------------------------------------------
# 這是一個自動打ipa的腳本,基於webfrogs的ipa-build書寫:
# https://github.com/webfrogs/xcode_shell/blob/master/ipa-build
# 功能:自動為etao ios app打包,產出物為14個渠道的ipa包
# 特色:全自動打包,不需要輸入任何參數
#--------------------------------------------
##### 用戶配置區 開始 #####
#
#
# 項目根目錄,推薦將此腳本放在項目的根目錄,這裏就不用改了
# 應用名,確保和Xcode裏Product下的target_name.app名字一致
#
##### 用戶配置區 結束 #####
如果在開發過程中,遇到大段的代碼需要臨時註釋起來,過一會兒又取消註釋,怎麽辦呢?
每一行加個#符號太費力了,可以把這一段要註釋的代碼用一對花括號括起來,定義成一個函數,沒有地方調用這個函數,這塊代碼就不會執行,達到了和註釋一樣的效果。
Shell echo命令
Shell 的 echo 指令與 PHP 的 echo 指令類似,都是用於字符串的輸出。命令格式:
echo string
可以使用echo實現更復雜的輸出格式控制。
1.顯示普通字符串:
echo "It is a test"
這裏的雙引號完全可以省略,以下命令與上面實例效果一致:
echo It is a test
2.顯示轉義字符
echo "\"It is a test\""
結果將是:
"It is a test"
同樣,雙引號也可以省略
3.顯示變量
read 命令從標準輸入中讀取一行,並把輸入行的每個字段的值指定給 shell 變量
#!/bin/sh
read name
echo "$name It is a test"
以上代碼保存為 test.sh,name 接收標準輸入的變量,結果將是:
[root@www ~]# sh test.sh
OK #標準輸入
OK It is a test #輸出
4.顯示換行
echo -e "OK!\n" # -e 開啟轉義
echo "It it a test"
輸出結果:
OK!
It it a test
5.顯示不換行
#!/bin/sh
echo -e "OK! \c" # -e 開啟轉義 \c 不換行
echo "It is a test"
輸出結果:
OK! It is a test
6.顯示結果定向至文件
echo "It is a test" > myfile
7.原樣輸出字符串,不進行轉義或取變量(用單引號)
echo ‘$name\"‘
8.顯示命令執行結果
echo `date`
結果將顯示當前日期
Thu Jul 24 10:08:46 CST 2014
Shell 變量/echo命令