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

默認的環境變數 envprintenv)或set

消除本地變數和環境變數 unset

定義變數:習慣:數字不加引號,其他默認加雙引號

引號

名稱 解釋
單引 號 可以說是所見即所得:即將單引號內的所有內容都原樣輸出,或者描述為單引號裡面看到的是什麼就會輸出什麼。
雙引號 把雙引號內的所有內容都輸出出來;如果內容中有命令(要反引下)、變數、特殊轉義符等,會先把變數、命令解析出結果,然後再輸出最終內容來。
無引號 把內容輸出出來前,會將含有空格的字元串視為一個整體輸出,如果內容中有命令、變數等,會先把變數、命令解析出結果,然後在輸出最終內容來,如果字元串中帶有空格等特殊字元,則不能完整的輸出,需要改加雙引號,一般連續的字元串,數字,路徑等可以不加任何引號,不過無引號的情況最好用雙引號替代之。

變數的命名規範

  • 變數名要統一,使用全部大寫字母,如APCHE_ERR_NUM;語義要清晰,能夠正確表達變數內容含義,過長的英文單詞可採用前幾個字元代替,多個單詞連接用「_」連接,引用時,最好以${APACHE_ERR_NUM}或”${APACHE_ERR_NUM}“的方式引用變數。

  • 避免無意義字元或數字:例如下面的COUNT,並不知道其確切含義

  • 範例1:COUNT的不確切定義 COUNT=$(grep keywords file)

  • 全局變數和局部變數命名

    • 腳本中的全局變數定義,如USER_HOMEUSERHOME,在變數使用時,使用 { }將變數括或”${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[@]}
Tags: