變量本質上是存儲數據的一個或多個計算機內存地址,變量的命令規則包括:
1) 不能使用程序中的保留字,如if, for
2) 變量由字母、下劃線和數字組成,且不能以數字開頭
3) 要求風名知義
4) 統一命名規則:駝峰命名法
變量主要分為本地變量、環境變量、局部變量、位置變量和特殊變量
(1)本地變量:只對當前shell進程有效,對當前shell進程以外的其它進程,包括子進程無效
變量直接賦值格式:name=’value’
也可以引用變量:
a. 可以是直接字串:name=”root”
b. 變量引用:name=”$USER”
c. 命令引用:name=`COMMAND` , name=$(COMMAND)
使用變量:
注:變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界
已定義的變量,可以被重新定義,如:
那么什么是只對當前進程有效呢?我們bash進入子shell發現echo $Myname沒有任何反應,退出子shell,又能輸出了
注,同樣的,假如我們再開一個進程,也會發現同樣找不到$Myname這個變量名
顯示所有已定義的變量:set
利用set可以查看所有的變量,包括環境變量
刪除變量:unset name
(2)環境變量:只對當前shell及其子進程有效
環境變量的聲明與賦值:
export name=VALUE
declare -x name=VALUE
如果你希望把你定義的變量讓其他所有的shell程序都能用,也就是定義新的環境變量。需要用到export關鍵詞,如:
環境變量的特性:聲明一個環境變量,在當前shell進程以及子shell進程中可用,父shell進程中不可用,這里的“可用”可以理解成父shell進程環境變量的一個復制,而不是繼承父類的環境變量兩者共用一份,因此子shell進程中對父shell進程的環境變量進行增、刪、改、查均無影響。
顯示所有環境變量:
env
printenv
export
declare -x
他們只顯示環境變量
bash 內建的環境變量包括:
PATH:命令搜索路徑。由冒號分隔,用于搜索命令
SHELL:當調用shell時,它掃描環境變量以尋找該名字。
USER:當前的用戶為誰
UID:展開為當前用戶的用戶ID,在shell啟動時初始化
HOME:家目錄
PWD:當前工作目錄
SHLVL:查看當前的shell為第幾階
LANG:查看當前默認的編碼格式
MAIL:查看mail的路徑
HOSTNAME:查看當前主機名
HISTSIZE:查看默認history緩存的歷史記錄條數
等等
刪除變量:unset name
(3)局部變量:生效范圍為當前shell進程中某代碼片段(通常指函數)
一般連續的字符串,數字,路徑等可以不加任何引號,不過無引號的情況最好用雙引號替代之。
如果變量中使用其他變量,則河以使用單引號否則無法使用,如下:
如果變量中有空格,就必須使用雙引號否則就無法輸出。
(4)位置變量:$1,$2…來表示,用于腳本在腳本代碼中調用通過命令行傳遞給它的參數
$1, $2…: 對應第一,第二等參數。獲取當前執行shell腳本的第n個參數值(參數值默認空格區分,如果參數加了雙引號,則將雙引號的整個作為一個參數,不管其中是否有空格。),n=1..9, 當n為0時表示腳本的文件名,如果大于9,用括起來。
$0: 命令本身
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立的字符串
$#: 傳遞給腳本的參數的個數
set — 清空所有位置變量
$0:是用來取腳本本身的名字,就是你命令之后跟的那個名字,如:
$#: 獲取當前傳給腳本的所有參數的個數,一般用于控制參數個數。
$?: 命令執行的返回值,0表示沒有錯誤,其他表示有錯誤
實例:
1、編寫腳本/root/bin/argsnumsh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數
2、編寫腳本/root/bin/hostping.h,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
3、編寫腳本/root/bin/checkdisk.sh,檢查磁盤分區空間和inode使用率,如果超過80%,就發廣播警告空間將滿
答案:
1.
[ “$@” ]&&(cat $1 |grep “^[[:space:]]*$” |wc -l) ||(echo 至少應該給一個文件參數!;exit)
2.
ping -c1 -w1 $1 &> /dev/null && echo “該IP地址可以訪問!“||echo”該IP地址不可訪問!“
3.
diskused_max=`df | grep sd|sort -nr -k5|head -1|tr -s ‘ ‘ %|cut -d% -f5`
inodeused_max=`df -i| grep sd|sort -nr -k5|head -1|tr -s ‘ ‘ %|cut -d% -f5`
[ “$diskused_max” -gt “80” ] && wall “空間即將滿“||echo “空間使用率不超過80%”
[ “$inodeused_max” -gt “80” ] && wall “inode即將滿“||echo “inode使用率不超過80%”
unset diskused_max inodeused_max
原創文章,作者:xxcj,如若轉載,請注明出處:http://www.www58058.com/83877