shell編程及變量

一、 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、……、99、{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值爲執行錯誤。

​ $# 表示命令行中位置參數的個數

常用的預定義變量:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章