shell腳本
shell腳本就是一些命令的集合
#!/bin/bash echo "文件開頭代表:該文件使用的是bash語法"
一、運行.sh文件
方法一:當前文件執行.sh 文件
# 文件必須含有x執行權限 [文件賦x權限:chmod u+x hello.sh] ./test.sh # 文件可以沒有x權限 sh test.sh
方法二:絕對路徑執行.sh 文件
/home/test/test.sh ./home/test/test.sh sh /home/test.test.sh
查看運行過程
sh -x test.sh
運行預覽
二、腳本編寫
實例1:輸出內容到控制台
# test.sh內容 echo "test shtest"
運行結果
實例2:變量格式: “變量名=變量的值”。當在腳本中引用變量時需要加上’$’符號或者“${變量}”
# 變量 var_name ;引用變量 $var_name var_name="test.sh" echo "test $var_name"
執行結果
實例3: 復制文件
# 變量 `date……` [`非單引號,而是反單引號] var_name="test.sh" echo "test $var_name" cp /home/appuser/ntest/$var_name /home/appuser/cptest/`date "+%Y-%m-%d-%H:%M:%S"`--$var_name
執行結果
實例4:將執行命令的結果用作變量輸出
# 變量 var_name="test.sh" var_para=$(ls) echo "test輸出變量: $var_name" echo "test輸出執行命令的結果變量:${var_para}"
執行結果
實例5: 用戶輸入 表示in_name變量的值需要用戶通過鍵盤輸入得到
# 寫法一:read -p 選項類似echo的作用 read -p "請輸入您的名字:" in_name echo "您輸入的名稱為:$in_name" # 寫法二:會存在換行輸入 echo "請輸入你的年齡:" read in_age echo "您輸入的年齡是:$in_age"
運行結果
實例6: 當前時間為變量,創建文件
now_date=$(date "+%Y-%m-%d_%H:%M:%S") echo "當前時間:$now_date" # 批量創建文件 touch file{01..03}_$now_date.log #touch ${now_date}_file{04..07}.log

# touchfile.sh 創建文件腳本 filename="$(date +%Y-%m-%d)" echo "開始創建文件......" touch ${filename}_file{01..09}.log echo "創建成功" echo "$(ls)
運行結果

echo "開始創建文件......" #touch ${filename}_file{01..09}.log for i in `seq 1 5`;do filename="$(date +%Y-%m-%d_%H:%M:%S)" touch ${filename}_${i}_file.log sleep 2 done echo "創建成功;目錄下文件如下:" echo "$(ls)"
運行結果
實例7: 計算 數學計算要用’[ ]’括起來並且外頭要帶一個’$’
# 暫停2s sleep 2 # 變量 a=1 b=3 # 計算a、b之和 sum=$[$a+$b] echo "sum is $sum"
運行結果
實例8: 預設變量
# $1的值就是在執行的時候輸入的1,而$2的值就是執行的時候輸入的$2 $0代表文件名 echo "$0 $1 $2" sum=$[$1+$2] echo $sum
運行結果
實例9: 邏輯判斷 if

if 判斷語句; then 命令 elif 判斷語句;then 命令 else 命令 fi
# 不帶else ((nums<20))是因為.sh中,用一個小括號或者不用都會報錯 read -p "請輸入數字:" nums if ((nums<20));then echo "輸入不能小於20" fi # 帶else read -p "請輸入數字:" nums if ((nums<20));then echo "輸入不能小於20" else echo "恭喜" fi

# 帶elif ;這里的 && 表示“並且”的意思,當然你也可以使用 || 表示“或者” read -p "請輸入數字:" nums if ((nums<20));then echo "輸入不能小於20" elif ((nums>25))&&((nums<42));then echo "25==42" else echo "恭喜" fi

## 注意:if判斷時 除了可以用”(( ))”的形式外,還可以使用”[ ]”。但是就不能使用>, < , = 這樣的符號了,要使用 -lt (小於),-gt (大於),-le (小於等於),-ge (大於等於),-eq (等於),-ne (不等於) read -p "請輸入數字:" nums if [ $nums -lt 20 ];then echo "輸入不能小於20" elif [ $nums -gt 25 ] && [ $nums -lt 42 ];then echo "25==42" else echo "恭喜" fi
運行結果
注釋: -lt (小於),-gt (大於),-le (小於等於),-ge (大於等於),-eq (等於),-ne (不等於)
實例10:判斷文檔屬性
# 格式為: if [ -e filename ] ; then # -e :判斷文件或目錄是否存在 if [ -e touchfile.sh ];then echo "touchfile.sh 文件存在" fi #-d :判斷是不是目錄,並是否存在 if [ -d touchfile.sh ];then echo "是目錄" else echo "touchfile.sh 不是目錄" fi #-f :判斷是否是普通文件,並存在 if [ -f touchfile.sh ];then echo "touchfile.sh 是普通文件" fi #-r :判斷文檔是否有讀權限 if [ -r touchfile.sh ];then echo "touchfile.sh 有讀權限" fi #-w :判斷是否有寫權限 if [ -w touchfile.sh ];then echo "touchfile.sh 有寫權限" fi #-x :判斷是否可執行 if [ -x touchfile.sh ];then echo "touchfile.sh 是可執行文件" fi
運行結果
實例11: 邏輯判斷 case; 不限制value的個數(用於編寫系統服務的啟動腳本)

case 變量 in value1) command ;; value2) command ;; value3) command ;; *) command ;; esac
read -p "奇偶判斷,請輸入一個數值:" nums r=$[$nums%2] case $r in 1) echo "奇數" ;; 0) echo "偶數" ;; esac
運行結果
實例12: for 循環

for 變量名 in 循環的條件; do command done
# 腳本中的seq 1 5 表示從1到5的一個序列 for i in `seq 1 5`;do echo $i done
運行結果
for i in `ls`; do echo $i; done #for i in `cat test.txt`; do echo $i; done
運行結果
實例13: while 循環

while 條件; do command done

while :; do command done
a=7 while [ $a -ge 1];do echo "$a" a=$[$a-2] done
運行結果
實例14: 函數

# 函數 function 函數名() { command } # 調用 函數名 $1 $2 # 執行 sh shread.sh value1 value2
function sun(){ sum=$[$1 + $2] echo $sum } sun $1 $2
運行結果
拓展
問題1:變量未找到:test.sh: line 2: var_name: command not found
問題原因:等號兩遍的變量名和值 之間不能存在空格
知識點:
# 查看日歷
cal # 查看當月日歷 cal 2022 # 查看年份日歷
運行結果
# 輸出重定向和追加數據
>:輸出重定向,以覆蓋的形式一個文件的內容寫入到另一個文件 >>:追加:將文件的內容追加到另一個文件的末尾 語法: ls -l >文件 將列表的內容寫入到文件(覆蓋原有內容) ls -al >>文件 將列表的內容追加到文件的末尾 cat 文件1 > 文件2 將文件1的內容寫入到文件2中(覆蓋后者文件的內容) echo "內容" >> 文件 將內容追加到文件中