shell簡單入門
shell 入門
-
指令碼格式
#!/bin/bash
-
第一個shell指令碼
-
建立一個shell指令碼,輸出 hello world
-
示例
#!/bin/bash echo "hello world"
- 指令碼常用的執行方式
sh test.sh bash test.sh ./test.sh source test.sh
-
系統變數
-
系統變數
$HOME # 獲取家目錄地址 $PWD # 獲取當前的路徑 $SHELL # 獲取當前使用的shell直譯器
自定義變數規則
- 變數名可以由字元、數字和下劃線組成, 但是不能以數字開頭,環境變數建議大寫。
- 等號的兩側不能有
空格
- bash中預設的變數都是字串型別,所以無法直接進行數值運算。
- 變數的值如果有空格,需要使用雙引號或者單引號括起來。
-
宣告變數
注意:等號的左右時沒有空格的
# 宣告變數 A 和 B A=1 B=2
-
獲取變數
使用 $ 符號
# 獲取變數 $A $B
-
宣告靜態變數
readonly
靜態變數,只能讀取,不能進行重新賦值和刪除
# 宣告靜態變數 readonly C=1 # 讀取靜態變數 echo $C
特殊變數
-
${n}
n 為數字,$0 代表指令碼名稱,$1代表第一個引數,依此類推。
如果引數的個數超過9個,則需要加
{}
,例如 ${10}#!/bin/bash echo "$0 $1 $2 $3"
./test.py 1 2 3
-
$#
獲取傳入引數的個數, 一般用於迴圈
#!/bin/bash echo "引數的個數:"$#
./test.py 1 2 3 4 5 6 7 8
-
$*
獲取命令列中的所有的引數,會把所有的引數當成一個整體
#!/bin/bash echo $*
-
$@
獲取命令列中的所有的引數,但會將引數區別對待
#!/bin/bash echo $@
-
$?
最後一次執行命令的返回狀態,這個變數值為0,證明上一次執行的命令是正確的,如果這個值為非0,則證明上一次執行的命令是錯誤的。
#!/bin/bash cat ./b.txt echo $?
運算子
-
基本語法
$((運算表示式))
或者$[運算表示式]
expr +(加法),-(減法),\*(乘法),/(除法),%(取餘),expr 運算子間有空格
-
示例
-
計算 3+2的值
root@win:~# expr 2 + 3 5
-
計算 3-2的值
root@win:~# expr 3 - 2 1
-
計算 (2+3)*4的值
root@win:~# expr `expr 2 + 3` \* 4 20
-
使用 $ 計算, 使用
()
需要有至少兩層,例如$((表示式))
root@win:~# echo $(((2+3)*4)) 20 root@win:~# echo $[2+3] 5
-
條件判斷
-
基本語法
-
語法
[ condition ]
-
注意事項
- 條件前後要有空格,條件為空則為false, 否則為true
-
-
比較符號
-
=
字串等於 -
-lt
小於 -
-gt
大於 -
-eq
等於 -
-le
小於等於 -
-ge
大於等於 -
-ne
不等於 -
示例
# 判斷 23 大於等於 22 root@win:~# [ 23 -ge 22 ] root@win:~# echo $? 0 # 判斷 23 大於等於 24 root@win:~# [ 23 -ge 24 ] root@win:~# echo $? 1
-
-
按照檔案許可權進行判斷
-
-r
有讀的許可權 -
-w
有寫的許可權 -
-x
有執行的許可權 -
示例
# 檢視檔案 qiang@win:~$ ll -rw-rw-rw- 1 qiang qiang 0 Jul 11 15:37 a.txt -rwxr-xr-x 1 root root 34 Jul 11 09:54 helloworld.sh* # 判斷 helloworld.sh 是否有讀的許可權(有) qiang@win:~$ [ -r helloworld.sh ] qiang@win:~$ echo $? 0 # 判斷 a.txt 是否有執行的許可權(無) qiang@win:~$ [ -x a.txt ] qiang@win:~$ echo $? 1
-
-
按照檔案型別進行判斷
-
-f
檔案存在,並且是一個常規的檔案 -
-e
檔案存在 -
-d
目錄存在 -
示例
# 判斷一個檔案是否存在 (存在) qiang@win:~$ [ -f a.txt ] qiang@win:~$ echo $? 0 # 判斷一個檔案是否存在 (不存在) qiang@win:~$ [ -f b.txt ] qiang@win:~$ echo $? # 判斷b.txt是一個目錄 (不是) qiang@win:~$ [ -d b.txt ] qiang@win:~$ echo $? 1 # 建立目錄c並且判斷c 是一個目錄(是) qiang@win:~$ mkdir c qiang@win:~$ [ -d c ] qiang@win:~$ echo $? 0
-
-
多條件判斷
-
&&
表示前一條命令執行成功時,才執行後一條命令,如果前一條命令執行失敗,則後面命令不會執行。 -
||
表示前一條命令執行成功時,就不會執行後一條命令。如果前一條命令執行失敗,才會執行後一條命令 -
示例
# 判斷22大於21為真,然後echo ok為真, 不執行或語句 qiang@win:~$ [ 22 -gt 21 ] && echo ok || echo success ok # 判斷22大於21為假,不執行echo ok語句, 執行或語句,輸出 success qiang@win:~$ [ 22 -gt 23 ] && echo ok || echo success success
-
條件分支
-
if
語句-
基本語法
# 第一種方式 if [ 條件表示式 ];then 程式 fi # 第二種方式 if [ 條件表示式 ] then 程式 fi
-
示例
#!/bin/bash if [ $1 -eq 1 ] then echo "輸入的引數是1" elif [ $1 -eq 2 ] then echo "輸入的引數是2" else echo "輸入錯誤" fi
#!/bin/bash if [ $1 -eq 1 ];then echo "輸入的引數是1" elif [ $1 -eq 2 ];then echo "輸入的引數是2" else echo "輸入的引數有誤" fi
-
注意事項
- [ 條件表示式 ] ,中括號與條件表示式中間必須有空格
- 要有
fi
結尾
-
-
case
語句-
基本語法
case
-
注意事項
case
行結尾為單詞in
, 每一個模式匹配符必須以)
結束。1)
裡面的值最好是字串型別。- 雙分號
;;
表示命令序列結束。相當於break
*)
表示預設模式,相當於default
- 預設模式
;;
可寫可不寫,推薦 寫
-
示例
#!/bin/bash case $1 in "1") echo "python" ;; "2") echo "java" ;; "h") echo "h" ;; *) echo "others" ;; esac
-
迴圈語句
-
for
迴圈-
基本語法
for ((初始值; 迴圈控制條件;步長)) do 程式 done for 變數 in 值1 值2 值3 do 程式 done
-
注意事項
for(())
要有兩個括號- 程式需要在
do
和done
之間
-
示例
#!/bin/bash # 計算1到100的和 sum=0 for ((i=1;i<=100;i++)) do sum=$(($sum+$i)) done echo $sum #!/bin/bash # 獲取引數並列印,$@和$*效果是一樣的 for i in $@ do echo $i done for i in $* do echo $i done # 獲取引數並列印,“$@”和“$*”效果是不一樣的 # "$@" 和上面的是一樣的,也是分別列印 # "$*" 和上面的不一樣了,他是作為一個整體輸出的 for i in “$@” do echo $i done for i in “$*” do echo $i done
-
-
while
迴圈-
基本語法
while [ 條件表示式 ] do 程式 done
-
注意事項
- 條件表示式兩邊需要有空格
- 程式必須在
do
和done
中間 - 程式必須有限制條件,否則會造成死迴圈
-
示例
#!/bin/bash # 計算1加到100的和 i=1 sum=0 while [ $i -le 100 ] do # 累加的和 sum=$[$sum+$i] # 限制條件 i=$[$i+1] done echo $sum
-
讀取控制檯的輸入
-
read
-
基本語法
read -t 讀取資料的時間 -p "提示語句" 接收資料的變數
-
注意事項
-p
指定讀取值的提示符-t
指定讀取時等待的時間,預設單位秒。如果超出時間,則退出程式- 需要有一個接收資料的變數
-
案例
#!/bin/bash # 20s 內輸入資料,用Name來接收資料,並列印 read -t 20 -p "input your name" Name echo $Name
-
函式
-
系統函式
-
basename
功能:獲取檔案的名稱
# 獲取檔名稱 qiang@win:~$ basename /home/qiang/case.sh case.sh # 獲取檔名稱,不帶字尾 qiang@win:~$ basename /home/qiang/case.sh .sh case
-
dirname
功能: 獲取檔案的絕對路徑
# 獲取檔案的絕對路徑 qiang@win:~$ dirname /home/qiang/case.sh /home/qiang
-
-
自定義函式
-
基本語法
[function] funcname[()] { 程式 [return int;] } funcname
-
注意事項
- 先宣告函式,然後才可以呼叫
- 函式的返回值,只能使用
$?
來呼叫,可以顯示條件return int
,如果不加,則預設最後條命令執行的結果作為返回值。 return返回值的範圍在0~255之間
-
示例
#!/bin/bash # 定義求和函式 function add() { sum=$[$1+$2] echo $sum } read -p "請輸入第一個引數: " p1 read -p "請輸入第二個引數: " p2 add $p1 $p2
-