Bash
拆分命令和參數,並放入 bash 腳本中的變數
grep
我有一個多次重複相同(很長)命令的腳本。我想通過減少行長來使腳本更具可讀性,所以我嘗試將部分命令放入變數中。這是行(在腳本中重複多次,使用不同的參數):
rsync -av --delete -R --exclude=alternatives /etc/ /backup.raw/ | grep -E '^deleting|[^/]$' >> /var/log/rsync.log
那條線工作正常。我試圖縮寫它的是:
_rscmd='rsync -av --delete -R' _mn=/backup.raw/ _grep='grep -E "^deleting|[^/]$"' _rslog=/var/log/rsync.log
所以“最後”行可能是:
$_rscmd --exclude=alternatives /etc/ $_mn | $_grep >> $_rslog
但是該行在
$_grep
變數上失敗。怎樣才能寫對?我嘗試使用"…"
and'…'
,但沒有運氣。請注意有效的原始 grep 命令。
如果使用變數,則拆分為不同的部分(命令和參數)不起作用。用於
eval
這種情況:eval $_rscmd --exclude=alternatives /etc/ $_mn | eval $_grep >> "$_rslog"
一般來說,使用shell 函式或別名 比使用變數更好:
alias my_grep='grep -E "^deleting|[^/]$"' ... ... | my_grep >> "$_rslog"
通常的方法是只將命令的參數作為變數
_mn=/backup.raw/ _rscmdarg='-av --delete -R' _greparg='-E "^deleting|[^/]$"' _rslog=/var/log/rsync.log
就像
$_rslog
文件和$_mn
目錄一樣,可以保留它們。“最後”行是:
rsync $_rscmdarg --exclude=alternatives /etc/ $_mn | grep $_greparg >> $_rslog