【Linux】shell 腳本 (.sh) 編寫及執行


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)
touchfile.sh

  運行結果

  

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)"
以時間命名每隔2s創建1個文件

  運行結果

  

 

  

 實例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
elif (())
## 注意: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
if else elif []

  運行結果

  

注釋: -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 "內容" >> 文件        將內容追加到文件中

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM