shell是與Linux交互的基本工具
shell script是針對shell所寫的腳本,解釋執行,無需編譯
注意事項
- 指令的執行是從上而下、從左而右的分析與執行;?
- 指令、選項與參數間的多個空白都會被忽略掉;?
- 空白行也將被忽略掉,并且[tab]按鍵的空白同樣視為空格鍵;?
- 如果讀取到一個Enter符號(CR),就嘗試開始執行該行(或該串)命令;?
- 如果一行的內容太多,則可以使用[Enter]]來延伸至下一行;?
- [#]可做為注釋!任何加在#后面的資料將全部被視為批注文字而被忽略!
執行
必須要具備可讀可執行權限
直接命令執行
sudo chmod u+x test.sh
./test.sh
bash程序執行
shell名稱 腳本名
將輸入重定向到shell腳本
bash < 腳本名
內容
echo [-n -e]
-n:輸出后不換行
-e:轉義字符
#! /bin/bash
# author
# date: 2024-4-26
# function: the first sctiptecho "current time"
date
echo -n "env path:"$PATH
echo "current user name:`hzy`"
echo "current work path:"
pwdexit 0
內嵌腳本
#! /bin/bash
# author
# date: 2024-4-26
# function: the first sctiptecho "test:"
. test.shexit 0
調試
bash -v 腳本名
絕對路徑
相對路徑
變量path功能
重定向輸入:bash < 腳本名
變量
變量就是以一組文字或符號等,來替代一些設置或者是一串保留的數據Shell編程中變量是非類型性質的,不必指定變量是數字還是字符串都需要事先聲明
局部變量
局部變量在腳本或命令中定義,僅在當前shel實例中有效,其他shel啟動的程序不能訪問局部變量。
環境變量
所有的程序,包括shel1啟動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行,必要的時候shel腳本也可以定義環境變量。(是系統的一部分,無需定義,如PATH)
內部變量
是由shell程序設置的特殊變量,在程序內這些變量無法修改($#、?)。?
$0:當前腳本名稱
$n:傳遞給腳本或函數的參數,n表示第n個參數(下標從1開始)
$#:傳遞給腳本或函數的參數個數
$*:傳遞給腳本或函數的全部參數,把所有參數作為一個整體
$@:傳遞給腳本或函數的全部參數,把所有參數分開,分別傳遞
$?:上一個命令的退出狀態,或者函數的返回值
$$:當前Shell進行的ID,對于腳本,就是腳本所在進程ID
變量賦值
w:=3
變量值讀取
read [-ptn] variable1?variable2?variable3:將用戶輸入的數據分配給變量。
-p:提示用戶輸入數據,并在讀取數據之前顯示提示信息。
-t:設置超時時間,如果用戶在指定的時間內沒有輸入數據,則返回失敗。
-n:限制讀取的字符數,只讀取指定數量的字符。
例如
#!/bin/bashecho "請輸入三個變量的值:"
read -p "variable1: " var1
read -p "variable2: " var2
read -p "variable3: " var3echo "您輸入的變量值如下:"
echo "variable1: $var1"
echo "variable2: $var2"
echo "variable3: $var3"
替換變量
new_var=${old_var-content}:如果old_var不存在,content賦值給new_var
new_var=${old_var:-content}:為空也替換
new_var=${old_var:+content}:如果old_var是非空,content就賦值給new_var(與-號相反)
new_var=${old_var:?content}:如果old_var被刪除或為空,將content輸出到控制臺
${w1:+${w3:=root}}
表示如果變量$w1
被定義且非空(即不為null或空字符串),則執行${w3:=root}
,否則返回null。
${w3:=root}
表示如果變量$w3
未被定義或為空,則將其賦值為字符串"root",否則保持其當前值不變
數組
bash只支持一維數組,沒有限制大小。
下標由0開始。
數組名=(v1 v2 ...?v3)(括號表示數組用空格分開)
單獨定義:array[9]=0,無需定義數組,直接執行,除了已經定義的元素,其他為空(類似與字典,或者python的Counter())
讀取數組:${array[1]},${array[*]}(數組所有元素),${array[@]}(數組所有元素),加#讀取個數
表達式
只支持整數運算
算術運算符
expr 5 + 3#有空格val=`expr 5 + 3`#有空格val=$(expr 5 + 3)#有空格val=$[5+2]#無空格n=1
m=2
let val=$n+$m#無空格var=$((運算內容))#var=$((9+8))
關系運算符(邏輯表達式)
test 條件:判斷
-eq:是否相等
-ne:不等
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
test "abc"=="xyz"[ "abc" == "xyz" ]#要空格
[ "abc" -eq "xyz" ]#要空格
布爾運算符
邏輯表達式
cmd1 && cmd2:與運算
cmd1 || cmd2:或運算
[邏輯表達式1 -a 邏輯表達式2]
-a:與運算
-o:或運算
!:非運算
返回0是true,false為非零值
字符串運算符
test -z string:是否為空
test -n string:是否為0
test?string1=string2:是否相等
test string1!=string2:是否不等
test string:是否為空
文件測試運算符
-e:文件是否存在
-f:文件是否存在且為普通文件
-d:文件是否存在且為目錄
-r:是否存在且可讀
-w:是否存在且可寫
-x:是否存在且可執行
語句
if-then
if [condition]; then當條件成立時執行內容
fi#結束判斷if [condition1]; then當條件成立1時執行內容
elif [condition2];then當條件成立2時執行內容
else當條件不成立時執行內容
fi
while
不滿足條件,循環結束
while [condition]
do執行內容
done
until
滿足條件,循環結束,與while相反
until [condition]
do執行內容
done
for
for val in arr
do執行內容
done
break
continue
exit
函數
函數可以在Shell腳本中做出一個類似自定義執行命令的東西
函數的設置一定要在程序的最前面
不但可以簡化程序代碼,還可以做成類似“模塊”的東西
函數也是有內部變量的,函數名稱為$0,后續參數為$1,$2...
[function] name()
{return
}#調用
name val1 val2 val3 ... valN#例子
#!/bin/bash# 定義一個函數,用于計算兩個數的和
function add() {local num1=$1local num2=$2local sum=$((num1 + num2))echo "兩數之和為: $sum"
}# 調用函數
add 3 5