1. 程式人生 > >bash變量及bash腳本編程算術運算介紹

bash變量及bash腳本編程算術運算介紹

腳本編程

1、常用命令bash特性命令介紹:

hash命令

作用:緩存此前命令的查找結果,緩存外部命令,不能緩存內嵌命令;加快程序運行

用法:他是一個內嵌命令

[[email protected] ~]# hash //查看此前運行過的命令的查找結果

hitscommand

1/usr/bin/grep

[[email protected] ~]#


[[email protected] ~]# hash -d command //刪除命令(command)的查找結果

[[email protected] ~]# hash -r //清空hash列表,一般用來當命令被移動到其他位置時,需要清空


bash多命令執行:

各命令間用分號(;)隔開,命令間無邏輯關系,一次執行

多命令格式:

~]#command1;command2;command3 ....

如:

[[email protected] ~]# ls;cat /etc/issue

anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates

Desktop Downloads Music Public Videos

\S

Kernel \r on an \m


[[email protected] ~]#


bash特性之邏輯關系:

運算數:

真表示方法:true、yes、on、1

假表示方法:false、no、off、0

運算方法:

與:&& ;1&&1=1,1&&0=0,0&&1=0,0&&0=0

或:|| ;1||1=1,1||0=1,0||1=1,0||0=0

非:! ;!1=0,!0=1

與短路運算:如果前一個執行結果為假,則結果為假;

或短路運算:如果前一個執行結果為真,則結果為真;


~]command1 && command2 && 。。。

命令執行狀態結果作為與運算,與運算中,前一個命令執行失敗,後面的命令將不再執行;若前一個命令執行成功,則執行後一個命令;command1執行失敗,不在執行comamnd2;反之則需執行command2

~]command1 || command2 || 。。。

命令執行狀態結果作為或運算,或運算中,前一個命令執行失敗,後面的命令必須執行;若前一個命令執行成功,則不再執行後一個命令;command1執行失敗,必須執行comamnd2;反之則不再執行command2

如:

[[email protected] ~]# touch /tmp/test.etc && ls /etc/ > /tmp/test.etc

如果創建test.etc的狀態結果為真,則執行後面命令:ls /etc/ > /tmp/test.etc


[[email protected] ~]# id lucy || useradd lucy

id: lucy: no such user

[[email protected] ~]# tail -1 /etc/passwd

lucy:x:2008:2008::/home/lucy:/bin/bash

[[email protected] ~]#

如果lucy用戶不存在,則創建lucy用戶。




2、bash變量介紹

程序是由指令+數據組成的;也可以看成是由算法+數據結構組成。

其中,指令由程序文件提供,數據由標準輸入(I/O)、文件、管道、變量等提供。


變量:由變量名和內存空間組成,他是一個有命名的內存地址。


變量根據編程語言分類:

強類型變量:不同變量類型不能相互操作,除非做變量類型轉換

弱類型變量:bash就是一種弱類型變量的編程語言;bash不支持浮點數據類型,除非借助外在工具;bash中的變量無需事先聲明,這樣就相當於把變量聲明和賦值過程同時實現。


在強類型編程語言中,如c語言,變量需要初始化,因為變量中有隨機數。


變量替換(變量引用):把變量名出現的位置,替換為其所指向的內存空間的數據。

變量引用方法:${var_name}或$var_name,建議用前者${var_name}規範寫法。


3、bash變量分類:

根據作用範圍劃分:

本地變量:作用域為當前shell進程;同級shell或子shell不起作用;

環境變量:作用域為當前shell進程及子進程;同級shell進程無效;

局部變量:作用域為某代碼片段;

其他分類:

位置參數變量:向執行腳本的shell進程傳遞的參數

特殊變量:shell內置的特殊功用的變量,如:$?、


4、bash變量定義:

變量名命名法則:

見名知意,

不能使用程序的保留字,如if、else、then、while等。


4.1、本地變量

本地變量定義:

name=value


本地變量引用:

${var_name}或$var_name

"var_name" :弱引用,變量名會被替換成變量值

‘var_name‘ :強引用,變量名不會被替換成值

如:

[[email protected] ~]# name=lucy //定義本地變量

[[email protected] ~]# echo $name //引用變量

lucy

[[email protected] ~]# echo "name"

name

[[email protected] ~]# echo ‘name‘

name

[[email protected] ~]#


查看本地變量:

#set

撤銷本地變量:

#unset 變量名 //註意此處非變量引用,無需"$"符號

如:

[[email protected] ~]# unset name

[[email protected] ~]# echo $name


[[email protected] ~]#


驗證本地變量作用域方法:

①打開一個統計shell進程,查看變量值

②打開一個子shell進程,查看變量值。如:在bash提示符下直接輸入bash(新建一個shell子進程),看看變量值是否可以被引用。


4.2、環境變量

環境變量定義:

方法一:export name=value

方法二:name=value

export name

方法三:declare -x name=value

方法四:name=value

declare -x value

註意:declare是內嵌命令。同時,bash內嵌了許多環境變量,通常為全大寫字母,因此為了避免自定義和內置的環境沖突,不建議定義環境變量時大寫。

PATH\HISTFILE\HISTSIZE\HISTFILESIZE\HISTCONTROL\SHELL\HOME\UID\PWD\OLDPWD


環境變量引用:

${var_name}或$var_name


查看環境變量:

方法一:export

方法二:declare -x

方法三:printenv

方法四:env

如:

[[email protected] ~]# export price=12

[[email protected] ~]# echo $price

12

[[email protected] ~]# bash

[[email protected] ~]# echo $price

12

[[email protected] ~]# exit

exit

[[email protected] ~]# export

declare -x XMODIFIERS="@im=ibus"

declare -x price="12"

[[email protected] ~]#


撤銷環境變量:

#unset var_name


定義只讀變量:

方法一:declare -r var_name

方法二:readonly var_name


[[email protected] ~]# declare -r price

[[email protected] ~]# unset price

bash: unset: price: cannot unset: readonly variable

[[email protected] ~]#

[[email protected] ~]# readonly name=lili

[[email protected] ~]# unset name

bash: unset: name: cannot unset: readonly variable

[[email protected] ~]#

註意:變成只讀變量後將無法撤銷變量,變量存活時間為當前shell進程的生命周期,隨shell終止而終止。


5、shell腳本編程介紹:

編程語言分類1:(根據運行方式)

編譯運行:將源代碼 經 編譯器編譯 成程序文件

解釋運行:將源代碼 經 解釋器解釋 邊解釋邊運行。


編程語言分類2:根據其編程過程中功能的實現是調用庫,還是調用外部的程序文件,又分如下兩種:

shell腳本編程:利用系統上的命令及編程組件進行編譯

完整編程:利用庫或編程組件進行編程。


變成語言分類3:根據編程模型分類

面向過程式的編程語言:以指令為中心來組織代碼,數據服務於代碼;順序執行、選擇則行、循環執行等,代表:c語言、bash腳本、c++、python

面向對象的編程語言:以數據為中心來組織代碼,圍繞數據來組織指令;類、實例化話對象,代表:java、c++、python


shell腳本編程特性:

過程式編程語言

腳本語言、解釋執行、依賴於外部程序文件運行。


5.1、shell腳本寫法:

腳本文件第一行:頂格#!shebang //解釋器路徑,用於指明解釋執行當前腳本的解釋程序文件。


常見的shebang(解釋器)有:

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl


腳本寫法事例:

[[email protected] ~]# cat first.sh

#!/bin/bash

id lily || useradd -M lily

id lily

[[email protected] ~]#


shell腳本如何寫?

命令的堆積

很多命令不具備冪等性,需要用程序邏輯來判斷運行條件是否滿足,以避免其運行中發現的錯誤。


shell腳本的執行方法:

方法一:賦權執行權限,並直接運行此程序。

~]#chmod +x /path/shell.sh //給腳本文件shell.sh加上執行權限

~]#/path/to/shell.sh //給出shell腳本文件shell.sh完整路徑執行;

或~]#./shell.sh //也可以以相對路徑執行


方法二:直接運行解釋器,將腳本以命令行參數傳遞給解釋器程序

~]#bash shell.sh //可以是絕對路徑,也可以是相對路徑。


註意:腳本中的空白行會被解釋器忽略,腳本中,除了shebang,余下所有以#開頭的行,都會被視作註釋行而被忽略,此即為註釋行。


練習:

用腳本實現如下功能:

1>顯示/etc/目錄下所有以大寫p或小寫p開頭的文件或目錄本身

2>顯示/var目錄下的所有文件或目錄本身,並將顯示結果中的小寫字母轉換成大寫字母後顯示;

3>創建臨時文件/tmp/myfile.xxxx

[[email protected] ~]# nano secondshell.sh

#!/bin/bash

ls -d /etc/[pP]*

ls -d /var/* | tr ‘a-z‘ ‘A-Z‘

mkdir /tmp/myfile.xxxx


6、bash腳本編程之算術運算:(+、-、*、/、**、%)

註意:bash中所有的數字都被視為字符串。

如:

[[email protected] ~]# var1=2

[[email protected] ~]# var2=10

[[email protected] ~]# echo "$var1+$var2"

2+10

[[email protected] ~]#


算術運算格式:

方法一:let var_name=算術表達式

方法二:$[算數表達式]

方法三:var=$((算術運算表達式))

方法四:$(export $ARG1 OP $ARG2) //不好用,也不常用

需要註意的是:乘法符號(*)在有些場景中需要使用轉義符。

如:

[[email protected] ~]# var1=2

[[email protected] ~]# var2=10

方法一:

[[email protected] ~]# let sum=$var1+$var2

[[email protected] ~]# echo $sum

12

[[email protected] ~]#

方法二:

[[email protected] ~]# echo $[$var1+$var2]

12

[[email protected] ~]#

[[email protected] ~]# echo "$[$var1+$var2]" //變量弱引用

12

[[email protected] ~]# echo ‘$[$var1+$var2]‘ //變量強引用

$[$var1+$var2]

[[email protected] ~]#

方法三:

[[email protected] ~]# sum1=$(($var1+$var2))

[[email protected] ~]# echo $sum1

12

[[email protected] ~]#

[[email protected] ~]# echo "$(($var1+$var2))"

12

[[email protected] ~]#

方法四:

[[email protected] ~]# echo $(expr $var1 + $var2 )

12

[[email protected] ~]#


練習:寫一個腳本,完成如下功能:

1>添加三個用戶

2>求三個用戶的UID之和

[[email protected] ~]# nano third.sh

#!/bin/bash

id sh1 || useradd sh1

id sh2 || useradd sh2

id sh3 || useradd sh3

shid1=$(grep "sh1" /etc/passwd |cut -d: -f3)

shid2=$(grep "sh2" /etc/passwd | cut -d: -f3)

shid3=$(grep "sh3" /etc/passwd | cut -d: -f3)

let shidsum=$shid1+$shid2+$shid3

echo $shidsum

[[email protected] ~]# bash third.sh

id: sh1: no such user

id: sh2: no such user

id: sh3: no such user

6033

[[email protected] ~]#

[[email protected] ~]# tail -3 /etc/passwd

sh1:x:2010:2010::/home/sh1:/bin/bash

sh2:x:2011:2011::/home/sh2:/bin/bash

sh3:x:2012:2012::/home/sh3:/bin/bash

[[email protected] ~]#


註意:命令的結果引用


~]#命令1 $(命令2) //表示:命令2的執行結果作為參數傳遞給命令1使用
















bash變量及bash腳本編程算術運算介紹