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
変数で失敗します。どうすれば正しく書くことができますか?私は成功"…"
しませ'…'
んでした。 grepコマンドはもともと機能しました。
ベストアンサー1
変数を使用している場合は、複数の部分(コマンドとパラメータ)に分割することは機能しません。この例の場合eval
:
eval $_rscmd --exclude=alternatives /etc/ $_mn | eval $_grep >> "$_rslog"
一般的に使用するのが最善です。シェル機能またはニックネーム 変数を使用するよりも:
alias my_grep='grep -E "^deleting|[^/]$"'
...
... | my_grep >> "$_rslog"