Shell腳本基礎知識

博文目錄
1、Shell腳本基礎
2、重定向與管道操做
3、使用Shell變量python

1、Shell腳本基礎

Linux系統中的Shell腳本是一個特殊的應用程序,它介於操做系統內核與用戶之間,充當了一個「命令解釋器」的角色,負責接收用戶輸入的操做命令並進行解釋,將須要執行的操做傳遞給內核執行,並輸出執行結果。sql

一、簡單編寫Shell腳本

[root@centos01 ~]# vim aaa.sh    <!--新建aaa.sh文件-->
#!/bin/bash
#Description E-Mail:2807489749@qq.com BY:LYX
cd /boot/
echo "顯示當前目錄:"
pwd
echo "查看以vml開頭的文件:"
ls -lh vml*
[root@centos01 ~]# chmod +x aaa.sh     <!--添加可執行權限-->

上述aaa.sh腳本文件中,第一行「#!/bin/bash」是一行特殊的腳本聲明,表示此行之後的語句經過/bin/bash程序來解釋執行;其餘以「#」開頭的語句表示註釋信息;echo命令用於輸出字符串,以使腳本的輸出信息更容易讀懂。上述配置包括三條命令:cd /boot/、pwd、ls -lh vml*。執行此腳本文件後,輸出結果與依次單獨執行這三條命令是相同的,從而實現了「批量處理」的自動化過程。shell

經過「./aaa.sh」的方式執行腳本,執行以前必須受權於文件的X權限。vim

[root@centos01 ~]# ./aaa.sh    <!--運行腳本文件-->
/boot
-rwxr-xr-x. 1 root root 5.7M 10月 23 22:35 vmlinuz-0-rescue-2b580d1a2e8348b8aa9f78be11137b41
-rwxr-xr-x. 1 root root 5.7M 8月  23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@centos01 ~]# source aaa.sh  <!--經過source來解釋腳本-->
[root@centos01 ~]# sh aaa.sh     <!--經過/bin/sh來解釋腳本-->

2、重定向與管道操做

一、重定向輸出

表示將命令的正常輸出結果保存到指定的文件中,並覆蓋文件中的原有內容,若文件不存在,則會新建一個文件使用 「>」操做符號。centos

表示將命令的正常輸出結果追加到指定的文件中sh使用「>>」操做符號。bash

舉個例子:服務器

[root@centos01 ~]# echo "aaa"  <!--數據輸出到顯示器上顯示-->
aaa
[root@centos01 ~]# echo "aaa" > 1.txt    <!--將數據輸出到文件中-->
[root@centos01 ~]# cat 1.txt      <!--查看文件中數據-->
aaa
[root@centos01 ~]# echo "bbb" >> 1.txt      <!--將數據追加輸出到1.txt文件中-->
[root@centos01 ~]# cat 1.txt         <!--查看文件-->
aaa
bbb

二、重定向輸入

重定向輸入指的是將命令中接收輸入的途徑由默認的鍵盤改成指定的文件,而不是等待從鍵盤輸入。重定向輸入使用「<」操做符。ide

舉個例子:
使用passwd命令爲用戶設置密碼時,每次都必須根據提示輸入兩次密碼字串,很是繁瑣,若改用重定向輸入將能夠省略交互式的過程,而自動完成密碼設置。sqlserver

[root@centos01 ~]# useradd bob  <!--建立bob用戶-->
[root@centos01 ~]# vim password.txt     <!--添加初始密碼串-->
pwd@123                    <!--密碼爲pwd@123-->
[root@centos01 ~]# passwd --stdin bob < password.txt      <!--從password.txt文件中取密碼-->
更改用戶 bob 的密碼 。
passwd:全部的身份驗證令牌已經成功更新。

三、錯誤重定向

錯誤重定向指的是將執行命令過程當中出現的錯誤信息(如選項或參數錯誤等)保存到指定的文件,而不是直接顯示在屏幕上。錯誤重定向使用 「2>」操做符,其中「2」是指錯誤文件的編號(在使用標準輸出、標準輸入重定向時,實際上省略了一、0編號)。操作系統

舉個例子:
執行如下操做能夠將使用tar命令進行備份時出現的錯誤信息保存到3.txt文件中。

[root@centos01 ~]# tar jcf /nonedir/etc.tgz /etc/ 2> 3.txt
[root@centos01 ~]# 
[root@centos01 ~]# cat 3.txt
tar: 從成員名中刪除開頭的「/」
tar (child): /nonedir/etc.tgz:沒法 open: 沒有那個文件或目錄
tar (child): Error is not recoverable: exiting now

使用「2>」操做符時,會像使用「>」操做符同樣覆蓋目標文件的內容,若要追加內容而不是覆蓋文件,則應改用「2>>」操做符。
當命令輸出的結果可能即包括標準輸出(正常執行)信息,又包括錯誤輸出信息時,可使用操做符「>」 「2>」將兩類輸出信息分別保存到不一樣的文件,也可使用「&>」操做符兩兩類輸出信息保存到同一個文件。
舉個例子:

[root@centos01 ~]# vim httpd.sh   <!--新建httpd.sh文件-->
#!/bin/bash
#自動編譯安裝httpd服務器
cd /usr/src/httpd-2.2.17/
echo "1.配置Apache服務:"
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &> /dev/null
echo "2.編譯Apache服務:"
make &> /dev/null
echo "3.安裝Apache服務:"
make install &> /dev/null
[root@centos01 ~]# chmod +x httpd.sh   <!--添加X權限-->
[root@centos01 ~]# ./httpd.sh     <!--運行腳本文件-->
1.配置Apache服務:
2.編譯Apache服務:
3.安裝Apache服務:

四、管道操做

管道(pipe)操做爲不一樣命令之間的協同工做提供了一種機制,位於管道符號「|」左側的命令輸出的結果,將做爲右側命令的輸入(處理對象),同一行命令中可使用多個管道。

舉個例子:

[root@centos01 ~]# grep "/bin/bash$" /etc/passwd  <!--提取前-->
root:x:0:0:root:/root:/bin/bash
test:x:1000:1000:test:/home/test:/bin/bash
bob:x:1002:1002::/home/bob:/bin/bash
[root@centos01 ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'   <!--提取後-->
root /bin/bash
test /bin/bash
bob /bin/bash
[root@centos01 ~]# df -hT     <!--提取以前-->
文件系統       類型      容量  已用  可用 已用% 掛載點
/dev/sda3      xfs        76G  5.2G   71G    7% /
devtmpfs       devtmpfs  474M     0  474M    0% /dev
tmpfs          tmpfs     489M     0  489M    0% /dev/shm
tmpfs          tmpfs     489M  6.9M  482M    2% /run
tmpfs          tmpfs     489M     0  489M    0% /sys/fs/cgroup
/dev/sda1      xfs       197M  136M   61M   70% /boot
tmpfs          tmpfs      98M     0   98M    0% /run/user/0
/dev/sr0       iso9660   664M  664M     0  100% /mnt
[root@centos01 ~]# df -hT | grep "/$" |awk '{print $6}'   <!--提取以後其中grep 「/$」表示提取以「/」結尾的行-->
7%

上述中awk命令的做用是以冒號「:」做爲分隔,輸出第1個,第7個區域的字符串。其中的「-F」部分用來指定分割符號(未指定時,默認以空格或製表符分隔)。

3、使用Shell變量

各類Shell環境中都使用到了「變量」的概念。Shell變量用來存放系統和用戶須要使用的特定參數(值),並且這些參數能夠根據用戶的設定或系統環境的變化而相應變化。經過使用變量,Shell程序可以提供更加靈活的功能,適應性更強。
常見Shell變量的類型包括自定義變量、環境變量、位置變量、預約義變量。

一、自定義變量

自定義變量是由系統用戶本身定義的變量,只在用戶本身的Shell環境中有效,所以又稱爲本地變量。在編寫Shell腳本程序時,一般會設置一些特定的自定義變量,以適應程序執行過程當中的各類變化,知足不一樣的需求。

1)定義新的變量

定義變量的基本格式爲「變量名=變量值」,等號兩邊沒有空格。變量名稱需以字母或下劃線開頭,名稱中不要包含特殊字符(如+、-、*、/、?、%、&、#等)。

[root@centos01 ~]# li=python
[root@centos01 ~]# version=2.7.13

2)查看和引用變量的值

經過在變量名稱前添加前導符號「$」,能夠引用一個變量的值。使用echo命令能夠查看變量,能夠在一條echo命令中同時查看多個變量值。

[root@centos01 ~]# echo $li
python
[root@centos01 ~]# echo $version
2.7.13
[root@centos01 ~]# echo $li $version
python 2.7.13

3)變量賦值的特殊操做

在等號「=」後邊直接指定變量內容是爲變量賦值的最基本方法,除此以外,還有一些特殊的賦值操做,能夠更靈活地位變量賦值,以便適用於各類複雜的管理任務。

①雙引號(" ")

[root@centos01 ~]# PYTHON=python 2.7.13  <!--錯誤賦值-->
bash: 2.7.13: 未找到命令...
[root@centos01 ~]# PYTHON="python 2.7.13" <!--正確的賦值-->
[root@centos01 ~]# echo $PYTHON   <!--查看值-->
python 2.7.13

在雙引號範圍內,使用「$」符號能夠引用其餘變量的值(變量引用),從而可以直接調用現有變量的值來賦給新的變量。

[root@centos01 ~]# echo $version
2.7.13
[root@centos01 ~]# sqlserver="sqlserver $version" 
                                       <!--以變量的值進行賦值-->
[root@centos01 ~]# echo $sqlserver    <!--查看值-->
sqlserver 2.7.13

②單引號(' ')

當要賦值的內容中包含$、「、\等具備特殊含義的字符時,應使用單引號括起來。在單引號的範圍內,將沒法引用其餘變量的值,任何字符均做爲普通字符看待。

[root@centos01 ~]# sqlserver='sqlserver $version'  <!--$符號不能再引用變量-->
[root@centos01 ~]# echo $sqlserver      <!--原樣輸出字符串-->
sqlserver $version

③反撇號(`)

反撇號主要用於命令替換,容許將執行某個命令的屏幕輸出結果賦值給變量。反撇號括起來的範圍必須可以執行的命令行,不然將會出錯。

[root@centos01 ~]# ls -lh `which useradd`
-rwxr-x---. 1 root root 116K 11月  6 2016 /usr/sbin/useradd

上述操做至關於連續執行了兩條命令——先經過which useradd命令查找出useradd命令的程序位置,而後根據查找結果列出文件屬性。執行過程當中,會用which useradd命令的輸出結果替換整個反撇號範圍。

④read命令

除了上述賦值操做之外,還可使用bash的內置命令read來給變量賦值。read命令用來提示用戶輸入信息,從而實現簡單的交互過程。執行時將從標準輸入設備(鍵盤)讀入一行內容,並以空格爲分隔符,將讀入的各字段依次賦值給指定的變量(多餘的內容賦值給最後一個變量)。若指定的變量只有一個,則將整行內容賦值給此變量。

[root@centos01 ~]# read -p "輸入須要的內容:" insert
輸入須要的內容:您好!  <!--將您好!賦值給變量insert-->
[root@centos01 ~]# echo $insert
您好!

4)設置變量的做用範圍

默認狀況下,新定義的變量只在當前的Shell環境中有效,所以稱爲局部變量。當進入子程序或新的子Shell環境時,局部變量將沒法再使用。例如,直接執行Bash進入一個新的子Shell腳本後,將沒法引用父級Shell環境中定義的li、version等變量。

[root@centos01 ~]# echo "$li $version"   <!--查看當前定義的變量值-->
python 2.7.13
[root@centos01 ~]# bash            <!--進入子shell環境-->
[root@centos01 ~]# echo "$li $version"        <!--沒法調用父shell環境中的變量-->
[root@centos01 ~]# exit        <!--返回原有的shell環境-->
exit
[root@centos01 ~]# echo "$li $version"   <!--查看當前定義的變量值-->
[root@centos01 ~]# export li version     <!--設置爲全局變量-->
[root@centos01 ~]# bash          <!--進入子shell環境-->
[root@centos01 ~]# echo "$li $version" <!--能夠調用父shell的全局變量-->
python 2.7.13
[root@centos01 ~]# exit     <!--返回原有的shell環境-->
exit

5)數值變量的運算

Shell變量的數值運算多用於腳本程序的過程控制(如循環次數、使用量比較等)再Bash shell環境中,只能進行簡單的證書運算,不支持小數運算。整數值的運算主要經過內部命令expr進行,基本格式以下:

expr 變量1 運算符 變量2 [運算符 變量3]...

其中,變量一、變量2......對應爲須要計算的數值變量(須要以「$」符號調用),經常使用的幾種運算符以下所述
+:加法運算;
-:減法運算;
*:乘法運算;注意不能僅使用「*」符號,不然將被當成文件通配符;
/:除法運算;
%:求模運算,又稱爲取餘運算,用來計算數值相除後的餘數;

舉個例子:

[root@centos01 ~]# x=35
[root@centos01 ~]# y=16
[root@centos01 ~]# expr $x + $y
51
[root@centos01 ~]# expr $x - $y
19
[root@centos01 ~]# expr $x \* $y
560
[root@centos01 ~]# expr $x / $y
2
[root@centos01 ~]# expr $x % $y
3

二、特殊的shell變量

1)環境變量:

使用命令「env」能夠查看到當前工做環境下的環境變量。環境變量的值由Linux系統自動維護,會隨着用戶狀態的改變而改變。
其中PATH變量用於設置可執行程序的默認搜索路徑,如將root目錄添加到默認搜索路徑:PATH="$PATH:/root"若是找不到則會提示「command not found」

環境變量的全局配置文件爲:/etc/profile,在此文件中定義的變量做用於全部用戶。

用戶獨立配置未見位於:~/.bash_profile

修改變量文件後,須使用source命令從新讀取加載或重啓纔會生效。

2)位置變量:

位置變量也稱位置參數,在命令 「ls -lh /boot」 中,ls的位置變量爲$0,-lh的位置變量爲$1,/boot的位置變量爲$2。以此類推。

3)預約義變量:

預約義變量是由bash程序預先定義好的一類特殊變量,用戶只能使用預約義變量,而不能建立新的預約義變量,也不能直接爲預約義變量賦值。預約義變量使用「$」符號和另外一個符號組合表示,常常用的幾個預約義變量含義以下:

  • $#:表示命令行中位置參數的個數。

  • $*:表示全部位置參數的內容。

  • $?:表示前一條命令執行後返回的狀態,返回0表示執行正確,返回任何非0的數值表示執行出現異常。

  • $0:表示當前執行的腳本或程序的名稱。

—————— 本文至此結束,感謝閱讀 ——————

相關文章
相關標籤/搜索