極簡Shell編程入門

1. Shell 概述

  • Shell 是一個命令行解釋器,接收應用程序/用戶命令,調用操作系統內核
  • Shell 也是一種編程語言,易編寫、易調試、靈活性強

2. Shell 腳本入門

  1. 腳本格式

    腳本以 #!/bin/bash開頭(指定 Shell 的解析器)

  2. helloworld

    需求:創建 Shell 腳本,輸出 helloworld

    1. 編寫腳本

      root@iZwz9guplfkml2vvggil90Z:~# vi helloworld.sh
      
      #!/bin/bash
      echo "helloworld"
      
    2. 執行腳本

      1. 使用 bash 命令

        root@iZwz9guplfkml2vvggil90Z:~# bash helloworld.sh 
        helloworld
        
      2. 直接執行

        # 賦予腳本可執行權限
        root@iZwz9guplfkml2vvggil90Z:~# chmod 777 helloworld.sh 
        # 執行腳本
        root@iZwz9guplfkml2vvggil90Z:~# ./helloworld.sh 
        helloworld
        
  3. 多命令處理

    需求:在 /root 目錄下創建 ddd 文件,在 ddd 文件中增加 “I’m ddd”

    root@iZwz9guplfkml2vvggil90Z:~# vi ddd.sh
    
    #!/bin/bash
    cd /root
    touch ddd
    echo "I'm ddd" >> ddd
    

3. Shell 中的變量

1. 系統變量

# $HOME,輸出家目錄
root@iZwz9guplfkml2vvggil90Z:~# echo $HOME
/root
# $PWD,輸出當前路徑
root@iZwz9guplfkml2vvggil90Z:/opt# echo $PWD
/opt
# $SHELL,輸出當前Shell解析器所在位置
root@iZwz9guplfkml2vvggil90Z:~# echo $SHELL
/bin/bash
# $USER,輸出當前用戶名
root@iZwz9guplfkml2vvggil90Z:~# echo $USER
root

2. 自定義變量

  1. 基本語法

    #定義變量:變量=值
    root@iZwz9guplfkml2vvggil90Z:~# c=2
    #撤銷變量:unset 變量
    root@iZwz9guplfkml2vvggil90Z:~# unset c
    #聲明靜態變量:readonly 變量,注意靜態變量不能被 unset
    root@iZwz9guplfkml2vvggil90Z:~# readonly w=2
    #使用變量:$變量名字
    root@iZwz9guplfkml2vvggil90Z:~# echo $w
    2
    
  2. 變量定義規則

    • 變量名可以由字母、數字和下劃線組成,但是不能以數字開頭,環境變量建議大寫

    • 等號兩側不能有空格

      root@iZwz9guplfkml2vvggil90Z:~# c = 2
      c: command not found
      root@iZwz9guplfkml2vvggil90Z:~# c= 2
      2: command not found
      root@iZwz9guplfkml2vvggil90Z:~# c =2
      c: command not found
      
    • 變量默認爲字符串類型,無法直接進行數值計算

      root@iZwz9guplfkml2vvggil90Z:~# h=1+2
      root@iZwz9guplfkml2vvggil90Z:~# echo $h
      1+2
      
    • 變量的值如果有空格,需要使用雙引號或單引號括起來

      root@iZwz9guplfkml2vvggil90Z:~# h=h h h
      h: command not found
      root@iZwz9guplfkml2vvggil90Z:~# h="h h h"
      root@iZwz9guplfkml2vvggil90Z:~# echo $h
      h h h
      

3. 特殊變量

1. $n

$n,n爲數字,$0代表該腳本名稱,$1~$9代表第一到第九個參數,十以上的參數需要大括號括起來,如${10}

root@iZwz9guplfkml2vvggil90Z:~# vi para.sh

#!/bin/bash
  
echo "$0 $1 $2"

root@iZwz9guplfkml2vvggil90Z:~# bash para.sh p1 p2
para.sh p1 p2
2. $#

$#,獲取所有輸入參數個數

root@iZwz9guplfkml2vvggil90Z:~# vi para.sh 

#!/bin/bash
echo $#
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1
1
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1 s2 s3
3
3. $*、$@
  • $*:代表命令行中所有的參數,把所有參數看成一個整體
  • $@:代表命令行中所有的參數,但是把每個參數區分看待
root@iZwz9guplfkml2vvggil90Z:~# vi para.sh 

#!/bin/bash
echo $*
echo $@
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1 s2 s3
s1 s2 s3
s1 s2 s3
4. $?

$?,返回上一次執行的命令的返回狀態,值爲0,證明上一個命令執行正確,反之

root@iZwz9guplfkml2vvggil90Z:~# echo $w
2
# 上一個命令執行成功,返回 0
root@iZwz9guplfkml2vvggil90Z:~# echo $?
0
root@iZwz9guplfkml2vvggil90Z:~# h = 22
h: command not found
# 上一個命令執行失敗,返回非 0
root@iZwz9guplfkml2vvggil90Z:~# echo $?
127

4. 運算符

  • $((運算式)) 或 $[運算式]
  • expr 表達式1 +,-,\*,/,% 表達式2
# 計算2+3
root@iZwz9guplfkml2vvggil90Z:~# echo $((2+3))
5
# 計算3-2
root@iZwz9guplfkml2vvggil90Z:~# echo $[3-2]
1
# 計算 2*3,注意空格
root@iZwz9guplfkml2vvggil90Z:~# expr 2 \* 3
6
# expr 計算 (2+3)*4
root@iZwz9guplfkml2vvggil90Z:~# expr `expr 2 + 3` \* 4
20
# $[] 計算 (2+3)*4
root@iZwz9guplfkml2vvggil90Z:~# echo $[(2+3)*4]
20

5. 條件判斷

  1. 基本語法:

    [ condition ],[] 返回 false

    注意:condition 前後都有空格

  2. 常用判斷條件

    1. 兩個整數之間比較
      • -lt 小於(less than)
      • -le 小於等於(less equal)
      • -eq 等於(equal)
      • -gt 大於(greater than)
      • -ge 大於等於(greater equal)
      • -ne 不等於(Not equal)
    2. 按照文件權限進行判斷
      • -r 有讀的權限(read)
      • -w 有寫的權限(write)
      • -x 有執行的權限(execute)
    3. 按照文件類型進行判斷
      • -f 文件存在並且是一個常規的文件(file)
      • -e 文件存在(existence)
      • -d 文件存在並是一個目錄(directory)
  3. 案例實操

    && 表示前一條命令執行成功時,才執行後一條命令,|| 表示上一條命令執行失敗後,才執行下一條命令

    #23 是否大於等於 22
    root@iZwz9guplfkml2vvggil90Z:~# [ 23 -ge 22 ] && echo "true" || echo "false"
    true
    #para.sh 是否具有寫權限
    root@iZwz9guplfkml2vvggil90Z:~# [ -w para.sh ] && echo "true" || echo "false"
    true
    #/root/shell/ccc.txt 文件是否存在
    root@iZwz9guplfkml2vvggil90Z:~# [ -f /root/shell/ccc.txt ] && echo "true" || echo "false"
    false
    

6. 流程控制

1. if

基本語法:

if [ 條件判斷式1 ]
then 
   #do something..
elif [ 條件判斷式2 ]
then 
   #do something..
else
   #do something..
fi

注意事項:

  1. if 後必須有空格
  2. [ 條件判斷式 ],中括號和條件判斷式之間必須有空格
  3. then 寫 [ 條件判斷式 ] 中間一定加 ;
# 輸入一個數字,如果是1,輸出"1";如果是2,輸出"2",如果是其他,什麼也不輸出
root@iZwz9guplfkml2vvggil90Z:~# vi if

#!/bin/bash
  
if [ $1 -eq 1 ]
then
   echo "1"
elif [ $1 -eq 2 ]
then
   echo "2"
fi

root@iZwz9guplfkml2vvggil90Z:~# bash if 2
2
root@iZwz9guplfkml2vvggil90Z:~# bash if 1
1

2. case

基本語法:

case $變量名 in
"值1")
   #do something..
   ;;
"值2")
   #do something..
   ;;
....
*)
   #do something..
   ;;
esac

注意事項:

  1. case 行尾必須爲 in
  2. 每一種模式匹配以 ) 結束
  3. ;; 相當於 Java 中的 break
  4. *) 表示默認模式,相當於 Java 中的 default
# 輸入一個數字,如果是1,輸出"1";如果是2,輸出"2",如果是其他,輸出"666"
root@iZwz9guplfkml2vvggil90Z:~# vi case

#!/bin/bash
  
case $1 in
1)
  echo "1"
  ;;
2)
  echo "2"
  ;;
*)
  echo "666"
;;
esac

root@iZwz9guplfkml2vvggil90Z:~# bash case 1
1
root@iZwz9guplfkml2vvggil90Z:~# bash case 2
2
root@iZwz9guplfkml2vvggil90Z:~# bash case 3
666

3. for

基本語法1:

for((初始值;循環控制條件;變量變化))
   do
     #do something...
   done
# 從1加到100
sdbserver1:~ # vi loop.sh

#!/bin/bash

s=0
for((i=1;i<=100;i++))
  do
    s=$[$s+$i]
  done
echo $s

sdbserver1:~ # bash loop.sh 
5050

基本語法2:

for 變量 in 值1 值2...
  do
     #do something...
  done
# 從1加到100
sdbserver1:~ # vi loop.sh

#!/bin/bash

s=0
for i in {1..100}
  do
    s=$[$s+$i]
  done
echo $s

sdbserver1:~ # bash loop.sh 
5050

4. while

基本語法:

while [ 條件判斷式 ]
  do
      #do something...
  done
# 從1加到100
sdbserver1:~ # vi while.sh

#!/bin/bash

s=0
i=1
while [ $i -le 100 ]
  do
    s=$[$i+$s]
    i=$[$i+1]
  done
echo $s

sdbserver1:~ # bash while.sh 
5050

參考資料:

  1. 尚硅谷 Shell 課程
  2. 菜鳥課程 Shell 課程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章