1. 程式人生 > 其它 >第三節 Linux系統環境下Shell指令碼開發

第三節 Linux系統環境下Shell指令碼開發

第三節 Linux系統環境下Shell指令碼開發

1、Shell程式設計概述

Shell是一個命令列直譯器,它接收應用程式或使用者的命令,然後呼叫作業系統核心。

Shell還是一個功能強大的程式語言,易編寫、易除錯、靈活性強。

① Linux系統提供的Shell解析器

[root@hadoop101 ~]$ cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

其中最常用的是/bin/sh和/bin/bash

② bash和sh的關係

[root@apple w]# ll /usr/bin | grep bash$
-rwxr-xr-x. 1 root root     964544 4月  11 2018 bash
lrwxrwxrwx. 1 root root          4 7月   9 16:42 sh -> bash

sh是bash的軟連結

③ Linux預設的解析器是bash

[root@apple w]# echo $SHELL
/bin/bash

④ Shell語法總述

2、Shell程式設計HelloWorld

① 建立指令碼檔案

通常以.sh作為副檔名。

② 指令碼內容

第一行指定當前指令碼的解析器:

#!/bin/bash

實現具體功能:

echo "hello world"

③ Shell指令碼的執行方式

命令名 在當前程序執行 新建子程序執行
source
.
sh
bash
chmod +x後直接執行

其中“.”是source的另一種寫法。在當前程序中釋出的全域性變數可以在當前程序的其他指令碼中繼續沿用,也可以在子程序中使用;但是子程序export釋出的變數僅限於子程序內部使用。

從上面程序樹中能夠看到,sh、bash、直接執行這三種方式確實是開闢新的子程序執行指令碼中的程式碼。

3、變數

① 系統預定義變數

常用系統變數包括:$USER、$HOME、$PWD、$SHELL等,可以使用echo命令輸出它們的值。

② 使用set命令檢視所有變數

ABRT_DEBUG_LOG=/dev/null
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
……

③ 自定義變數

[1]基本語法

(1)定義變數

USER_NAME=tom

(2)撤銷變數

[root@apple ~]# USER_NAME=tom
[root@apple ~]# echo $USER_NAME
tom
[root@apple ~]# unset USER_NAME
[root@apple ~]# echo $USER_NAME

(3)宣告靜態變數

[root@apple ~]# readonly COMPANY_NAME=atguigu
[root@apple ~]# echo $COMPANY_NAME
atguigu
[root@apple ~]# COMPANY_NAME=uuu
-bash: COMPANY_NAME: 只讀變數
[root@apple ~]# unset COMPANY_NAME
-bash: unset: COMPANY_NAME: 無法反設定: 只讀 variable

不能修改,不能撤銷

[2]語法規則

  • 變數名稱可以由字母、數字和下劃線組成,但是不能以數字開頭,環境變數名建議大寫。
  • 等號兩側不能有空格
  • 在bash中,變數預設型別都是字串型別,無法直接進行數值運算。
  • 變數的值如果有空格,需要使用雙引號或單引號括起來。

④ 特殊變數

[1]$n

n是數字,$0代表當前指令碼名稱。從$1開始代表對應的指令碼引數。從${10}開始數字需要使用{}括起來。

[root@hadoop101 datas]$ touch parameter.sh 
[root@hadoop101 datas]$ vim parameter.sh

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

[root@hadoop101 datas]$ chmod 777 parameter.sh

[root@hadoop101 datas]$ ./parameter.sh cls  xz
./parameter.sh  cls   xz

[2]$#

返回輸入引數的個數

[root@hadoop101 datas]$ vim parameter.sh

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

[root@hadoop101 datas]$ chmod 777 parameter.sh

[root@hadoop101 datas]$ ./parameter.sh cls  xz
parameter.sh cls xz 
2

[3]$*和$@

都能夠返回全部引數,但是隻有在迴圈中且放在引號中能夠體現出它們的區別。

[root@hadoop101 datas]$ vim parameter.sh

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

[root@hadoop101 datas]$ bash parameter.sh 1 2 3
parameter.sh  1   2
3
1 2 3
1 2 3

[4]$?

返回上一條命令的執行結果。

  • 條件判斷語句
    • 返回0表示true
    • 返回1表示false
  • 普通語句
    • 返回0表示成功
    • 返回非0數表示失敗

4、運算子

$((表示式))或$[表示式]

[root@apple ~]# echo $((20+30))
50
[root@apple ~]# echo $(((15+15)*2))
60
[root@apple ~]# echo $[(15+15)*2]
60

5、條件判斷

①基本語法

  • 寫法1:test condition
  • 寫法2:[ condition ]
    • 注意condition前後有空格
    • 空字串視為false,非空字串視為true

②常用判斷條件

資料型別 寫法 含義
數值 -lt less than小於
數值 -le less equal小於等於
數值 -eq equal等於
數值 -gt greater than大於
數值 -ge greater equal大於等於
數值 -ne not equal不等於
檔案 -r read有讀許可權
檔案 -w write有寫許可權
檔案 -x execute有執行許可權
檔案 -f file檔案存在並且是一個常規的檔案
檔案 -e existence檔案存在
檔案 -d directory檔案存在並是一個目錄

6、流程控制

① 三目運算

[root@apple w]# [ 10 -gt 5 ] && echo "10大於5" || echo "10小於5"
10大於5

② if判斷

注意:if後面有空格

[1]單if

if [ 10 -gt 5 ]
then
echo "10大於5"
fi

[2]if...else

if [ 10 -gt 5 ]
then
echo "10大於5"
else
echo "10小於5"
fi

[3]if...elif

if [ 10 -gt 5 ]
then
echo "10大於5"
elif [ 10 -lt 5 ]
then
echo "10小於5"
else
echo "10等於5"
fi

③case判斷

AGE=10
case $AGE in
"10")
echo 10
;;
"20")
echo 20
;;
*)
echo other
;;
esac

④for迴圈

for (( i=1;i<=10;i++ ))
do
echo $i
done
#!/bin/bash
# 如果需要使用外部資料,則需要把外部資料賦值給一個變數,不能在for語句中直接使用
len=$1

for (( i=1;i<=len;i++ ))

# 從do關鍵字開始是迴圈體開始
do

echo $i;

# 到done關鍵字為止是迴圈體結束
done

⑤ for in迴圈

for i in $*
do
echo $i
done

沒有引號的時候$*和$@一樣,加了引號就有區別

for i in "$*"
do
echo $i
done

上面程式碼輸出的結果是:

[root@apple w]# sh shell42.sh a b c d e
a b c d e

"$*"不換行,"$@"有換行。

⑥ while迴圈

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

echo $s

7、函式

Shell程式設計中的函式和我們以前熟悉的函式最大的區別是:Shell程式設計中要求函式的返回值只能是整數。並且只能通過$?方式獲得。可以顯示加:return返回,如果不加,將以最後一條命令執行結果,作為返回值。return後跟數值n(0-255)。

function sum() {
    echo $[$1+$2]
}

sum 10 20

在函式體中,$1、$2等是對函式引數的引用。

#!/bin/bash
# 宣告函式
function sum(){
	# 使用$1、$2引用函式傳入的引數
	return $[$1+$2]
}

# 呼叫函式,傳入引數
sum 10 20

# 使用$?獲取函式執行結果
echo "sum 10 20執行的結果是$?"

8、獲取指令碼外部資料

① 獲取引數

這個前面說過了,通過$1、$2、……方式獲取,從${10}開始需要使用大括號。

② 使用read讀取使用者輸入

read命令有兩個常用引數

  • -t用於指定輸入等待時間,單位是秒
  • -p用於指定提示文字
read -t 10 -p "please enter:" NAME
echo $NAME