Linux中有很多類型的shell,不同的shell具備不同的功能,shell還決定了腳本函數中的語法,linux默認的shell是/bin/bash,流行的shell還有ash、bash、ksh、ksh、zsh等,不同的shell都有自己的特點和用途。
文件命名規範:
文件名.sh
.sh是linux下base shell的默認後綴
案例:創建一個shell腳本hello.sh,輸出hello world
輸出命令:echo
輸出的內容如果包含字母和符號,則需要用引號括起來;純數字可擴可不擴
#創建hello.sh
touch hello.sh
#編輯hello.sh
vim hello.sh
#hello.sh腳本內容
echo 'Hello World!'
#:wq進行保存
#修改文件的權限,添加用戶運行權限
chmod u+x hello.sh
#運行腳本
./hello.sh
運行腳本時一定要寫成 ./hello.sh,這樣腳本才能執行,只寫hello.sh是不能執行的,運行其他二進制文件也一樣。只寫hello.sh
,linux系統會去PATH環境變量中查找有沒有hello.sh,而只有/bin,/sbin/,/usr/bin/,/usr/sbin/等在環境變量PATH中,當前目錄通常不在PATH中,所以寫成hello.sh會找不到命令;./hello.sh則是告訴系統在當前目錄找hello.sh
還有一種方式運行: /bin/bash hello.sh
shell中的變量
量 == 數據
變量== 數據可以發生改變
在一個腳本週期內,其值可以發生改變的量就是變量。當前的shell腳本可以理解爲一個週期。
#腳本中的內容
#定義變量
testValue="測試的變量"
#輸出變量
echo $testValue
變量需要先定義再使用,左邊是變量名,右邊是變量值。使用變量的時候,需要在變量名前加$符號。
需要的是,變量名後面的"="左右不能有空格;命名只能使用英文字母、數字和下劃線,首個字符不能以數字開頭;中間補不能有空格,可以使用下劃線"_";不能使用標點符號;不能使用bash裏面的關鍵字;
單引號不能識別變量,只會原樣輸出,不能轉義
雙引號能夠識別變量,能夠實現轉義(類似於"\*")
` (反引號,esc按鍵下面那個鍵)的使用,當在腳本中使用一些指令並且將執行的結果賦給變量的時候需要使用反引號
只讀變量
readonly xxx變量
設置爲只讀變量後,readonly之後對變量的賦值操作將不起作用
#test1.sh
# /bin/bash
a=10
readonly a
a=20
echo $a
接收用戶的輸入
read -p 提示信息 變量名
# test2.sh
#/bin/bash
read -p "請輸入要創建的文件的路徑" filepath
touch $filepath
echo "文件創建成功"
ls -l $filepath
刪除變量
unset 變量名
# test3.sh
#/bin/bash
a=20
echo $a
unset a
echo $a
條件判斷語句
單個語句
if condition
then
commmand
fi
兩個條件
if condition
then
command
else
command2
fi
多個條件
if condition
then
command
elif condition2
then
command2
else
command3
fi
#/bin/bash
a=2
if [ $a -eq 1 ];then
echo "a==1"
elif [ $a == 2 ];then
echo "a==2"
else
echo "a==3"
fi
再踩一坑:
因爲第一次學習shell,[ ] 兩個中括號應該與前後變量有空格,不然會報錯
運算符 | 說明 | 舉例 |
+ | 加法 | `expr $a + $b` 結果爲 30 |
- | 減法 | `expr $a - $b` 結果爲 -10 |
* | 乘法 | `expr $a \* $b` 結果爲 200 |
/ | 除法 | `expr $b / $a` 結果爲 2 |
% | 取餘 | `expr $b % $a` 結果爲 0 |
= | 賦值 | a=$b 將把變量 b 的值賦給 a |
== | 相等。用於比較兩個數字,相同則返回 true | [ $a == $b ] 返回 false |
!= | 不相等。用於比較兩個數字,不相同則返回 true | [ $a == $b ] 返回 true |
運算符 | 說明 | 舉例 |
-eq | 檢測兩個數是否相等,相等返回 true | [ $a -eq $b ] 返回 false |
-nq | 檢測兩個數是否不等,不相等返回 true | [ $a -nq $b ] 返回true |
-gt | 檢測左邊的數是否大於右邊的,如果是,則返回 true | [ $a -gt $b ] 返回 false |
-lt | 檢測左邊的數是否小於右邊的,如果是,則返回 true | [ $a -lt $b ] 返回 true |
-ge | 檢測左邊的數是否大於等於右邊的,如果是,則返回 true | [ $a -ge $b ] 返回 false |
-le | 檢測左邊的數是否小於等於右邊的,如果是,則返回 true | [ $a -le $b ] 返回 true |
運算符 | 說明 | 舉例 |
! | 非運算,表達式爲true則返回false;爲false則返回true | [ !false ] 返回true |
-o | 或運算,只要一個表達式爲真則返回true | [ $a -lt 20 -o $b -gt 30 ] 返回true |
-a | 與運算,表達式全部爲真才返回true | [ $a -lt 15 -r $b -gt 15 ] 返回true |
運算符 | 說明 | 舉例 |
|| | 邏輯或運算or | [[ $a -lt 20 || $b -gt 30 ]] 返回true |
&& | 邏輯與運算and | [[ $a -lt 15 && $b -gt 15 ]] 返回true |
運算符 | 說明 | 舉例 |
= | 檢測兩個字符串是否相等,相等返回 true | [ $a = $b ] 返回 false |
!= | 檢測兩個字符串是否相等,不相等返回 true | [ $a != $b ] 返回 true |
-z | 檢測字符串長度是否爲0,爲0返回 true | [ -z $a ] 返回false |
-n | 檢測字符串長度是否爲0,不爲0返回 true | [ -n "$a" ] 返回 true |
str | 檢測字符串是否爲空,不爲空返回 true | [ $a ] 返回 true |
運算符 | 說明 | 舉例 |
-b file | 檢測文件是否是塊設備文件,如果是,則返回 true | [ -b $file ] 返回 false |
-c file | 檢測文件是否是字符設備文件,如果是,返回true | [ -c $file ] 返回 false |
-d file | 檢測文件是否是目錄,如果是,則返回 true | [ -d $file ] 返回 false |
-f file | 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 | [ -f $file ] 返回 true。 |
-g file | 檢測文件是否設置了 SGID 位,如果是,則返回 true | [ -g $file ] 返回 false |
-k file | 檢測文件是否設置了粘着位(Sticky Bit),如果是,則返回 true | [ -k $file ] 返回 false |
-p file | 檢測文件是否是有名管道,如果是,則返回 true | [ -p $file ] 返回 false |
-u file | 檢測文件是否設置了 SUID 位,如果是,則返回 true | [ -u $file ] 返回 false |
-r file | 檢測文件是否可讀,如果是,則返回 true | [ -r $file ] 返回 true |
-w file | 檢測文件是否可寫,如果是,則返回 true | [ -w $file ] 返回 true |
-x file | 檢測文件是否可執行,如果是,則返回 true | [ -x $file ] 返回 true |
-s file | 檢測文件是否爲空(文件大小是否大於0),不爲空返回 true | [ -s $file ] 返回 true |
-e file | 檢測文件(包括目錄)是否存在,如果是,則返回 true | [ -e $file ] 返回 true |