Shell腳本編程筆記

字號+ 編輯: 国内TP粉 修訂: 种花家 來源: 雨燕 2023-09-07 我要說兩句(0)

變量

變量的定義

變量名的命名槼則

字母、數字、下劃線

不以數字開頭

變量的賦值,不區分類型,等號兩側不允許出現空格

爲變量賦值的過程,稱爲變量替換

變量名=變量值

a=123

使用let爲變量賦值

let a=10+20

使用let可以計算等號右側的值

將命令賦值給變量

l=ls

將命令結果賦值給變量,使用$()或者``

letc=$(ls -l /etc)

將命令賦值給變量,通過訪問變量去執行命令可以節省系統資源開銷

變量值有空格等特殊字符可以包含在””或’’中

變量的引用

${變量名}稱作對變量的引用

echo ${變量名}查看變量的值

${變量名}在部分情況下可以省略大括號,例如變量名後面沒有跟其他字符的時候

變量的作用範圍

默認作用範圍

定義變量的當前shell

變量的導出

export 變量名

可以使變量在其父進程shell和子進程shell都生效

變量的刪除

unset 變量名

刪除變量

系統環境變量

環境變量配置文档

數組

定義數組

IPTS=( 10.0.0.1 10.0.0.2 10.0.0.3 )

顯示數組的所有元素

echo ${IPTS[@]}

顯示數組元素的個數

echo ${#IPTS[@]}

顯示數組的第一個元素

echo ${IPTS[0]}

運算符

賦值運算符

= 賦值運算符,用於算數賦值和字符串賦值

使用unset取消爲變量的賦值

= 除了作爲賦值運算符還可以作爲測試操作符

算數運算符

基本運算符

* + - * / ** %

使用expr進行運算

expr 4 + 5

符號左右要有空格,只支持整數,不支持浮點數

num=`expr 4 + 5`

數字常量

let “變量名=變量值”

變量值使用0開頭爲八進制

變量值使用0x開頭爲十六進制

雙圓括號

(( a=10 ))

(( a++ ))

echo $((10+20))

(( a=4+5 ))

test比較

退出與退出狀態

退出程序命令

exit

exit 10 返回10給shell,返回值非0爲不正常退出

$?判斷當前shell前一個進程是否正常退出

測試命令test

test命令用於檢查文档或者比較值

test可以做以下測試

文档測試

整數比較測試

字符串測試

test測試語句可以簡化爲[]符號

-z STRING

字符串長度爲0

STRING1 = STRING2

字符串相等,區分大小寫

STRING1 != STRING2

字符串不相等,區分大小寫

INTEGER1 -eq INTEGER2

整數1等於整數2

INTEGER1 -ge INTEGER2

整數1大於等於整數2,如果使用>=,需使用[[]]

INTEGER1 -gt INTEGER2

整數1大於整數2,如果使用>,需使用[[]]

INTEGER1 -le INTEGER2

整數1小於等於整數2,如果使用<=,需使用[[]]

INTEGER1 -lt INTEGER2

整數1小於整數2,如果使用<,需使用[[]]

INTEGER1 -ne INTEGER2

整數1不等於整數2

-e FILE

文档存在,不區分文档和目錄

-d FILE

文档存在並且是一個目錄

-f FILE

文档存在並且是一個普通文档

[]符號還有擴展寫法[[]]支持&&、||、<、>

使用if-then語句

if [ 測試條件成立 ] 或 命令返回值是否爲0

then 執行相應命令

fi 結束

代碼示例:

輸出root

[root@localhost ~]# if [ $UID = 0 ]
> then
>     echo root
> fi
root
   

什麽也沒有輸出

[root@localhost ~]# su - vagrant
Last login: 二 10月 22 02:11:36 UTC 2019 from 10.0.2.2 on pts/0
[vagrant@localhost ~]$ if [ $UID = 0 ]
> then
>     echo root
> fi

   

執行

[vagrant@localhost ~]$ if pwd
> then
>     echo success
> fi
/home/vagrant
success

   

未執行

     [vagrant@localhost ~]$ if pwd1
> then
>     echo success
> fi
-bash: pwd1: command not found
   

使用if-then-else語句

使用if-then-else語句可以在條件不成立時也運行相應的命令

if [ 測試條件成立 ]

then 執行相應命令

else 測試條件不成立,執行相應命令

fi 結束

代碼示例:

root用戶

[root@localhost ~]# if [ $USER = root ] ; then
> echo root user
> echo $UID
> else
> echo other user
> echo $UID
> fi
root user
0

普通用戶

[root@localhost ~]# su - vagrant
Last login: Wed Oct 23 03:59:20 UTC 2019 on pts/0
[vagrant@localhost ~]$ if [ $USER = root ] ; then
>     echo root user
>     echo $UID
> else
>     echo other user
>     echo $UID
> fi
other user
1000


使用if-then-elif-then-else語句可以在條件不成立時也運行相應的命令

if [ 測試條件成立 ]

then 執行相應命令

elif [ 測試條件成立 ]

then 執行相應命令

else 測試條件不成立,執行相應命令

fi 結束

[vagrant@localhost ~]$ if [ $USER = root ] ; then
>     echo root user
>     echo $UID
> elif [ $USER = vagrant ] ; then
>     echo vagrant user
>     echo $UID
> else
>     echo other user
>     echo $UID
> fi
vagrant user
1000


   

嵌套if語句

if條件測試中可以再嵌套if條件測試

if [ 測試條件成立 ]

then 執行相應命令

if [ 測試條件成立 ]

then 執行相應命令

fi

fi 結束

代碼示例:

[vagrant@localhost ~]$ if [ $USER = root ] ; then
>     echo root user
>     echo $UID
> else
>     if [ $USER = vagrant ] ; then
>         echo vagrant user
>         echo $UID
>     fi
>     echo other user
> fi
vagrant user
1000
other user


分支

case 語句和select 語句可以構成分支

case “$變量” in

“情況1” )

命令…

;;

“情況2” )

命令…

;;

*)

命令…

;;

esac

代碼示例:

#!/bin/bash
# demo
case "$1" in
    "START" | "start")
        echo $0 start...
        ;;
    "stop")
        echo $0 stop...
        ;;
    "restart" | "reload")
        echo $0 restart...
        ;;
    *)
        echo "Usage: $0 {start | stop | restart | reload}"
        ;;
esac

循環

使用 for 循環遍歷命令的執行結果

for 循環的語法

for 參數 in 列表

do 執行的命令

done 封閉一個循環

使用反引號或$()方式執行命令,命令的結果當做列表進行處理

使用 for 循環遍歷變量和文档的内容

列表中包含多個變量,變量用空格分隔

對文本處理,要使用文本查看命令取出文本内容

默認逐行處理,如果文本出現空格會當做多行處理

代碼示例:

[root@localhost ~]# touch a.mp3 b.mp3 c.mp3
[root@localhost ~]# for filename in `ls *.mp3`
> do
>     mv $filename $(basename $filename .mp3).mp4
> done


   

C 語言風格的 for 循環

for ((變量初始化;循環判斷條件;變量變化))

do

循環執行的命令

done

代碼示例:

[root@localhost ~]# for ((i=1;i<=10;i++))
> do
>     echo $i
> done


   

while 循環

while test測試是否成立

do

命令

done

代碼示例:

[root@localhost ~]# while [ a -lt 10 ]

do
(( a++ ))
echo $a
done
1


死循環

代碼示例:

   [root@localhost ~]# while :
> do
>     echo hello
> done
   

until 循環

until 循環與 while 循環相反,循環測試爲假時,執行循環,爲真時循環停止

代碼示例:

[root@localhost ~]# a=1
[root@localhost ~]# until [ $a -gt 5 ]
> do
>     (( a++ ))
>     echo $a
> done

break 和 continue 語句

循環的使用

循環和循環可以嵌套

循環中可以嵌套判斷,反過來也可以嵌套

循環可以使用break和continue語句在循環中退出

代碼示例:

break
   [root@localhost ~]# for a in {1..9} ; do
>     if [ $a eq 5 ] ; then
>         break
>     fi
>     echo $a
> done    
continue
   [root@localhost ~]# for a in {1..9} ; do
>     if [ $a eq 5 ] ; then
>         continue
>     fi
>     echo $a
> done

   

使用循環對命令行參數的處理

命令行參數可以使用 $1 $2 … ${10} … $n 進行讀取

$0 代表腳本名稱

$* 和 $@ 代表所有位置參數

$# 代表位置參數的數量

代碼示例:

#!/bin/bash
# demo
# for pos in $*
# do
#     if [ "$pos" = "hello" ] ; then
#         echo $pos $pos
#     fi
# done
while [ $# -ge 1 ]
do
    if [ "$1" = "hello" ] ; then
        echo $1 $1
    fi
    shift
done


函數

自定義函數

函數用於 ”包含“ 重複使用的命令集合

自定義函數

function fname(){
   命令
}

函數的執行

fname

函數作用範圍的變量

local 變量名

函數的參考

$1 $2 $3 … $n

代碼示例:

#!/bin/bash

# demo
checkpid() {
    local i
    for i in $* ; do
        [ -d "/proc/$i" ] && return 0
    done
    return 1
}

閲完此文,您的感想如何?
  • 有用

    0

  • 沒用

    0

  • 開心

    0

  • 憤怒

    0

  • 可憐

    0

1.如文章侵犯了您的版權,請發郵件通知本站,該文章將在24小時内刪除;
2.本站標注原創的文章,轉發時煩請注明來源;
3.交流群: 2702237 13835667

相關課文
  • 防止退出linux終耑退出之後導致的nohup進程強制退出

  • Linux系統下word文档轉成pdf的辦法

  • ubuntu和debian安裝nginx或者tengine報錯, 找不到pcre依賴庫的解決辦法

  • 常見的web中間件請求返回狀態碼

我要說說
網上賓友點評