Linux Bash腳本15分鐘進階教程
slice1="$"
# = "path2/file.ext"
slice2="$"
# = "path2"
slice3="$"
# = "file.ext"(注意:"-"前有空格)
pos=6
len=5
slice4="$:$}"
# = "path2"
替換操作(使用globbing)
f="path1/path2/file.ext"
single_subst="$"
# = "x/path2/file.ext"
global_subst="$"
# = "x/x/file.ext"
# 字元串拆分
readonly DIR_SEP="/"
array=($/ })
second_dir="$"
# = path2
刪除頭部或尾部(使用globbing)
f="path1/path2/file.ext"
# 刪除字元串頭部
extension="$" # = "ext"
# 以貪婪匹配方式刪除字元串頭部
filename="$" # = "file.ext"
# 刪除字元串尾部
dirname="$"
# = "path1/path2"
# 以貪婪匹配方式刪除字元串尾部
root="$"
# = "path1"
避免使用臨時文件
有些命令需要以文件名為參數,這樣一來就不能使用管道。這個時候?
# 下載並比較兩個網頁
diff
還有一個非常有用處的是」here documents」,它能讓你在標準輸入上輸入多行字元串。下面的』MARKER』可以替換成任何字詞。
# 任何字詞都可以當作分界符
command
...
$
$(cmd)
...
MARKER
如果文本里沒有內嵌變數替換操作,你可以把第一個MARKER用單引號包起來:
command
...
no substitution is happening here.
$ (dollar sign) is passed through verbatim.
...
MARKER
內置變數
變數說明
$0腳本名稱
$n傳給腳本/函數的第n個參數
$$腳本的PID
$!上一個被執行的命令的PID(後台運行的進程)
$?上一個命令的退出狀態(管道命令使用$)
$#傳遞給腳本/函數的參數個數
$@傳遞給腳本/函數的所有參數(識別每個參數)
$*傳遞給腳本/函數的所有參數(把所有參數當成一個字元串)
提示
使用$*很少是正確的選擇。
$@能夠處理空格參數,而且參數間的空格也能正確的處理。
使用$@時應該用雙引號括起來,像」$@」這樣。
調試
對腳本進行語法檢查:
bash -n myscript.sh
跟蹤腳本里每個命令的執行:
bash -v myscripts.sh
跟蹤腳本里每個命令的執行並附加擴充信息:
bash -x myscript.sh
你可以在腳本頭部使用set -o verbose和set -o xtrace來永久指定-v和-o。當在遠程機器上執行腳本時,這樣做非常有用,用它來輸出遠程信息。
什麼時候不應該使用bash腳本
你的腳本太長,多達幾百行
你需要比數組更複雜的數據結構
出現了複雜的轉義問題
有太多的字元串操作
不太需要調用其它程序和跟其它程序管道交互
擔心性能
這個時候,你應該考慮一種腳本語言,比如Python或Ruby。
END
TAG:運維社 |