什麼是Shell指令碼?
前言
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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 什麼是shell指令碼?Linux為什麼學習shell?指令碼Linux
- 什麼是Shell指令碼?Shell指令碼在Linux運維工作中的地位!指令碼Linux運維
- 【Linux】什麼是shell指令碼?shell變數分為哪幾類?Linux指令碼變數
- Shell指令碼語言是什麼?運維工程師前景怎麼樣指令碼運維工程師
- Linux學習之Shell指令碼語言的優勢是什麼?Linux指令碼
- Shell是什麼
- 什麼是shell?
- 什麼是shell?Linux中shell有什麼用途?Linux
- shell指令碼指令碼
- 反彈shell是什麼?反彈shell有什麼用?
- shell folder(CLSID)快捷方式 是什麼 為什麼 怎麼樣 有什麼影響 shell:::{CLSID程式碼}
- 常用shell指令碼指令碼
- shell指令碼案例指令碼
- Linux Shell指令碼Linux指令碼
- 什麼是指令重排?
- 在Linux中,shell指令碼中的條件語句和迴圈結構是什麼?Linux指令碼
- shell指令碼(6)-shell陣列指令碼陣列
- 什麼是shell?Linux常用的shell有哪些?Linux
- 什麼是Shell?Linux shell分為幾類?Linux
- shell指令碼總結指令碼
- shell 指令碼寫法:指令碼
- shell 指令碼加密 | shc指令碼加密
- 執行shell指令碼指令碼
- Shell 指令碼語句指令碼
- 如何加密shell指令碼加密指令碼
- 初識shell指令碼指令碼
- 【指令碼】shell語法指令碼
- 為什麼要有Shell指令碼註釋?linux系統開發基礎指令碼Linux
- iOS逆向 Shell指令碼+指令碼重簽名iOS指令碼
- 在Linux中,什麼是Linux shell?Linux
- Shell指令碼語言有什麼優勢?linux系統學習步驟指令碼Linux
- 前端釋出shell指令碼前端指令碼
- shell指令碼之迴圈指令碼
- 【shell】磁碟監控指令碼指令碼
- linux常用的shell指令碼Linux指令碼
- 批次解壓shell指令碼指令碼
- 通用程式部署shell指令碼指令碼
- shell指令碼-免互動指令碼
- Shell指令碼最佳實踐指令碼