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

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

次のパラメータを使用する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=".*" "$@"
}

おすすめ記事