Shell基本操作與命令
Shell基本操作與命令
(原創內容,轉載請註明來源,謝謝)
本文主要是我最近學習shell語言的學習筆記,主要在於通過學習這些內容,達到看得懂shell指令碼、理解其與PHP的區別、編寫簡單指令碼的目的。
1、#!/bin/sh
放在程式開頭,表示用/bin/sh方式來解析。
2、變數
1)變數賦值 varname=’xxx’,除了在變數賦值和在FOR迴圈語句頭中,其他情況下BASH 中的變數使用必須在變數前加"$"符號,即採用 $varname使用變數。更為標準的變數引用方式是 ${STR} 這樣的,$STR 自不過是對 ${STR} 的一種簡化。在複雜情況下(即有可能產生歧義的地方)最好用帶 {} 的表示方式。
2)給變數賦值時,等於號=兩邊都不能有空格。
3)local定義區域性變數,export定義全域性變數。
4)保留變數:
$IFS 這個變數中儲存了用於分割輸入引數的分割字元,預設是空格。
$HOME 這個變數中儲存了當前使用者的根目錄路徑。
$PATH 這個變數中儲存了當前 Shell 的預設路徑字串。
$PS1 表示第一個系統提示符。
$PS2 表示的二個系統提示符。
$PWD 表示當前工作路徑。
$EDITOR 表示系統的預設編輯器名稱。
$BASH 表示當前 Shell 的路徑字串。
$RANDOM 隨機的生成一個大小在 1 到 65536 之間的整數。
5)變數的特殊操作:
${var-default} 表示如果變數 $var 還沒有設定,則保持 $var 沒有設定的狀態,並返回後面的預設值 default。
${var=default} 表示如果變數 $var 還沒有設定,則取後面的預設值 default。
${var+otherwise}表示如果變數 $var 已經設定,則返回 otherwise 的值,否則返回空( null )。
${var?err_msg} 表示如果變數 $var 已經設定,則返回該變數的值,否則將後面的 err_msg 輸出到標準錯誤輸出上。
${var#pattern},${var##pattern} 用於從變數 $var 中剝去最短(最長)的和 pattern 相匹配的最左側的串。
${var%pattern},${var%%pattern} 用於從變數 $var 中剝去最短(最長)的和 pattern 相匹配的最右側的串。
${var:pos} 表示去掉變數 $var 中前 pos 個字元。
${var:pos:len} 表示變數 $var 中去掉前 pos 個字元後的剩餘字串的前 len 個字元。
${var/pattern/replacement}表示將變數 $var 中第一個出現的 pattern 模式替換為 replacement 字串。
${var//pattern/replacement}表示將變數 $var 中出現的所有 pattern 模式全部都替換為 replacment 字串。
3、&& 和 || 以及 |
1)a && b 表示先執行a,成功再執行b。
2)a||b表示執行a,成功就不執行b,否則執行b。
3)a|b 表示先執行a,執行的結果用在執行b的過程。
4、特殊符號
1)# 用於開頭表示定義,用於其他行的行首表示本行註釋不執行
2); 多個語句放在同一行用此分隔。
3);; 在使用case時,作為每個選項的結束。
varname=b
case "$varbname" in
[a-z]) echo "abc";;
[0-9]) echo "123";;
esac
4)單引號和雙引號:同php
5)` (反引號),將命令執行的結果輸出到變數。
cp `mkdir back` test.sh back ,反引號中的先執行,然後執行拷貝cp命令。
6):
1. 空命令 bash的一個內建命令,退出碼是0。與 true作用相同。
2. 變數擴充套件/字串替換 : > 檔案 清空了這個檔案 和 cat 、dev/null 檔案 作用相同。但用 :不會產生新程序,因為是內建命令。
7)小括號 ()
1. 命令組,將括號內部的命令當做子shell,對指令碼剩餘部分不可用,變數存在作用域的問題。下列輸出的結果是123,即小括號內的在小括號外沒用。
a=123
( a=321;)
echo "a =$a"
2. 初始化陣列:arr=(1 3 5 7 9)
8)大括號{}
1. 檔名擴充套件 cp t.{txt,bak} 複製 t.txt 的內容到 t.bak 中
2. 程式碼塊,和小括號相反,大括號外面仍然可以使用裡面的變數。下面輸出321。
a=123
{ a=321;}
echo "a =$a"
9)中括號[]
1. if等條件放在中括號中 if [ $a -gt 10 ] ,方括號兩邊需要留空格。
2. 用來引用陣列元素,同PHP
10)<、>與<<、>>
首先,兩個符號和一個符號的相比,兩個符號的是輸出內容追加到檔案後面,一個符號的意思是直接輸出到檔案(覆蓋原來的內容)。
其次,符號表示重定向,大於小於用-gt和-lt。
例子:sort >>name.txt <<hello
1. sort>>name.txt 將sort命令的結果遮蔽輸出並重定向追加到name.txt檔案尾部(重定向標準輸出)。
2. name.txt<<hello執行name.txt,以hello作為所需要的輸入內容(重定向標準輸入)。
附加內容:
linux輸入輸出三種標準:標準輸入、標準輸出、標準錯誤輸出,分別是0/1/2,組合起來使用是 sort > name.txt 即sort 1> name.txt,但是要講錯誤輸出則用sort 2> name.txt,會把內容輸出到name.txt。如果要同時將標準輸出和標準錯誤輸出都輸出,則需要sort > name.txt 2>& 1,或者使用sort >& name.txt。
11) .
讀取並執行.sh檔案,且是在當前shell下執行(./xxx.sh是在子shell下執行)
5、$
1)$$ 當前Shell程序的ID
2)$0 當前指令碼的檔名
3)$n 傳遞給指令碼或函式的引數。n 是一個數字,表示第幾個引數。例如,第一個引數是$1,第二個引數是$2。最多到9,第十個無法用$10獲取,需要儲存$1以後,用shift命令把第一個變數剔除,則此時$9就是輸入的第十個變數。
4)$# 傳遞給指令碼或函式的引數個數。
5)$* 傳遞給指令碼或函式的所有引數。
6)$@ 傳遞給指令碼或函式的所有引數。被雙引號(" ")包含時,與 $* 稍有不同。"$*" 會將所有的引數作為一個整體,以"$1 $2 … $n"的形式輸出所有引數;"$@" 會將各個引數分開,以"$1" "$2" … "$n" 的形式輸出所有引數。
7)$? 上個命令的退出狀態,或函式的返回值。
6、判斷
執行man test可以檢視所有測試表達式可以比較和判斷的型別。
-e 檔案已經存在
-f 檔案是普通檔案
-s 檔案大小不為零
-d 檔案是一個目錄
-r 檔案對當前使用者可以讀取
-w 檔案對當前使用者可以寫入
-x 檔案對當前使用者可以執行
-g 檔案的 GID 標誌被設定
-u 檔案的 UID 標誌被設定
-O 檔案是屬於當前使用者的
-G 檔案的組 ID 和當前使用者相同
file1 -nt file2檔案 file1 比 file2 更新
file1 -ot file2檔案 file1 比 file2 更老
file1 -ef file2檔案 file1 是 file2 的硬連結
如 if [ -x /root ] 可以用於判斷 /root 目錄是否可以被當前使用者進入
對應的操作整數操作字串操作
相同 -eq =
不同 -ne !=
大於 -gt >
小於 -lt <
大於或等於 -ge
小於或等於 -le
為空 -z
不為空 -n ,建議使用 ! -z 代替
上次讀過之後做過修改 -N
比如:
比較整數 a 和 b 是否相等就寫做 if [ $a = $b ]
判斷整數 a 是否大於整數 b 就寫做 if [ $a -gt $b ]
比較字串 a 和 b 是否相等就寫作:if [ $a = $b ]
判斷字串 a 是否為空就寫作: if [ -z $a ]
判斷整數變數 a 是否大於 b 就寫作:if [ $a -gt $b ]
注意:在“[”和“]”符號的左右都留有空格。
7、除錯
sh -nyour_script 不需要執行指令碼只是檢查語法的模式,返回所有語法錯誤。
sh -x strangescript 執行該指令碼並顯示所有變數的值。
8、[[]]與[]區別
1)數字測試: -eq -ne -lt -le -gt -ge,[[ ]]同 [ ]一致 2)檔案測試: -r、-l、-w、-x、-f、-d、-s、-nt、-ot,[[ ]]同 [ ]一致 3)字串測試: > < =(同==) != -n -z,不可使用“<=”和“>=”,[[ ]]同 [ ]一致,但在[]中,>和<必須使用進行轉義,即>和< 4)邏輯測試: []為 -a -o ! [[ ]] 為&& || ! 5)數學運算: [] 不可以使用 [[ ]]可以使用+ - * / % 6)組合:均可用各自邏輯符號連線的數字(運算)測試、檔案測試、字元測試
兩個使用時都需要用空格分隔運算子和值。
9、(())
專門來做數值運算,如果表示式求值為 0,則設定退出狀態為 1;如果求值為非 0 值,則設定為 0。不需要對 (( 和 )) 之間的操作符轉義。算術只對整數進行。除 0 會產生錯誤,但不會產生溢位。可以執行 C 語言中常見的算術、邏輯和位操作。
下面兩種方法都輸出100:
((i=1+99));echo $i
i=99;((i++));echo $i
這種方法下符號和值不要有空格,和[[]]不一樣。
10、&
命令末尾的&,表示採用非阻塞的方式執行命令,即不必等待執行結果,可以一邊執行該行命令一邊往下執行。
11、函式
求函式的定義必須在函式使用之前。
函式引數的定義並不需要在函式定義處就制定,而只需要在函式被呼叫時用 BASH 的保留變數 $1 $2 ... 來引用就可以了。
BASH 的返回值可以用 return 語句來指定返回一個特定的整數,如果沒有 return 語句顯式的返回一個返回值,則返回值就是該函式最後一條語句執行的結果(一般為 0,如果執行失敗返回錯誤碼)。BASH 要求返回值必須為一個整數,不能用 return 語句返回字串變數。
函式的返回值在呼叫該函式的程式體中通過 $? 保留字來獲得。
例如:
square() {
let "res = $1 * $1"
return $res
}
square $1
result=$?
12、select
BASH 中提供了一個小的語句格式,可以讓程式快速的設計出一個字元介面的使用者互動選擇的選單,該功能就是由 select 語句來實現的,select 語句的語法為:
xxx=’a b c’
select var in $xxx
do
statments use $var
done
上面的語法結構在執行後,BASH 會將$xxx中的所有項加上數字列在螢幕上等待使用者選擇,在使用者作出選擇後,變數 $var 中就包含了那個被選中的字串,然後就可以對該變數進行需要的操作了。
13、read
等待使用者的輸入,並將使用者輸入的結果作為變數。
read NAME
echo "Hi! $NAME !"
此文章重點在於對shell的學習與複習,並且當作shell字典來使用,涵蓋大部分shell的常用寫法,在需要的時候可以及時檢視。
——written by linhxx 2017.07.28