インターネット上で非常にきれいなバックアップスクリプトをハイジャックしましたが、どこかでこれが起こりました。
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
この例では問題ではありませんが、追加の単語セパレータ、および望ましくないまたは潜在的に有害である可能性がある他の種類の拡張が発生します。
答え2
jesse_bのコメントに同意します。可能であれば配列を使用してください。
dirs="/home/ /var/www/html /etc"
dirs=($dirs)
tar -czf /backup/file.tar.gz "${dirs[@]}"
bashでは、すべての大文字変数を避けるのが最善だと付け加えたいと思いました。通常、環境変数と内部シェル変数は大文字で表示されます。重要な内容を上書きしないように、他のすべての変数名は小文字のままにするのが最善です。