変数に格納されているスペースで区切られた引数をコマンドに渡します。

変数に格納されているスペースで区切られた引数をコマンドに渡します。

インターネット上で非常にきれいなバックアップスクリプトをハイジャックしましたが、どこかでこれが起こりました。

DIRS="/home/ /var/www/html /etc"

tar -czf /backup/file.tar.gz "${DIRS}"

これは私のコンピュータではうまく機能しますが、私のサーバーはこのパスが単一のパスであると考えており、パスが存在しないことを伝えます。

/bin/tar: /home/ /var/www/html /etc: Cannot stat: No such file or directory 
/bin/tar: Exiting with failure status due to previous errors

ローカルtarバージョンは1.29で、サーバーバージョンは1.28です。

この変数とは別のディレクトリをtarに提供する正しい方法は何ですか?

ベストアンサー1

これがbashスクリプト(またはほとんどのshバージョン)である限り、変数の代わりにパラメータを渡すには配列を使用する必要があります。

DIRS=('/home/' '/var/www/html' '/etc')

tar -czf /backup/file.tar.gz "${DIRS[@]}"

必要に応じて、次のように書くことができます(通常、配列が大きくなると読みやすくなります)。

DIRS=(
    '/home/' 
    '/var/www/html' 
    '/etc'
)

配列をサポートしていないシェルでは、単語の分離を可能にするために変数を逆参照する必要があります(避けられない場合はお勧めしません):

DIRS="/home/ /var/www/html /etc"

tar -czf /backup/file.tar.gz $DIRS

変数を参照してこれらの引数を渡す場合、デフォルトでは次のようになります。

tar -czf /backup/file.tar.gz "/home/ /var/www/html /etc"

ただし、引用された配列を渡すと、次のようになります。

tar -czf /backup/file.tar.gz "/home/" "/var/www/html" "/etc"

引用符のない配列または変数を渡すと、次のようなことが行われます。

tar -czf /backup/file.tar.gz /home/ /var/www/html /etc

この例では問題ではありませんが、追加の単語セパレータ、および望ましくないまたは潜在的に有害である可能性がある他の種類の拡張が発生します。

おすすめ記事