1. 程式人生 > >shell指令碼的常用總結

shell指令碼的常用總結

一. shell指令碼呼叫另一個指令碼的三種形式(網上摘錄)

  • fork
    形式: ./2.sh(預設)
    執行的時候開一個sub-shell執行呼叫的指令碼,sub-shell執行的時候, parent-shell還在。
    sub-shell執行完畢後返回parent-shell. sub-shell從parent-shell繼承環境變數.但是sub-shell中的環境變數不會帶回parent-shell

  • exec (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 command2command3 (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表示原來的41,原來的52等等,原來的12、30不移動。不帶引數的shift命令相當於shift 1。
八、#/和%/的區別
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