一、 shell腳本的概念
將平時使用的各種Linux命令按順序保存(堆疊)到一個文本文件中,添加上執行權限,就是一個Shell腳本。
l 將要執行的命令按先後順序保存到一個文本文件
l 給該文件可執行權限,便可運行
l 可結合各種Shell控制語句以完成更復雜的操作
二、 shell腳本應用場景
重複性操作
批量事務處理
自動化運維
服務運行狀態監控
定時任務執行
減輕管理員負擔
規避費時操作
三、Shell的概念
Shell是一個特殊的應用程序,介於操作系統內核和用戶之間,充當一個“命令解釋器”(翻譯官)的角色,負責接受用戶輸入的指令並進行解釋,將需要執行的操作傳遞給內核執行,並輸出執行結果返回給用戶。
四、編寫Shell腳本的格式:
1**、#!/bin/bash 表示腳本通過以/bin/bash程序來編寫**
#!/bin/bash
2**、# 表示註釋信息,例如:對編寫的腳本作用進行解釋,每寫一段腳本之前都應該用“#”來註釋以下命令執行的結果**
# Description:Install Httpd Server
# By:Crushlinux
# Date:2016-01-08
# Version:V1
3**、定義腳本中的變量**
httpd_software=$(ls tools | grep httpd)
httpd_version=$(ls tools | grep httpd |sed ‘s/.tar.*//’)
4**、定義腳本中的函數**
5**、腳本執行語句(判斷、循環、選擇等語句)**
if rpm -q httpd &> /dev/null
then
rpm -e httpd --nodeps &> /dev/null
if [ $? -ne 0 ]
then
echo “remove httpd rpm packages failed”
fi
fi
6**、利用 echo 定義輸出一些讓人更容易看懂得信息(可以是中文也可以是英文)**
echo “################# 操作已完成可去檢測 #################”
五、執行腳本的三種方法:
l 通過絕對路徑執行:/root/first.sh或進入到腳本文件所在目錄 ./first.sh (需要給腳本文件添加上執行權限)
l 相對路徑
絕對路徑與相對路徑實行shell 腳本時,該腳本文件必須具有可執行權限。
l 進入到腳本文件所在目錄執行 sh first.sh bash first.sh(文件可以沒有執行權限)
sh 腳本路徑 (與 “bash腳本路徑”相同)
l 進入到腳本文件所在目錄執行 source first.sh 或 . first.sh (文件可以沒有執行權限)
source 腳本路徑 (與 “. 腳本路徑”相同)
六、腳本後綴名爲:
l .sh 表示編寫程序爲bash
l .pl 表示編寫程序爲perl
l .py 表示編寫程序爲python
學習shell的方法查看/etc/init.d/ 下的服務控制腳本
七、管道操作
管道符 |
格式:cmd1 | cmd2 [… | cmdn]
作用:將管道前的命令輸出結果作爲管道後命令的參數使用
十、重定向操作
交互式硬件設備文件: standard ( input、output、error)
l 標準輸入:從該設備接收用戶輸入的數據
l 標準輸出:通過該設備向用戶輸出數據
l 錯誤輸出:通過該設備報告執行出錯信息
類型 | 設備文件 | 文件描述編號 | 默認設備 |
---|---|---|---|
標準輸入 | /dev/stdin | 0 | 鍵盤 |
標準輸出 | /dev/stdout | 1 | 顯示器 |
標準錯誤輸出 | /dev/stderr | 2 | 顯示器 |
重定向操作
類型 | 操作符 | 用途 |
---|---|---|
重定向輸入 | < | 從指定的文件讀取數據,而不是從鍵盤輸入 |
重定向輸出 | > | 將輸出結果保存到指定的文件(覆蓋原有內容) |
>> | 將輸出結果追加到指定的文件 | |
標準錯誤輸出 | 2> | 將錯誤信息保存到指定的文件(覆蓋原有內容) |
2>> | 將錯誤信息追加到指定的文件中 | |
混合輸出 | &> | 將標準輸出、標準錯誤的內容保存到同一個文件中 |
重定向輸入符 < 通過文件輸入內容,而不是用標準的鍵盤輸入
[root@localhost ~]# useradd crushlinux
[root@localhost ~]# vim pass.txt
123456
[root@localhost ~]# passwd --stdin crushlinux < pass.txt
更改用戶 crushlinux 的密碼 。
passwd:所有的身份驗證令牌已經成功更新。
“>”覆蓋全部內容
“>>”追加文本內容後面
注意:
標準輸出,標準輸入默認省略了 0 和 1
/dev/null 空文件 黑洞
處理多行輸出:
[root@localhost ~]# cat << EOF > test.repo
[c7-media]
name=CentOS-Media
baseurl=file:///media/cdrom
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF
八、變量
1、常量:固定的字符串,含義也是固定的。
Shell 變量用來存放系統和用戶需要使用的特定參數(值),而且參數根據用戶的設定或系統環境的改變而相應的改變,靈活,適應性更強。
變量類型:
2、(1)自定義變量
自定義變量是由用戶自己定義的變量,只在用戶自己的Shell環境中生效,又稱本地變量
定義格式:變量名=變量值等號兩邊沒有空格
變量名必須使用英文字母或是下劃線開頭,變量名內不允許出現特殊字符,並且區分字母大小寫。
使用echo可以查看定義的變量值,$後面是一個變量名
九、特殊符號:
1、雙引號(“”):可以引用一個變量,有空格的值。
[root@localhost ~]# echo “$product $version”
cloud 2.0
2、單引號(‘’):引號內的內容被視爲一個完整的字符串,不能引用變量。
[root@localhost ~]# echo ‘$product $version’
$product $version
3、反撇號(``):引號內的執行結果作爲變量名的變量值,引用命令使用。反撇號在一行命中不能實現嵌套命令替換操作,所以使用$()
[root@localhost ~]# rpm -qf which mkdir
coreutils-8.22-21.el7.x86_64
[root@localhost ~]# rpm -qf $(which mkdir)
coreutils-8.22-21.el7.x86_64
read命令:
用來提示用戶輸入信息,從而實現簡單的交互變量設置。將用戶輸入的信息作爲變量值,用戶的輸入以空格作爲分隔符,將讀入的各個字段挨個賦值給指定的變量,多餘的賦值給最後一個變量。
-p 設置提示信息
[root@localhost ~]# read -p "please input your name and age: " name age
please input your name and age: zhangsan 20
[root@localhost ~]# echo $name
zhangsan
[root@localhost ~]# echo $age
20
設置變量生效範圍:
新定義的變量只能在當前Shell環境中生效。又稱局部變量
export 命令:可以將局部變量發佈到全局。
[root@localhost ~]# echo $product #查看當前shell中變量的值
cloud
[root@localhost ~]# bash #切換到新的子Shell環境
[root@localhost ~]# echo $product #查看變量 (可以看到查不到變量值)
[root@localhost ~]# exit #退出Shell環境
exit
[root@localhost ~]# export product #使用export命令將變量發佈到全局
[root@localhost ~]# bash #進入到一個新Shell環境
[root@localhost ~]# echo $product #查看變量值
cloud
或者可以在定義變量同時聲明
[root@localhost ~]# export key=vlaue
注意:export全局發佈,只能向下面的子Shell發佈,不能向上父Shell發佈。
數值變量的運算:
使用expr命令進行簡單的整數運算,不支持小數運算。
[root@localhost ~]# X=12
[root@localhost ~]# Y=22
[root@localhost ~]# expr $X + $Y
34
[root@localhost ~]# expr $X - $Y
-10
[root@localhost ~]# expr $X * $Y
264
[root@localhost ~]# expr $X / $Y
0
其他運算方式:
[root@localhost ~]# echo $((100-33))
67
[root@localhost ~]# echo $[100-33]
67
[root@localhost ~]# echo “scale=2; 100+33” | bc
133
十、特殊的Shell變量
1、環境變量:
env 命令查看環境變量
環境變量是指,出於運行需要而由Linux系統提前創建的一類變量,主要用於設置用戶的工作環境。
l /etc/profile : 環境變量的全局配置文件,文件中定義的變量作用於所有用戶。
l .bash_profile :每個用戶自己的獨立配置文件。
常用的環境變量:
HOSTNAME=localhost.localdomain #定義主機名
PWD=/root #定義當前所在位置
USER=root #定義登錄用戶
……
set,env和export這三個命令的區別:
env 顯示用戶的環境變量;
set 顯示當前shell的自定義變量,包括用戶的環境變量,按變量名稱排序;
export 顯示當前導出成用戶變量的shell變量,並顯示變量的屬性(是否只讀),按變量名稱排序;
declare 同set 一樣,顯示當前shell的定義的變量,包括用戶的環境變量;
unset 取消變量
2、位置變量:
位置變量也稱爲位置參數,使用$1、$2、……、{10}…表示
[root@localhost ~]# vim adder2num.sh
#!/bin/bash
SUM=expr $1 + $2
echo “$1 + $2 = $SUM”
[root@localhost ~]# ./adder2num.sh 12 34
12 + 34 = 46
[root@localhost ~]# vim test.sh
#!/bin/bash
echo “當前的位置變量是:$1”
echo “當前的位置變量是:$2”
echo “當前的位置變量是:$3”
echo “當前的位置變量是:$4”
3、預定義變量:
預定義變量是Bash程序預先定義好的一類特殊變量,用戶只能使用預定義變量,而不能創建新的預定義變量,也不能直接爲預定義變量賦值。
@ 表示所有位置參數的內容(@單個參數的組合)
$0 表示當前執行的腳本或程序的名稱
$? 表示前一條命令執行後的返回狀態,返回值爲0表示執行正確,非0值爲執行錯誤。
$# 表示命令行中位置參數的個數
常用的預定義變量:
$# 表示命令行中位置參數的個數