シェルスクリプト: オプションを含む変数の作成

シェルスクリプト: オプションを含む変数の作成

次のパラメータを使用するrsyncコマンドがあります。

rsync -avz --{partial,stats,delete,exclude=".*"}

そのパラメータを変数に入れてスクリプトで再利用できるようにしたいと思います。このような:

#!/bin/bash
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
$VAR /dir1 /dir2

引用符、一重引用符、角かっこを試してみましたが、成功しませんでした。

答え1

複雑なコマンドを変数に入れることは決して推奨されるアプローチではありません。バラよりBashFAQ/050 - コマンドを変数に入れようとしていますが、複雑な場合は常に失敗します。

変数の代わりに関数を使用し、関数にパラメータを渡すことにした場合、要件は非常に簡単になります。

それはまるで

rsync_custom() {
    [ "$#" -eq 0 ] && { printf 'no arguments supplied' >&2; exit 1 ; }
    rsync -avz --{partial,stats,delete,exclude=".*"} "$@"
}

ここで必須パラメータを渡します。

rsync_custom /dir1 /dir2

関数定義はある点で非常に簡単です。まず、$#ゼロにならない変数を使用して入力パラメータの数を確認します。引数が指定されていないというエラーメッセージが表示されます。有効な引数がある場合、"$@"関数に与えられた実際の引数を示します。

これがよく使用する関数(スクリプト/コマンドラインなど)の場合は、シェルの起動ファイルに追加します(.bashrc例:.bash_profile

あるいは、前述のように、読みやすさを高めるために、中かっこ拡張を別々の引数に拡張することが価値があるかもしれません。

rsync_custom() {
    [ "$#" -eq 0 ] && { printf 'no arguments supplied' >&2; exit 1 ; }
    rsync -avz --partial --stats --delete --exclude=".*" "$@"
}

答え2

VAR=rsync -avz --{partial,stats,delete,exclude=".*"}

-avzこれは、パラメータなどを使用してコマンドを実行し、--partial環境に設定しようとします。--statsVARrsync

VAR='rsync -avz --{partial,stats,delete,exclude=".*"}'

中かっこは引用符内で拡張されず、代入内でも拡張されず、変数拡張後も拡張されないため、引用された型は機能しません。

変数にコマンドライン引数を格納する必要がある場合は、配列を使用してください。

args=(rsync -avz --{partial,stats,delete,exclude=".*"})

さて、背中を別の単語に"${args[@]}"拡張してみてください。rsync-avz--partial

配列を使用すると、必要に応じてリストにオプションを追加することもできます。たとえば、次のようになります。

args=(this that)
if something ; then
    args+=(another_arg)
fi
"$cmd" "${args[@]}"

また見なさい:

答え3

少なくともいくつかのオプションを変数に保存できます。

opts=$(echo --{ignore-case,word-regexp,count,exclude="sys*.*"})

シールドが難しい可能性があるため、テストが重要です。

echo $opts
--ignore-case --word-regexp --count --exclude="sys*.*"

grep $opts bytes *.log 

履歴の使用、エイリアスの使用、関数の使用など、いくつかのオプションがあるため、明確なユースケースは思い出されません。複雑なオプションは、異なるプログラム間で共有されることがほとんどないため、インタラクティブシェルの一時的なソリューションの場合、エイリアスはより良いアプローチであるようです。

alias cgrep='grep --ignore-case --word-regexp --count --exclude="sys*"'
cgrep bytes *.log

あなたのサンプル

VAR=rsync -avz --{partial,stats,delete,exclude=".*"}

操作が最初のスペースで終わるため、機能しません。スペースを隠す必要があります。

VAR='rsync -avz --{partial,stats,delete,exclude=".*"}'

--deleteオプションでテストするのは非常に危険ではありませんか?オプションには「、」と一重引用符が含まれる可能性があるため、マスキングは迅速に困難になります。エイリアスまたは依存関係の記録を選択します。

複数のセッションで継続的に使用できるように、エイリアスを ~/.bashrc ファイルに保存できます。関数はbashrcに保存することもできますが、引数を処理するには関数に渡してそこで評価するだけです。

関連情報