Bash

拆分命令和參數,並放入 bash 腳本中的變數

  • July 5, 2015

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

引用自:https://unix.stackexchange.com/questions/213750