shell常用集錦
該文整理一些常用的shell用法,及語法,並非介紹如何使用
變數
變數可分為兩類:環境變數ENV(全局)和局部變數。
bash環境變數
變數名 | 含義 |
---|---|
_= | 上一條命令的最後一個參數 |
BASH_VERSION=”4.1.2(1)-release” | 當前bash實例的版本號 |
COLORS=”/etc/DIR_COLORS” | |
COLUMNS=80 | 設置該變數就給shell編輯模式和選擇命令定義了編輯窗口的寬度 |
CVS_RSH=”ssh” | |
DIRSTACK | 代表目錄棧當前的內容 |
EUID=0 | 為在shell啟動時被初始化的當前用戶的有效ID |
G_BROKEN_FILENAMES=1 | |
GROUPS=() | 當前用戶所屬組 |
HISTFILE=/root/.bash_history | 歷史記錄文件的全路徑 |
HISTFILESIZE=50 | 歷史文件能包含的最大行數 |
HISTSIZE=50 | 記錄在命令行歷史文件中的命令行數 |
HOME=/root | 當前用戶家目錄 |
HOSTNAME= | 當前主機機器名稱 |
HOSTTYPE=x86_64 | |
IFS=$’\t\n’ | 內容欄位分隔符,一般是空格符、製表符、和換行符,用於由命令替換,循環結構中的表和讀取的輸入產生的詞的欄位劃分。 |
INPUTRC=/etc/inputrc | readline啟動文件的文件名。取代默認的~/.inputrc |
JAVA_HOME=/app/jdk1.6 | |
KDENIR=/usr | |
KDE IS PRELINKED=1 | |
LANG=zh_CN.GB18030 | |
LESSONPEN | |
LINES=36 | |
LONGNAME=root | 登陸的用戶名 |
LS_COLORS=xx | |
MACHTYPE=x86_64-redhat-linux-gnu | 包含一個描述正在運行bash的系統串 |
MAILCHECK=60 | 這個參數定義shell將隔多長時間(以秒為單位檢查一次由參數MAILPATH或MAILFILE)指定的文件,看看是否有郵件到達。默認600秒 |
MAIL=/var/spool/mail/root | 郵件全路徑 |
OLDPWD=/root | 前一個當前工作目錄 |
OPTERR=1 | 如果設置為1,秒年十時毫,來自getopts內置命令的錯誤資訊。 |
OPTIND=1 | 下一個有getopts內置命令處理的參數序號 |
OSTYPE=linux-gnu | 自動設置稱一個串,該串標書正在運行bash的作業系統,默認值有系統決定 |
PATH | 全局PATH路徑。命令搜索路徑。一個有冒號分隔的目錄列表,shell用它來搜索命令。默認路徑有系統決定,並且由安裝bash的管理員設置。 |
PIPESTATUS=([0]=0 [1]=1) | 一個數組,包含一列最進在管道執行的前台作業的進程退出狀態值。 |
PPID=1112 | 父進程的進程ID |
PS1=[\u@\h \W]$ | 主提示符串,默認值是$ |
PS2= > | 次提示符串,默認值是> |
PS4=+ | 當開啟追蹤時使用的調試提示符串,默認值是+,追蹤可用set-x開啟。 |
PWD | 當前用戶家目錄。 |
SHELL=/bin/bash | |
SHLVL=1 | 每啟動一個bash實例就將其加1 |
TMOUT=3600 | 退出前等待超時的秒數。 |
UID=0 | 當前用戶的UID,在shell啟動時初始化。 |
USER=root | 當前用戶的用戶名,在shell啟動時初始化。 |
自定義環境變數 export
默認的環境變數 env
(printenv
)或set
消除本地變數和環境變數 unset
定義變數:習慣:數字不加引號,其他默認加雙引號
引號
名稱 | 解釋 |
---|---|
單引 號 | 可以說是所見即所得:即將單引號內的所有內容都原樣輸出,或者描述為單引號裡面看到的是什麼就會輸出什麼。 |
雙引號 | 把雙引號內的所有內容都輸出出來;如果內容中有命令(要反引下)、變數、特殊轉義符等,會先把變數、命令解析出結果,然後再輸出最終內容來。 |
無引號 | 把內容輸出出來前,會將含有空格的字元串視為一個整體輸出,如果內容中有命令、變數等,會先把變數、命令解析出結果,然後在輸出最終內容來,如果字元串中帶有空格等特殊字元,則不能完整的輸出,需要改加雙引號,一般連續的字元串,數字,路徑等可以不加任何引號,不過無引號的情況最好用雙引號替代之。 |
變數的命名規範
-
變數名要統一,使用全部大寫字母,如
APCHE_ERR_NUM
;語義要清晰,能夠正確表達變數內容含義,過長的英文單詞可採用前幾個字元代替,多個單詞連接用「_」連接,引用時,最好以${APACHE_ERR_NUM}
或”${APACHE_ERR_NUM}
“的方式引用變數。 -
避免無意義字元或數字:例如下面的COUNT,並不知道其確切含義
-
範例1:COUNT的不確切定義
COUNT=$(grep keywords file)
-
全局變數和局部變數命名
- 腳本中的全局變數定義,如
USER_HOME
或USERHOME
,在變數使用時,使用{ }
將變數括或”${APACHE_ERR_NUM}"
了;變數後還有字元串隔不開的情況下,用大括弧擴一下${金庸}
新著作 - 腳本中局部變數定義:存在於腳本函數
(function)
中的變數稱為局部變數,要以local方式進行生命,使之只在本函數作用域內有效,防止變數在函數中的命名於變數外部程式中變數重名造成程式異常。下面是函數中的變數定義例子:
- 腳本中的全局變數定義,如
特殊變數
No | 位置變數 |
---|---|
$0 |
當前執行的shell腳本的文件名,如果執行腳本帶路徑則包括腳本路徑。 |
$n |
當前執行的shell腳本的第n個參數值,n=1..9,當n為0時表示腳本文件名,如果n大於9用大括弧括起來${10} . |
$# |
當前執行的shell腳本後面接的參數的總個數 |
$* |
當前shell的所有傳參的參數,將所有的參數視為單個字元串,相當於「$1$2$3.. 」注意$與#的區別 |
$@ |
這個程式的所有參數「$1」 「$2」 「$3」 ....」 ,這是將參數傳遞給其他程式的最佳方式,因為會保留所有內嵌在每個參數里的任何空白。 |
進程狀態變數 | |
$$ |
獲得當前shell腳本的進程號(PID) |
$? |
執行上一個指令的返回值(0為成功,非0為失敗) |
$! |
執行上一個指令的PID |
$_ |
在此之前執行的命令或腳本的最後一個參數。 |
$?
返回值參考
no | 意思 |
---|---|
0 | 表示允許成功 |
2 | 許可權拒絕 |
1~125 | 表示運行失敗,腳本命令、系統命令錯誤或參數傳遞錯誤 |
126 | 找到該命令了,但是無法運行 |
127 | 為找打要運行的命令$ zhangsan-bash: zhangsan: command not found $ echo $? 127 |
>128 | 命令被系統強制結束$ sleep 100000^C $ echo $?130 |
變數子串
表達式 | 說明 |
---|---|
${#string} |
返回$string的長度 |
${string:position} |
在\(string中,從位置\)position之後開始提取子串 |
${string:position:length} |
在$string中,從位置position之後開始提取長度為length的子串 |
${string#sub} |
從變數string開頭開始刪除最短匹配sub子串 |
${string##sub} |
從變數開頭開始刪除最長匹配子串 |
${string%sub} |
從變數string結尾開始刪除最短匹配sub子串 |
${string%%sub} |
從變數string結尾開始刪除最長匹配sub子串 |
${string/sub/rep} |
使用rep,來代替第一個匹配的sub |
${string/#sub/rep} |
如果string前綴匹配sub就用rep代替匹配sub |
變數替換
運算符號 | 替換 |
---|---|
${value:-word} |
如果變數名存在且非null,則返回變數的值。否則,返回word字元串。用途:如果變數未定義,則返回默認值。範例:${value:-word} ,如果value未定義,則表達式的值為word |
${value:=word} |
如果變數名存在且非null,則返回變數值。否則,設置這個變數值未word,並返回其值。用途:如果變數未定義,則設置變數為默認值,並返回默認值。範例:${value:=word} ,如果value未定義,則設置value的值為word,返回表達式的值也為word。 |
${value:?"not defined"} |
如果變數名存在且非null,則返回變數的值。否則顯示變數名:msg,並退出當前的命令或腳本。用途:用於捕捉由於變數未定義而導致的錯誤,並退出程式。範例:${value:?"not defined"} 如果value未定義,則顯示-bash:value:not defined 並退出。 |
${value:+word} |
如果變數名存在且非null,則返回word。否則返回null。用途:測試變數是否存在。範例:${value:+word} 如果value已經定義,返回word(也是就是真)。 |
數值(整數)計算
(( ))
如果要執行簡單的整數運算,只需將特定的算數表達式用 ((
和 ))
括起來即可。
shell的算數運算符號常置於$((
和 ))
的語法中。這一語法如同雙引號用能,除了內嵌雙引號無需轉義。
運算符 | 意義 |
---|---|
++ — | 增加及減少,可前置也可放在結尾 |
+ – !~ | 一元的正號與負號;邏輯與位的取反 |
* / % | 乘法、除法、與取余 |
+ – | 加法、減法 |
< <= > >= | 比較負號 |
== != | 相等與不相等,一個「=」賦值 |
<< >> | 向左位移 向右位移 |
& | 位的AND |
^ | 位的異或 |
| | 位的或 |
&& | 邏輯的AND(make && mak install) |
|| | 邏輯的OR(make || make install) |
?: | 條件表達式 |
= += -= *= /= &= ^= <<= >>= |= | 賦值運算符 a+=1都相當a=a+1 |
**
為冪運算:%
為取模運算(就是除法當中取餘數)。- 上面涉及到的參數變數必須位整數(整型)。不能是小數(浮點數)或者字元串。後面的bc命令可以進行浮點數運算,但一般較少用到。
echo $((a++))
和$((a--))
表示先輸出a自身的值,然後在進行++--
的運算,echo$((++a))
和echo$((--a))
表示先進行++--
的運算,在輸出a自身的值。
記憶方法:變數在前,先輸出變數值,變數在後,就是先運算後輸出變數的值
let
let賦值表達式,【注】let賦值表達式功能等同於((賦值表達式))
,例如 let i=i+8
expr
expr(evaluate(求值)expressions(表達式))命令:
expr命令一般用於整數值,但也可用於字元串,用來求表達式變數的值,同時expr是一個手工命令行計算器。
expr 2 + 2
expr 2 - 1
expr 2 * 1
expr 2 \* 1
expr 3 % 2
expr\([\)a+$b]表達式形式
# expr $[2+3] 5 # expr $[2**3] 8 # echo $[2**3] 8 2、 # a=1 # b=2 # expr $[$a+$b] 3 expr 將其後的串解釋為表達式計算其值,運算符前後需有空格
bc
bc是UNXI下的計算器,它也可以用在命令行中,bc支援科學計算,所以這種方法功能非常強大
# 一般工作中不這麼用
[root@Lnmp_01 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1*5
5
1/5
0
5/3
1
10+2
12
#
$ echo 5+10|bc
15
$ echo 5*20|bc
100
$ echo 10%3|bc
1
$ echo 10.5+3.1|bc
13.6
# 與expr的區別
$ echo `expr 1+1`
1+1
$ echo `expr 1 + 1`
2
$ echo `expr 1 + 1.2`
expr: 參數數目錯誤
$ echo 1+1|bc
2
$ echo 1 + 1|bc
2
# 保留小數位數
$ echo "scale=2;10.45246/2.2315"|bc
4.68
$ echo "10.45246/2.2315"|bc
4
$ echo 10.45246/2.2315|bc
4
# 進位轉換
$ echo "obase=2;2"|bc
10
$ echo "obase=10;10"|bc
10
$ echo "obase=8;10"|bc
12
範例:通過命令輸出1+2+3+4..+10=XX的表達式,並計算出結果
$ echo `seq -s "+" 10`=`seq -s '+' 10|bc`
1+2+3+4+5+6+7+8+9+10=55
$ echo `seq -s "+" 10`=$((`seq -s "+" 10`))
1+2+3+4+5+6+7+8+9+10=55
$ echo `seq -s "+" 10`=`seq -s ' + ' 10|xargs expr`
1+2+3+4+5+6+7+8+9+10=55
$ echo {1..10}|tr " " "+"
1+2+3+4+5+6+7+8+9+10
$ echo {1..10}|tr " " "+"|bc
55
$[]
# echo $[2+3]
5
# echo $[ 2 * 3 ]
6
條件測試
測試語句
語法 | 說明 |
---|---|
語法1:test <測試表達式> |
利用test命令進行條,test後有一個空格 |
語法2:[ <測試表達式> ] |
通過單中括弧進行,單中括弧中的內容前後都有一個空格 |
語法3:[[ <測試表達式> ]] |
通過雙中括弧進行,雙中括弧中的內容前後都有一個空格 |
語法4:((<測試表達式>)) |
通過雙小括弧進行,雙小括弧中的內容前後無空格 |
在[[ ]]
中可以使用通配符進行模式匹配。&& || > <
等操作符可以應用於[[ ]]
中,不能應用於[ ]
中。[]
中一般用-a、-o、-gt
等替代對整數進行關係運算,也可以使用Shell的算數運算符 (( ))
文件測試操作符
測試操作符 | 說明 |
---|---|
-f 文件file | 若文件存在且為普通文件則真 |
-d 文件 directory | 若文件存在且為目錄文件則真 |
-s 文件 size | 若文件存在切不為空(文件大小非0)則真 |
-e 文件 exist | 若文件存在則真,要區別-f |
-r 文件 read | 若文件存在且可讀則真 |
-w 文件write | 若文件存在且可寫則真 |
-x 文件 excute | 若文件存在且可執行則真 |
-L 文件link | 若文件存在且為鏈接文件則真 |
f1 -nt f2 never than | 若文件f1比文件f2新則真 |
f1 -ot f2 older than | 若文件f1比文件f2舊則真 |
f1 -ef f2 | 兩個文件具有同樣的設備號和i結點號 |
-k file | 文件是否設置了粘著位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。 |
-u file | 文件是否設置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。 |
-x file | 文件是否可執行,如果是,則返回 true。 |
-p file | 文件是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。 |
-w file | 文件是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。 |
字元串測試操作符
常用字元串測試操作符 | 說明 |
---|---|
-z “string” | 若串長度為0則真,-z可以理解為zero |
-n “string” | 若長度不為0則真,-n可以理解為no zero |
“string1″=”string2” | 若串1等於串2則真,可使用「==」代替「=」 |
“string1” != “string2” | 若串1不等於串2則真。但不能用「!==」代替「!=」 |
二元比較操作符
在[]中使用的比較符 | 在[[ ]]中使用的比較符 | 說明 |
---|---|---|
-eq | == | equal的縮寫,相等返回真 |
-ne | != | not equal的縮寫,不相等返回真 |
-gt | > | 大於greater than |
-ge | >= | 大於等於 greate equal |
-lt | < | 小於類似less than |
-le | <= | 小於等於less equal |
邏輯操作符
在[ ]中使用的比較符 | 在[[ ]]中使用的比較符 | 說明 |
---|---|---|
-a | && | and 與,兩端都為真,則真 |
-o | || | or 或,兩端有一個為真則真 |
! | ! | not 非,相反則為真 |
字體顏色
顏色範圍:30-37
echo -e "\033[30m 黑字體 test \033[0m"
echo -e "\033[31m 紅字體 test \033[0m"
echo -e "\033[32m 綠字體 test \033[0m"
echo -e "\033[33m 黃字體 test \033[0m"
echo -e "\033[34m 藍字體 test \033[0m"
echo -e "\033[35m 紫字體 test \033[0m"
echo -e "\033[36m 天藍字 test \033[0m"
echo -e "\033[37m 白色字 test \033[0m"
40-47
echo -e "\033[40;37m 黑底白字 welcome \033[0m"
echo -e "\033[41;37m 紅底白字 welcome \033[0m"
echo -e "\033[42;37m 綠底白字 welcome \033[0m"
echo -e "\033[43;37m 黃底白字 welcome \033[0m"
echo -e "\033[44;37m 藍底白字 welcome \033[0m"
echo -e "\033[45;37m 紫底白字 welcome \033[0m"
echo -e "\033[46;37m 天藍底白字 welcome \033[0m"
echo -e "\033[47;37m 白底白字 welcome \033[0m"
echo -e "\033[47;30m 白底黑字 welcome \033[0m"
通過定義變數方式給字體加顏色
#!/bin/bash
red='\033[31m'
green='\033[32m'
yellow='\033[33m'
blue='\033[34m'
pink='\E[1;35m'
end='\E[0m'
echo -e "${red} ======red======${end}"
echo -e "${yellow} =====yellow=====${end}"
循環
當型循環和直到型循環
while條件句
語法:
while 條件
do
指令...
done
until
until 條件.
do
指令...
done
for循環
for varName in 變數取值列表
do
指令...
done
讀取文件
1.
cat.log|while read line
do
done
2.
while read line
do
done<a.log
3)
exec <a.log
while read line
do
done
linux產生隨機數的
-
系統環境變數
$RANDAM
範圍 0-32767-
隨機數01-99之間的數字
$[RANDOM%99+1] # 一個數和一個數取余這個數,這個數一定小於這個數
-
-
openssl:
openssl rand -base64 8
-
通過時間獲得隨機數(date):
date +%s%N
-
/dev/random
設備:/dev/random設備,存儲著系統當前運行的環境的實時數據。它可以看作是系統某個時候,唯一值數據,因此可以用作隨機數元數據。我們可以通過文件讀取方式,讀得裡面數據。我們可以通過文件讀取方式,讀得裡面數據。/dev/urandom這個設備數據與random裡面一樣。只是,他是非阻塞的隨機數發生器,讀取操作不會產生阻塞。 -
UUID:
cat /proc/sys/kernel/random/uuid
-
mkpasswd -l 8
數組
Shell 數組用括弧來表示,元素用“空格”符號分割開:array=(value1 value2 ... valuen)
- 使用下標來定義數組:
array[0]=value0
- 讀取數組:
${array[index]}
- 數組中的所有元素:
${array[*]}"
或${array[@]}"
- 數組的長度:
${#array[*]}
或${#array[@]}