Shell腳本應用場景:
Shell腳本就是將要執行的命令按照順序保存到一個文本文件,並給改文件執行權限,方便一次執行的程序文件。
Linux系統中的shell腳本是一個特殊的應用程序,他介於操作系統內核與用戶之間,充當啦一個“命令解釋器”的角色,負責接收用戶的操作命令並進行解釋,並將需要執行的操作傳送給內核執行,並輸出執行結果。
通過cat /etc/shell可以瞭解所支持的shell種類,其中/bin/bash是目前大多數linux版本採用的默認shell腳本。
Shell編程規範:
一個合格的shell腳本程序應該1遵循標準的腳本結構,而且能夠輸出友好的提示信息、更加容易讀懂。對於代碼較多、結構複雜的腳本,應添加必要的註釋文字。
[root@localhost ~]# vi first.sh
#!/bin/bash
#this is test shell
cd /boot
echo "當前目錄位於:"
pwd
echo "查看以vm開頭的所有文件有:"
ls -lh vm*
上訴first.sh腳本文件中,第一行“#!/bin/bash”是一行特殊的腳本聲明,表示此行以後的語句通過/bin/bash程序來執行。以#開頭的語句表示註釋信息,echo命令用於輸出字符串,以使腳本更容易讀懂
[root@localhost ~]# chmod +x first.sh 直接通過文件路徑./first.sh方式腳本,要求本身具有x權限,或者通過內部命令source或點號”.”來加載文件中的源代碼執行。列如使用:
[root@localhost ~]# sh first.sh
[root@localhost ~]# . first.sh 也可以執行腳本
管道與重定向:
1、 管道操作:
管道操作爲不同命令之間的協同工作提供了一種機制,位於管道符號“|”左側的命令輸出的結果,將作爲右側命令的輸出處理對象,同以行命令中可以是用多個管道
2、 awk操作:
awk命令作用是以冒號“:”作爲分隔,輸出第1和第7區域的字符串。其中的-F部分用來指定分隔符號(未指定時,默認以空格或製表符分隔)。
[root@localhost ~]# df -h | grep "/$"
/dev/sda2 15G 885M 15G 6% /
[root@localhost ~]# df -h | grep "/$" | awk '{print $1,$6}'
/dev/sda2 / 注:awk就是以空格第一個和第6個區域的信息
[root@localhost ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$3}'
root 0 注:加-F:是以:分隔
重定向操作:
1、 重定向輸入:
重定向輸入指的是將命令接收輸入的路徑改爲指定的文件,而不是等待從鍵盤輸入,重定向輸入<操作符
[root@localhost ~]# cat pass.txt
123
[root@localhost ~]# passwd --stdin tom <pass.txt
更改用戶 tom 的密碼 。
passwd:所有的身份驗證令牌已經成功更新。
注:從pass.txt文件中提取密碼
2、 重定向輸出:
重定向輸出使用>和>>操作符號,分別用於覆蓋或追加文件
3、 錯誤重定向:
錯誤重定向指的是將執行命令過程重出現的錯誤信息保存到指定的文件比如
[root@localhost ~]# cat /etc/passwdw 2>2
[root@localhost ~]# cat 2
cat: /etc/passwdw: 沒有那個文件或目錄 注:2>覆蓋錯誤信息
[root@localhost ~]# cat 2
cat: /etc/passwdw: 沒有那個文件或目錄
cat: /etc/passwdw: 沒有那個文件或目錄 注:2>>追加錯誤信息·
4、 當命令輸出的結果可能既包括標註輸出信息,有包括錯誤輸出信息是,可以使用操作符&>操作符將兩類輸出信息保存到同一個文件
[root@localhost ~]# cat /etc/passwd /etc/passwd2 &>>2
[root@localhost ~]# cat /etc/passwd /etc/passwd2 &>2
自定義變量:
1、 定義新的變量
格式爲:變量名=變量值
比如:
[root@localhost ~]# x=11
[root@localhost ~]# y=11
2、 查看應用變量的值:
通過變量名稱前添加前導號”$”,使用echo命令查看變量,也可以在echo查看多個變量
[root@localhost ~]# echo $x $y
11 11
3、 變量賦值的特殊操作:
1、 雙引號(“”)
雙引號主要起界字符串的作用,特別是要賦值內容包括空格是,必須雙引號括起來
[root@localhost ~]# weixin="weixin 5.0"
2、 單引號’
當要賦值的內容中包括$、”、\、等具有特殊含義的字符時,應使用單引號括起來,在單引號的範圍內,將無法使用其他變量的值,任何字符作爲普通字符看待。
[root@localhost ~]# qq='qq $x'
[root@localhost ~]# echo $qq
qq $x 注:這樣就$x不會變量
3、 反撇號`
反撇號主要用於命令替換,運行將執行某個命令的屏幕結果賦值給變量,反撇號括起來的範圍內必須時能夠執行的命令行,否則將會出錯。
[root@localhost ~]# n=`free | grep "^Mem" | awk '{print $2}'`
[root@localhost ~]# echo $n
999696
4、 read命令:
還可以使用bash的內置命令read來給變量值,read命令來提示用戶輸入信息,從而實現簡單的交互過程。
[root@localhost ~]# read x
a
[root@localhost ~]# echo $x
a
read還可以結合-p和-t選項來設置提示與輸入等待時間,以便告知用戶應該輸入什麼內容等相關事項和規定時間內末行輸入自動跳出
[root@localhost ~]# read -p "你叫什麼名字:" nm
你叫什麼名字:李鑫
[root@localhost ~]# echo $nm
李鑫
5、 設置變量的作用範圍
默認情況下,新定義的變量只在shell環境中有效,因此稱爲局變量,當進入子程序或新的子shell環境時,局部變量將無法再使用。
c
[root@localhost ~]# echo $x
a
[root@localhost ~]# bash
[root@localhost ~]# echo $x
使用export導出全局配置的同時,也可以爲變量進行賦值,這樣在新定義全局變量時就不需要提前進行賦值了
[root@localhost ~]# export KGG="www.baidu.com"
[root@localhost ~]# echo $KGG
www.baidu.com
[root@localhost ~]# bash
[root@localhost ~]# echo $KGG
6、 數值量的運算
Shell變量的數值運算多用於腳本程序的過程控制,在bash環境中,只能進行簡單的整數運算,不支持小數運算。
[root@localhost ~]# x=3
[root@localhost ~]# y=4
[root@localhost ~]# expr $x + $y
7
[root@localhost ~]# expr $x - $y
-1
[root@localhost ~]# expr $x \* $y
12
[root@localhost ~]# expr $x / $y
0
[root@localhost ~]# expr $x % $y
3 注:使用expr命令時變量必須時整數,不能時字符串和小數,否則出錯
若要計算y的三次方,並將結果賦予san
[root@localhost ~]# san=`expr $y \* $y \* $y`
[root@localhost ~]# echo $san
64
除了expr命令之外,變量數值常見的命令還包括:(())、let等。如果要執行簡單的整數運算,只需要將特定對的算術表達式用“$((“和”))“括號起來即可
[root@localhost ~]# bb=$((1+2**3-4)) 注:這裏1+2**3-4代表2的3次方
[root@localhost ~]# echo $bb
5
1、環境變量:
環境變量是由linux系統提前創建的一類變量,主要用來設置用戶的工作環境,包括宿主目錄、命令查找路徑等。。
[root@localhost ~]# PATH="$PATH:/root" 將root添加到搜索路徑
[root@localhost ~]# echo $PATH 查看修改後的路徑
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root
[root@localhost opt]# first.sh
注:添加路徑之後可以在別的目錄下直接以文件名運行腳本,這就是環境變量,要給x權限
當前目錄位於:
/boot
查看以vm開頭的所有文件有:
-rwxr-xr-x. 1 root root 5.7M 8月 4 03:14 vmlinuz-0-rescue-f42f9f9bfcea447ebe1710c38f2297d9
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
2、位置變量:
爲了使用shell腳本程序時,方便命令行爲程序操作參數,bash引入位置變量的概念。
位置變量也成爲位置參數,使用$1、$2、$3、……、$9表示
[root@localhost ~]# vi 1.sh
#!/bin/bash
#計算器
SUM='$1 + $2'
echo "$1 + $2 =$SUM"
[root@localhost ~]# sh 1.sh 11 22
11 + 22 =$1 + $2
注:後面加參數$1爲11,$2爲22,第一個$1對準第一個參數一次類推
4、 預定義變量:
預定義變量是由bash程序預定義號的特殊變量,用戶只能使用預定義變量,而不能創建新的預定義變量。
$#:表示命令由幾個參數
$*:表示所有位置參數的內容
$0:表示當前執行腳本和程序的名稱
[root@localhost ~]# vi 1.sh
#!/bin/bash
#計算器
SUM=`expr $1 + $2`
echo "$SUM"
echo "執行$0腳本"
echo "共執行$#個命令"
echo "內容:$*"
[root@localhost ~]# sh 1.sh 12 23
35
執行1.sh腳本
共執行2個命令
內容:12 23
$?:表示前一條命令執行後的狀態,返回值爲0表示執行正確,返回非0均表示執行出現異常:
[root@localhost ~]# ls
1 2 fei.txt jisuanji.sh mumsquare.sh
1.sh 3.txt first.sh memusage.sh pass.txt
1.txt anaconda-ks.cfg haha.sh mia ;q
[root@localhost ~]# echo $?
0 注:0代表上一個命令執行的正確
[root@localhost ~]# ls bb
ls: 無法訪問bb: 沒有那個文件或目錄
[root@localhost ~]# echo $?
2 注:2代表上一個命令執行的錯誤