shell 編程

1. 概述

Shell 是一個使用C語言的程序, 是用戶使用 Linux 的橋梁, Shell 是一種命令語言.

  • Shell 腳本
    Shell 腳本(shell script)是一種為 shell 編寫的腳本程序.
    Shell 編程和Java, PHP 一樣, 只要有一個可編寫的文本編輯器和能解釋執(zhí)行腳本解釋器可以了.
  • shell 種類
    • Bourne Shell (/usr/bin/sh)
    • Bourne Again Shell (bin/bash)
    • C Shell (/usr/bin/csh)
    • K Shell (/usr/bin/ksh)
    • Shell for Root (/sbin/sh)
  • 運行Shell 腳本有兩種方法
  1. 作為可執(zhí)行程序
# chmod +x ./a.sh
# ./a.sh
  1. 作為解釋器的參數(shù)
  • shell 腳本頭部分添加
#!/bin/bash
  • 執(zhí)行
# /bin/bash a.sh

2. Shell 變量

2.1 shell 變量定義

  • 變量名和等號之間不可以不可以有空格,
  • 變量名
    • 命名只可以使用英文字母, 數(shù)字, 下劃線, 首個字符不可以為數(shù)字
    • 中間不可以使用空格, 可以使用下劃線
    • 不可以使用標點符號
    • 不可以使用bash 關(guān)鍵字

2.2 使用變量

  • 使用變量是 在變量名前面加上$符號:
  • 可以使用{} 符號包裹變量名
name='fangfc'
echo $name
echo ${name}
  • 編輯shell
[fangfc@node10009 shell]$ vim test1.sh
    #!/bin/sh
    name='fangfc'
    echo $name

[fangfc@node10009 shell]$ chmod a+x test1.sh 
[fangfc@node10009 shell]$ ./test1.sh 
fangfc
[fangfc@node10009 shell]$ 

2.3 變量類型

shell 存在三種變量:

  1. 局部變量:
    • 局部變量存在于腳本或命令中定義, 僅在當前shell 實例中有效, 其他shell 啟動的程序不能訪問局部變量.
  2. 環(huán)境變量
    • 所有的程序, 包含shell啟動的程序, 都能訪問環(huán)境變量, 有些程序需要環(huán)境變量來保證正常運行, 必要的時候 shell 也可以定義環(huán)境變量
  3. shell 變量
    • shell 變量是由shell程序設(shè)置的特殊變量, shell 變量中有一部分是環(huán)境變量, 有一部分是局部變量, 這些變量保證了shell 正常運行.

2.4 字符串定義

  • 字符串時shell 編程最常用的數(shù)據(jù)類型, 字符串可以使用單引號和雙引號.
  • 單引號:
    • str='this is stirng'
    • 單引號的限制
      • 單引號里的任何字符串都會原樣輸出, 單引號字符串中的變量時無效的.
      • 單引號字符串中 不可使用單引號,
  • 雙引號:
    • str="this is string"
      • 雙引號里面可以使用變量
      • 雙引號可以使用轉(zhuǎn)義字符

2.5 數(shù)組

  • bash 支持一維數(shù)組(不支持多維屬組), 并且沒有數(shù)組大小限制.
  • 和C 語言類似, 屬組元素下標都是從0 開始, 獲取屬組中的元素要利用下標, 下標可以是整數(shù)或算術(shù)表達式, 值應(yīng)當大于0
  1. 定義屬組

    • shell中使用括號() 來表示數(shù)組, 數(shù)組元素使用空格 分割
    • 數(shù)組=(值1 值2 ... 值n)
  2. 使用屬組

  • 讀取格式
${數(shù)組[下標]}
  1. shell 注釋
  • 單行注釋:
    • # 開頭的行就是注釋, 會被解釋器忽略.
    • # 注釋行
  • 多行注釋
:<<EOF
注釋行..
注釋行..
注釋行..
EOF
  • 多行注釋的定界符可以使用其他符號
:<<abc
注釋行...
注釋行...
注釋行...
abc

2.5 示例

  • vim test1.sh
#!/bin/sh
# 這個腳本用于測試變量和注釋
:<<EOF
這里是多行注釋
多行注釋
EOF

name='fangfc'
# 字符串切割
echo ${name:2:3}

# 數(shù)組
arr=(11 22 33 44 'fangfc')
echo ${arr[3]}
echo ${arr[4]}
  • 執(zhí)行
[fangfc@node10009 shell]$ ./test1.sh 
ngf
44
fangfc
[fangfc@node10009 shell]$ 

3. shell 基本運算符

  • shell 支持多種運算符, 包含:
    • 算數(shù)運算符
    • 關(guān)系運算符
    • 布爾運算符
    • 字符串運算符
    • 文件測試運算符

3.1 算數(shù)運算符

+   加法
-   減法
*   乘法
/   除法
%   取余
=   賦值
==  比較運算
!=  不等于

3.2 關(guān)系運算符

關(guān)系運算符支持數(shù)字, 不支持字符串, 關(guān)系運算符需要使用 [ ] 包括.`

-eq     檢測兩個是否相等
-ne     檢測兩個是否 不相等
-gt     檢測是否 大于
-lt     檢測是否 小于
-ge     檢測是否 大于等于
-le     檢測是否 小于等于

3.3 布爾運算符

!       非運算
-o      或運算符, 有一個為 true, 則返回true
-a      與運算符, 兩個都為true, 則返回 true

3.4 邏輯運算符

&&      邏輯 AND
||      邏輯 ||

3.5 字符串運算符

=   檢測兩個字符串是否相等
!=  檢測兩個字符串是否不相等
-z  檢測字符串 是否為空,    為空返回true
-n  檢測字符串是否為不為空, 不為空返回 true

3.6 文件測試運算符

-b file     文件是否為塊設(shè)備
-c file     文件是否為字符設(shè)備
-d file     文件是否為目錄
-g file     文件是否設(shè)置了SGID
-k file     文件是否設(shè)置了粘連位(Sticky Bit)
-p file     文件是否有管道
-u file     文件是否設(shè)置了 SUID
-r file     文件是否可讀
-w file     文件是否可寫
-x file     文件是否可執(zhí)行
-s file     文件是否 為空
-e file     文件(目錄) 是否存在

4. 流程控制

在bash 中使用 if else 作為流程控制

4.1 if 語句

  • 語法
if condition
then 
    command1
    command2
fi
  • 寫成一行
    if [ condition ]; then command1; command2; fi

4.2 if else 語句

  • if else 語法
if condition
then
    command1
    ..
else 
    command2
    ...
fi
  • if elseif else 語法
if condition
then
    command1
elif
    ...
else
    ...
fi
  • 示例
[fangfc@node10009 shell]$ cat test2.sh
#!/bin/sh
a=100
b=200
# if elif 的使用
echo 'if elif'
if [ $a -eq $b ]; then
    echo 'a 等于 b'
elif [ $a -gt $b ]; then
    echo 'a 大于 b'
elif [ $a -lt $b ]; then
    echo 'a 小于 b'
fi
[fangfc@node10009 shell]$ ./test2.sh 
if elif
a 小于 b
[fangfc@node10009 shell]$ 

4.3 for 循環(huán)

  • for 循環(huán)一般格式
for var in item1 item2 ... itemN
do
    command1
    ...
done
  • 變量列表中, for 循環(huán)執(zhí)行一次所有命令, 使用變量名獲取列表中的值, 命令可以使用

  • 示例:

[fangfc@node10009 shell]$ cat test3.sh 
#!/bin/sh
for val in 100 101 102 103 104
do
   echo $val
done
[fangfc@node10009 shell]$ ./test3 .sh 
100
101
102
103
104
[fangfc@node10009 shell]$ 

4.4 while 語句

  • while 循環(huán)不斷執(zhí)行一系列命令, 也用于從輸入文件中讀取數(shù)據(jù), 命令通常為測試條件
  • 格式:
while condition
do
    command
done
  • 示例
[fangfc@node10009 shell]$ cat  test4.sh
#!/bin/sh
i=0
num=1
while (( $num<=5 ))
do
    echo $num
    num=`expr $num + 1`
done
[fangfc@node10009 shell]$ ./test4.sh 
1
2
3
4
5
[fangfc@node10009 shell]$ 

4.5 until 循環(huán)

until 循環(huán)執(zhí)行一系列命令, 知道條件為 True 停止,

  • until 循環(huán)和 while 循環(huán)在處理方式上相反,
  • 一般while 循環(huán)優(yōu)于

4.6 case

  • case 語句為多選擇語句, 可以使用case 語句匹配一個值與一個模式, 如果匹配成功, 執(zhí)行相匹配的命令.
  • case 語句的格式
case $val in
模式1)
    command1
    ...
    ;;
模式2)
    command2
    ...
    ;;
模式3)
    command3
    ...
    ;;
esac
  • caze 工作方式是 取值后面必須為 in 關(guān)鍵字,

  • 取值將檢測匹配每一個模式, 一旦模式匹配, 相應(yīng)命令不在繼續(xù)其他模式, 如果都不匹配則會被 *) 模式匹配到.

  • 示例

[fangfc@node10009 shell]$ cat ./test5.sh 
#!/bin/sh

# 獲取參數(shù)
if [ $# -eq 0 ]; then
    echo '請輸入攜帶參數(shù):a,b,c'
    break
fi

case $1 in
    'a')
        echo "參數(shù)是$1"
    ;;
    'b')
        echo "參數(shù)是$1"
    ;;
    'c')
        echo "參數(shù)是$1"
    ;;
    *)
        echo '請輸入攜帶參數(shù):a,b,c'
    ;;
esac
[fangfc@node10009 shell]$ ./test5.sh a
參數(shù)是a
[fangfc@node10009 shell]$ 

4.6 跳出循環(huán)

  • 循環(huán)過程中, 可以在未達到循環(huán)條件時 強制跳出循環(huán).
  • break 命令允許跳出循環(huán)(終止執(zhí)行后面的循環(huán))
  • continue 類似于 break 不過不會跳出所有循環(huán), 僅跳出當前循環(huán).

4.7 exit 退出當前shell

  • exit 命令用于退出當前shell, 在shell 腳本中可以終止當前腳本執(zhí)行.
  • 退出時可以指定 退出碼.
  • 退出碼:
0       表示成功
非0      表示失敗

-- 常用的約定的退出碼
2       用法不當
127     命令沒有找到
126     不可執(zhí)行
>=128   信號

END

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,707評論 0 5
  • 搭配《linux就該這樣學》第四章內(nèi)容 1.shell歷史 Shell的作用是解釋執(zhí)行用戶的命令,用戶輸入一條命令...
    木魚_cc閱讀 917評論 0 10
  • .bat腳本基本命令語法 目錄 批處理的常見命令(未列舉的命令還比較多,請查閱幫助信息) 1、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,531評論 1 19
  • Bash內(nèi)置基本變量 PWD : 顯示當前的工作目錄 OLDPWD : 顯示上一次的工作目錄 ~:用戶家目錄 - ...
    魏鎮(zhèn)坪閱讀 1,662評論 0 6
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 6,319評論 0 10

友情鏈接更多精彩內(nèi)容