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腳本編程算術運算介紹