Shell腳本學習筆記(2)——Shell變量以及程序語句詳解

上兩篇文章詳細介紹了Linux的常用命令以及Shell的基本認識。
Linux常用命令:https://blog.csdn.net/weixin_44895651/article/details/105289038
Shell基礎:https://blog.csdn.net/weixin_44895651/article/details/105931755

Shell變量

       Shell允許用戶建立變量存儲數據,但是不支持數據類型(整形、字符、浮點型),將任何變量的值都解釋爲一個字符串
       Shell變量不需要向C語言中那樣需要提前定義,Shell變量可以直接賦值。
例如:

count=1#定義一個count變量,並且賦值爲1
echo $count#打印變量的值

DATE=date#定義一個DATE變量,並且把日期賦值給該變量(屬於命令置換)
echo $DATE#打印日期

       打印Shell變量必須加上$符號,如果不加該符號會默認打印該字符串。同時等號兩邊不加空格。
Bourne Shell的四種變量:

  • 用戶自定義變量
           在Shell編程中通常使用全大寫變量,方便識別
           變量的調用:在變量前加$符號
           Linux Shell/bash從右向左賦值
$Y=y
$ X=$Y
$ echo $X
y

       使用unset命令刪除變量的賦值

$ Z=hello
$ echo ¥Z
hello
$ unset Z#刪除變量

  • 位置變量(命令行參數)
參數 意義
$0 與鍵入命令行一樣,包含腳本文件名
$1,$2,…$9 分別包含第一個到第九個命令行參數
$# 包含命令行參數的個數
$@ 包含命令行參數:“$1,$2,…$9 ”
$? 包含前一個命令行的退出狀態
$* 包含所有命令行參數:“ $1,$2,…$9”
$$ 包含正在執行進程的ID號

        當參數數量超過兩位數時,需要加上大括號

  • 環境變量
           在使用系統時,已經在腳本中提前寫好的一些環境變量。
    常用的Shell環境變量:
變量名 作用
HOME /etc/passwd文件中列出用戶主目錄
IFS 默認爲空格,tab及換行符
PATH Shell搜索路徑
PS1,PS2 默認提示符($)及換行提示符(>)
TERM 終端類型,常用的有vt100,ansi,vt200,xterm等

Shell程序和語句

       Shell程序由零或者多條Shell語句構成。Shell語句包括三類:

       說明性語句:以#開始到改行結束,不被執行(除腳本第一行告訴系統用那種類型的Shell來執行

       功能性語句:任意shell命令、用戶程序或者其它shell程序。

       ① read從標準輸入讀入一行,並且賦值給後面的變量,語法爲:

read var#把讀入的數據全部賦給var
read var1 var2 var3#把讀入的第一個單詞賦值給var1,第二個賦值給var2...

       注意:如果執行read語句時標準輸入無數據,則程序在此處停留,直到數據到來或者被終止執行。

#輸入一個變量:
#!/bin/bash
echo 'input a number'
read NUM
echo $NUM
#輸入多個變量:
#!/bin/bash
echo 'input year month day'
read Y M D
echo "today is $Y-$M-$D"

注意:如果變量輸入多了,多餘的值全部賦值給最後一個變量。
       ②算數運算命令expr主要用於簡單的整數運算,包括加(+)、減(-)、乘(*)、除(/)和求模(%)等。

#!/bin/bash
A='expr 3 + 5 \* 4'#注意運算符兩邊必須有空格
echo $A

       注意:變量賦值沒有空格,算數運算符兩側有空格

       ③test測試語句:
       測試對象:字符串、整數、文件屬性

test '$answer' = 'yes'#測試變量answer是否爲字符串類型
test $num -eq 18#測試變量num是否爲整數18
test -d tmp#測試tmp是否爲一個目錄名

       字符串測試:

命令 測試內容
s1 = s2 測試兩個字符串的內容是否完全一樣
s1 != s2 測試兩個字符串內容是否有差異
-z s1 測試字符串的長度是否爲0
-n s1 測試s1字符串長度是否不爲0

       整數測試:

命令 測試內容
a -eq b 測試a和b是否相等
a -nq b 測試a和b是否不相等
a -gt b 測試a是否大於b
a -ge b 測試a 是否大於等於b
a -lt b 測試a是否小於b
a -le b 測試a是否小於等於b

       文件測試:

命令 測試內容
-d name 測試name文件是否爲一個目錄
-e name 測試一個文件是否存在
-f name 測試name文件是否爲普通文件
-L name 測試name文件是否爲符號鏈接
-r name 測試name文件是否存在且可讀
-w name 測試name 文件是否是否存在且可寫
-x name 測試name文件是否存在且尚可執行
-s name 測試name文件是否存在且長度不爲0
f1 -nt f2 測試文件f1是否比f2文件更新
f1 -ot f2 測試文件f1是否比f2更舊

       結構性語句:條件測試語句、多路分支語句、循環語句、循環控制語句等。
       ① 條件語句:

語法結構 1:
if 表達式
	then 命令表
fi
說明:
- 如果表達式爲真,則執行命令表中的命令;負責退出if語句,即執行fi後面的語句
- if和fi是條件語句的句號括號,必須成對使用
- 命令表中的命令可以是一條也可以是若干條

語法結構 2:
if 表達式
then 命令表1
else 命令表1
fi
- 如果表達式爲真,則執行命令表1中的命令,再退出if語句;負責執行命令表2中的語句,再退出if語句

       注意:在Shell中表達式爲真——爲0即爲真。可以是一條,也可以是多條表達式來判斷。同時也可以像C語言一樣進行嵌套

if [ $# -ne 1 ] #如果沒有提供文件名的話則給用戶提示
then
    echo 'usage:$0 filename'
    exit
fi

if [ -e $1 ] #測試文件是否存在
then
    echo '$1 not exit'
    exit
fi

if [ -L $1 ] #測試文件是否爲一個鏈接文件
then
    echo 'l'
elif [ -d $1 ]
then
    echo 'd'
elif [ -f $1 ]
then
    echo '-'
elif [ -b $1 ]
then
    echo 'b'
else
    echo 'd'
fi

       ② 多路分支語句 case…esac
       多路分支語句case用於多重條件測試,語法結構清晰自然。其語法爲:

case 字符串變量 in
	模式1)
		命令表1
		;;
	模式2|模式3)
		命令表2
		;;
	......
	模式n)
		命令表n
		;;
esac

       注意:case語句只能檢測字符串變量;各模式中可用文件名元字符,以右括號結束;命令行以單獨的雙分號行結束,退出case語句;模式n常寫爲字符*表示所有其它模式;最後一行雙分號可以省略

echo -n 'please choose (yes|no)?' #-n是不換行
read R
case $R in
    yes | y | Y | YES )
          echo 'yes'
          ;;
    no | n | NO | N )
          echo 'no'
          ;;
    *)
          echo 'wrong'
esac

       ③ 循環語句

       當循環次數已知或確定時,使用for循環語句來多次執行一條或者一組命令。循環體由語句do和done來限定。格式如下:

for 變量名 in 單詞表
	do
		命令表
	done

       變量依次取單詞表中的各個單詞,每取一次單詞,就執行一次循環體中的命令。循環次數由單詞表中的單詞個數確定。命令表中的命令可以是一條,也可以是由分號或者換行符分開的多條。

#方法一:
SUM=0
for I in $(seq 0 2 100) #實現的功能是for(I=0;I<=100;I=I+2)
do
    echo $I
   SUM=$SUM+$I
done
echo $[SUM]

#方法二:
SUM=0
for ((I = 1; I <= 100 ; I=I+2))
do
    echo $I
    SUM=$SUM+$I
done
echo $[SUM]

       當不知道循環次數時,我們選擇使用while循環。循環語法結構如下:

while 命令或表達式
	do
		命令行
	done

       while循環首先測試其後的命令或表達式的值,如果爲真,就執行一次循環體中的命令,然後測試該命令或表達式的值,執行循環體,直到該命令或表達式爲假時退出循環。
       while語句的退出狀態爲命令表中被執行的最後一條命令的退出狀態

SUM=0
I=100
while [ $I -ge 0 ] #判斷變量I是否大於等於0
do
    SUM=$SUM+$I
    I=$(($I-2))
done
echo $[SUM]

       這幾段代碼中有關於變量運算的知識,具體的請戳鏈接:Linux Shell之數字加減文章中有詳細介紹。
      ④循環控制語句break和continue

break n #跳出n層
continue語句則馬上轉到最近一層循環語句的下一輪循環上。
continue n#轉到最近n層循環語句的下一輪循環上
I=1
while [ $I -lt 5 ]
do
    J=1
    while [ $J -lt 5 ]
    do
        J=$(($J+1))
        if [ $J -gt 3 ]
        then
            break 2 #跳出兩層循環
        fi
        echo "$I-$J"
    done
    I =$(($I+1))
done

       輸出結果:
在這裏插入圖片描述

       不積小流無以成江河,不積跬步無以至千里。而我想要成爲萬里羊,就必須堅持學習來獲取更多知識,用知識來改變命運,用博客見證成長,用行動證明我在努力。
       如果我的博客對你有幫助、如果你喜歡我的博客內容,請“點贊” “評論” “收藏”三連哦!聽說點讚的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章