什麼是Shell指令碼?

luashin發表於2016-04-03
前言 
   Shell Script,Shell指令碼與Windows及Dos下的批處理相似,也就是用各類命令預先放入到一個檔案中,方便一次性執行的一個程式檔案,主要是方便管理員進行設定或者管理用的。但是它比Windows下的批處理更強大,比用其他程式設計程式編輯的程式效率更高,畢竟它使用了Linux/Unix下的命令。shell script是利用shell的功能所寫的一個程式,這個程式是使用純文字檔案,將一些shell的語法與指令寫在裡面,然後用正規表示法,管道命令以及資料流重導向等功能,以達到我們所想要的處理目的。
   更明白地來說,shell script就像早期dos年代的.bat,最簡單的功能就是將許多指令彙整寫一起,讓使用者很容易地就能夠一個操作執行多個命令,而shell script更是提供了陣列,迴圈,條件以及邏輯判斷等重要功能,讓使用者可以直接以shell來寫程式,而不必使用類似C程式語言等傳統程式編寫的語法。

概念區別
   Shell和Shell指令碼有什麼區別?確切一點說,Shell就是一個命令列直譯器,它的作用就是遵循一定的語法將輸入的命令加以解釋並傳給系統。它為使用者提供了一個向Linux傳送請求以便執行程式的介面系統級程式,使用者可以用Shell來啟動、掛起、停止甚至是編寫一些程式。 Shell本身是一個用C語言編寫的程式,它是使用者使用Linux的橋樑。Shell既是一種命令語言,又是一種程式設計語言(就是你所說的shell指令碼)。作為命令語言,它互動式地解釋和執行使用者輸入的命令;作為程式設計語言,它定義了各種變數和引數,並提供了許多在高階語言中才具有的控制結構,包括迴圈和分支。它雖然不是 Linux系統核心的一部分,但它呼叫了系統核心的大部分功能來執行程式、建立文件並以並行的方式協調各個程式的執行。

一、Shell指令碼的基本語法
1、編寫個簡單的shell指令碼
[root@xj ~]# vim example.sh
#!/bin/bash
#This is to show waht a example looks like.
echo "our first example"
echo "we are currently in the following directroy"
pwd
echo "This directory contains the following files"
ls
[root@xj ~]# chmod +x example.sh   //給指令碼賦予可執行許可權
[root@xj ~]# ./example.sh          //執行執行
2、建立和執行shell指令碼的基本步驟

二、Shell指令碼的變數
1、什麼是變數
   變數來源於數學,是計算機語言中能儲存計算結果或能表示值抽象概念。變數可以透過變數名訪問。在指令式語言中,變數通常是可變的;但在純函式式語言(如Haskell)
中,變數可能是不可變(immutable)的。在一些語言中,變數可能被明確為是能表示可變狀態、具有儲存空間的抽象(如在Java和Visual Basic中);但另外一些語言可能使用其它概念(如C的物件)來指稱這種抽象,而不嚴格地定義“變數”的準確外延。


2、Shell變數
Shell中變數是傳遞資料的一種方法。變數是用來代表每個值的符號名
Shell中有兩類變數:臨時變數和永久變數。
擴充套件:
自定義環境變數
[root@xj ~]# mv example01.sh /etc/sysconfig/
[root@xj ~]# export PATH=/etc/sysconfig:$PATH
[root@xj ~]# echo $PATH
/etc/sysconfig:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
注:這種方式一旦終端關閉後,就會失效,要想修改永久生效,可以修改使用者目錄下.bashrc檔案,在此檔案的最後一行新增export PATH=/etc/sysconfig:$PATH儲存退出。
[root@localhost ~]# source .bashrc
執行.bashrc後不報錯,則表示成功!

使用者定義變數:由字母或下劃線打頭,由字母、數字或下劃線組成,區分大小寫並且大小寫字母意義不同。變數名長度沒有限制。
使用變數值時,應在變數名前加上“$”符號。
例如:
[root@xj ~]# 123=abc
bash: 123=abc: command not found…

變數賦值:變數=值,賦值號“=”兩邊不加空格,否則提示錯誤。

[root@xj ~]# a = 1
bash: a: command not found…
正確方式如下:

[root@xj ~]# name=rm
[root@xj ~]# NAME=mk
[root@xj ~]# echo $NAME
mk
[root@xj ~]# echo $name
rm

3、變數的運用
例:將一個命令的執行結果賦給變數
[root@xj ~]# A=`date`
[root@xj ~]# echo $A
Tue Mar 8 21:12:45 CST 2016
[root@xj ~]# B=$(date)
[root@xj ~]# echo $B
Tue Mar 8 21:13:33 CST 2016

變數值的可傳遞性
[root@xj ~]# A=`date`
[root@xj ~]# C=$A
[root@xj ~]# echo $C
Tue Mar 8 21:12:45 CST 2016

可以利用變數和其它字元組成一個新的字串
[root@xj ~]# MYDIR=/home/rm/
[root@xj ~]# echo $MYDIR
/home/rm/
[root@xj ~]# echo $MYDIRzhangsan
輸出內容為空
[root@xj ~]# echo ${MYDIR}zhangsan
/home/rm/zhangsan

給變數賦值多個單詞:
[root@xj ~]# NAME="mk docker"
[root@xj ~]# echo $NAME
mk docker
[root@xj ~]# NAME="rm $NAME"
[root@xj ~]# echo $NAME
rm mk docker
[root@xj ~]# NAME='rm $NAME'
[root@xj ~]# echo $NAME
rm $NAME
單引號和雙引號的區別:單引號將變數之間的內容原封不動地指定給變數。雙引號取消了空格的作用,保留特殊符號的含義

刪除變數:
[root@xj ~]# echo $NAME
rm $NAME
[root@xj ~]# unset NAME
[root@xj ~]# echo $NAME

4、Shell指令碼中的位置變數與特殊變數
位置變數:Shell解釋執行使用者的命令時,將命令列的第一個字作為命令名,而其它字作為引數。由出現在命令列上的位置確定的引數稱為位置引數。 
位置變數:使用$N來表示
[root@xj ~]# vim b.sh
#!/bin/bash
echo "第一個目錄是$1"
echo "第二個目錄是$2"
[root@xj ~]# chmod +x b.sh
[root@xj ~]# ./b.sh /home/ /etc/
第一個目錄是/home/
第二個目錄是/etc/
$0 這個程式的檔名 example.sh
$n 這個程式的第n個引數值,n=1..N

特殊變數:
有些變數是一開始執行Script指令碼時就會設定,且不能被修改,但我們不叫它只讀的系統變數,而叫它特殊變數。這些變數當一執行程式時就有了,以下是一些等殊變數:
$*  這個程式的所有引數
$#  這個程式的引數個數
$$  這個程式的PID
$!  執行上一個後臺程式的PID
$?  執行上一個指令的返回值
[root@xj ~]# vim z.sh
#!/bin/bash
echo "$* 表示這個程式的所有引數"
echo "$# 表示這個程式引數的個數"
touch /root/a.txt
echo "$$ 表示這個程式的PID"
touch /root/b.txt &
echo "$! 表示上一個後臺指令的PID"
echo "$$ 表示程式的程式PID"
[root@xj ~]# ./z.sh aaa bbb ccc
aaa bbb ccc 表示這個程式的所有引數
3 表示這個程式引數的個數
39839 表示這個程式的PID
39841 表示上一個後臺指令的PID
39839 表示程式的程式PID

例:變數在shell中的使用
[root@xj ~]# vim z1.sh
#!/bin/bash
var1="abcd efg"
echo $var1
var2=1234
echo "The value of var2 is $var2"
echo $HOME
echo $PATH
echo $PWD
[root@xj ~]# chmod +x z1.sh
[root@xj ~]# ./z1.sh
abcd efg
The value of var2 is 1234
/root
/etc/sysconfig:/etc/sysconfig:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
/root

三、shell中的命令
1、Read命令的使用
作用:從鍵盤讀入資料,賦給變數
[root@xj ~]# read a b c
1 22 33
[root@xj ~]# echo $a $b $c
1 22 33

read與引數-p -n -t結合使用

-p(提示語句) 
-n(字元個數)
-t(等待時間) 
[root@xj ~]# read -p "請輸入你的准考證號: " ID
請輸入你的准考證號: 20160308
[root@xj ~]# echo $ID
20160308
[root@xj ~]# vim read.sh
#!/bin/bash
read -p "請輸入你的姓名:" NAME
read -p "請輸入你的年齡:" AGE
read -p "請輸入你的性別:" SEX
echo "你的基本資訊如下:"
echo "姓名:$NAME"
echo "年齡:$AGE"
echo "性別:$SEX"
[root@xj ~]# chmod +x read.sh
[root@xj ~]# ./read.sh
請輸入你的姓名:孫悟空
請輸入你的年齡:500
請輸入你的性別:男
你的基本資訊如下:
姓名:孫悟空
年齡:500
性別:男

2、expr命令的使用
作用:Shell變數的算術運算:
§ expr命令:對整數型變數進行算術運算
語法:expr 表示式    //注意:運算子之間要有空格
[root@xj ~]# expr 3 + 2
5
[root@xj ~]# expr 8 – 3
5
[root@xj ~]# expr 8 / 4
2
[root@xj ~]# expr 8 \* 4
32
[root@xj ~]# expr 8 % 3
2
注:%取餘運算

結合變數使用運算子
[root@xj ~]# var1=16
[root@xj ~]# var2=4
[root@xj ~]# expr $var1 – $var2
12

3、算數運算子在shell指令碼中的使用
[root@xj ~]# vim expr.sh
#!/bin/bash
read -p "Please input the value of a " a
read -p "Please input the value of b " b
read -p "Please input the value of c " c
value1=`expr $a + $b + $c`
echo "The value of value1 is $value1"
value2=`expr $c / $b`
echo "The value of value2 is $value2"
value3=`expr $c \* $b`
echo "The value of value3 is $value3"
value4=`expr $a + $c / $b`
echo "The value of value4 is $value4"
[root@xj ~]# ./expr.sh
Please input the value of a 10
Please input the value of b 20
Please input the value of c 30
The value of value1 is 60
The value of value2 is 1
The value of value3 is 600
The value of value4 is 11

複雜運算
[root@xj ~]# expr $(expr $(expr 5 + 11) / $var3) + 4
12

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9034054/viewspace-2074534/,如需轉載,請註明出處,否則將追究法律責任。

相關文章