[ 解析器 和 呼叫 ]
- 檔案首行指定解析器,預設解析器可省略不寫
- 透過 sh 或者 bash 命令呼叫 shell 指令碼
// hello.sh
#!/bin/bash
echo "hello world"
// run
$ sh hello.sh
- 給指令碼檔案新增執行許可權後,呼叫時可省略 sh 或者 bash
$ chmod 777 hello.sh
./hello.sh
[ 變數 ]
[ 常用的系統變數 ]
[ 自定義變數 ]
- A=1 // 直接定義複製,等號兩側不能有括號
- echo $A // 調取變數時需要用 $ 符號
- 變數區分大小寫
- unset A // unset 命令可以釋放變數
- readonly X=123 // readonly 定義靜態變數,該變數無法被重新賦值,無法被釋放
- export D // 將變數 D 提升為全域性變數
[ 特殊變數 ]
- $n // n 為數字,$0 代表指令碼自身,$1-9 代表前9個引數,大於9的需要用大括號包裹數字,如 $
- $# // 代表輸入引數的個數,不包括 $0 ,例如 sh hello.sh 1,這裡的 $# 就為 1
// hello.sh
echo $#
// run
$ sh hello.sh a b c // 3
- $* 和 $@,都表示所有引數,區別在於,用雙引號包裹起來後,"$*" 會成為一個整體,而 "$@" 仍然可以用來遍歷
- $$ 獲得當前程序 ID
- $! 獲得之前(上一個)程序 ID
- $? 獲得之前(上一個)程序結束的狀態碼 (0 表示成功, 1 表示失敗)
[ 運算子 ]
// cals.sh
a=$[1+2]
b=$[(1+2)*2]
c=$((2+2))
[ 條件判斷 ]
- [ 條件語句 ] // 中括號內必須有首尾空格
- [ 23 -eq 22 ] // 運算子兩側必須有空格
- 整數比較
= // 等於
-lt // less than <
-le // less equal <=
-eq // equal =
-gt // greater than >
-ge // greater equsl >=
-ne // not equal !=
[ a -eq b ]
-z // 空字串
-n // 非空字串
== // 字串相等
!= // 字串不等
-r // read 有讀取許可權
-w // write 有寫入許可權
-x // execute 有執行許可權
[ -w file ]
-e // existence 檔案存在
-f // file 檔案存在
-d // directory 目錄存在
[ -d xxx ]
-a // and 與
-o // or 或
! // not 非
- 使用 [[]] 或 (()) 包裹條件表示式,可以使用 > && 之類的符號
[ 流程控制 ]
[ if ]
// 1
if [ 表示式 ]:then // 注意 if 後面的空格
// code...
elif [ 表示式 ]:then
fi
// 2
if [ 表示式 ]
then
// code...
elif [ 表示式 ]
then
// code...
fi
[ case ]
case $var in
value1)
// code 1
;;
value2)
// code 2
;;
*)
// code default
;;
esac
[ for ]
for((i=0; i<4; i++))
do
echo $i
done
[ for in ]
- 這裡使用 $* 和 $@ 是一樣的
- 這裡只能使用 "$@",而不能使用 "$*",因為後者會把所有引數合併到一起
for i in $@
do
echo $i
done
[ while ]
i=0
while [ $i -lt 5 ] // 注意 while 後面要有 空格
do
echo $i
i=$[$i + 1]
done
[ 控制檯互動 ]
[ read ]
- read [option] [var_name]
- option:
-p // 等待輸入前給終端的提示內容
-t // 等待輸入的時間
name=""
echo ""
read -t 2 -p "請輸入姓名: " name
# if [ -n "$name" ] // 注意這裡給 $name 包裹了雙引號
if [ "$name" ] // 簡寫了,空字串返回 false
then
echo "您的姓名是 $name"
else
echo ""
echo ""
echo " ( 0 ^ 0 ) "
echo " (< >^< >) "
echo ""
echo "您沒有輸入姓名哦"
echo ""
fi
[ 函式 ]
[ 系統函式 ]
- basename 獲取不包含路徑的檔名
- dirname 獲取不包含檔名的路徑
[ 自定義函式 ]
a=0
b=0
function sum()
{
a=$1
b=$2
s=$[$1+$2]
return $s
}
sum 2 3
result=$?
echo "$a + $b 的結果為 $result"