shell指令碼的常用總結
一. shell指令碼呼叫另一個指令碼的三種形式(網上摘錄)
fork
形式: ./2.sh(預設)
執行的時候開一個sub-shell執行呼叫的指令碼,sub-shell執行的時候, parent-shell還在。
sub-shell執行完畢後返回parent-shell. sub-shell從parent-shell繼承環境變數.但是sub-shell中的環境變數不會帶回parent-shellexec (exec /directory/script.sh)
形式:exec ./2.sh
exec與fork不同,不需要新開一個sub-shell來執行被呼叫的指令碼. 被呼叫的指令碼與父指令碼在同一個shell內執行。
但是使用exec呼叫一個新指令碼以後, 父指令碼中exec行之後的內容就不會再執行了。這是exec和source的區別- source (source /directory/script.sh)
形式: . ./2.sh
與fork的區別是不新開一個sub-shell來執行被呼叫的指令碼,而是在同一個shell中執行. 所以被呼叫的指令碼中宣告的變數和環境變數, 都可以在主指令碼中得到和使用.
./a.sh ./b.sh
二. $()和${}區別
$( ) 與 ` ` (反引號) 都是用來做命令替換用
例如:command1 command2
command3 (cmd3提換出來給cmd2->cmd1) 錯誤表示式
若需上述修改:command1`command2\
command3` 正確
也可以使用$()就減小 \
command1$(command2 $(command3))
${}用來做變數替換
A=B
${A}B $AB 前者為BB 後者為空
三. tr命令
可以對來自標準輸入的字元進行替換、壓縮和刪除。它可以將一組字元變成另一組字元,經常用來編寫優美的單行命令,作用很強大。
tr ’ ’ ‘\n’ 將空格提換成\n
-s: echo “1122333345” | tr -s ‘13’
-c:取代
-d:刪除
四. sed表示式
sed ‘/^$/d’ 刪除空行. 正則表示式中^表示行首,$表示行尾,^$表示空行.d表示刪除
五. awk
awk ‘{print “\t”,NR”.”,$0}’
NR是awk內建變數,Number of Records的縮寫,表示當前記錄條數(檔案行數);$0表示當前行的所有內容。
六. cat<< EOF
列印資訊
EOF
七. $# 表示傳入指令碼引數的個數
八. shift
位置引數可以用shift命令左移。比如shift 3表示原來的
八、#/和%/的區別
M=$(pwd -P) // /a/b/c/d
M=”${M%/*}” // /a/b/c
N=”${M#*/}” // a/b/c/d
也就是說%/*代表取從頭到最後一個slash之前的所有內容
#/*代表去取從第一個slash之後的所有內容
九、##_和%%_的區別
AD=dsfssd_config
echo ${AD##*_}
config
echo ${AD%%_*}
dsfssd
十. 正確、錯誤、警告的列印方式
echo -e “\033[47;31mERROR: $*\033[0m”
echo -e “\033[47;34mWARN: $*\033[0m”
echo -e “\033[47;30mINFO: $*\033[0m”
十一. 通過#*/做字串的剪下
假設我們定義了一個變數為:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分別替換得到不同的值:
${file#*/}:刪掉第一個 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:刪掉最後一個 / 及其左邊的字串:my.file.txt
${file#*.}:刪掉第一個 . 及其左邊的字串:file.txt
${file##*.}:刪掉最後一個 . 及其左邊的字串:txt
${file%/*}:刪掉最後一個 / 及其右邊的字串:/dir1/dir2/dir3
${file%%/*}:刪掉第一個 / 及其右邊的字串:(空值)
${file%.*}:刪掉最後一個 . 及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*}:刪掉第一個 . 及其右邊的字串:/dir1/dir2/dir3/my
記憶的方法:
是 去掉左邊(鍵盤上#在
單一符號是最小匹配;兩個符號是最大匹配
${file:0:5}:提取最左邊的 5 個位元組:/dir1
${file:5:5}:提取第 5 個位元組右邊的連續5個位元組:/dir2