バックアップを自動化するための最初のbashスクリプトを作成しています。私は最初の障害物にほとんどぶつかった。
変数を使用してtarアーカイブのファイル名を作成したいと思います。hostname date time.tar.bz2
私はこれを使って直接取得できますが、$(hostname)_$(date +"%FT%T")
変数に入れることはできないようです。
私の「テストスクリプト」は次のとおりです。
#! /bin/bash
NAME=$($(hostname)_$(date +"%FT%T"))
tar -cjvf "$(NAME).tar.bz2" testing testing2
(テストに使用される仮想ディレクトリはどこにありますtesting
か?)testing2
残念ながら、これは次のようになります。
$ scripts/trial.sh
scripts/trial.sh: line 6: NAME: command not found
Thu Jun 10 23:11:06 AEST 2021
NAME
私はその声明を解決策に分解しようとしました。
#! /bin/bash
## test of bits and pieces
NAME=$(hostname)_$(date +"%FT%T")
NAME_VAR=$(NAME)
Test=$(date)
echo $NAME_VAR
echo $Test
tar -cjvf "$(NAME_VAR).tar.bz2" testing testing2
ターミナルで以下を取得しました。
$ scripts/trial.sh
scripts/trial.sh: line 6: NAME: command not found
Thu Jun 10 23:34:37 AEST 2021
scripts/trial.sh: line 13: NAME_VAR: command not found
testing/
testing2/
なぜこれが起こるのか理解できません。私は何を見逃していますか?
答え1
シェルスクリプトを初めて試している場合は、次を使用することをお勧めします。住宅検査「キャリブレーション」シェルスクリプトは、多くのLinuxディストリビューションでスタンドアロンプログラムとしても使用できます。
直面している問題について:変数の逆参照のためにシェルとMakefileの構文を混同しているようです。シェルは、コマンドを実行しようとし、そのコマンドの出力を返す変数の値です。これを「コマンド置換」と呼びます(「$NAME
ドリップテスト」回避策を作成するときに正しく使用しました)。NAME
$(NAME)
NAME
NAME
したがって、変更されたスクリプトは次のようになります。
NAME="$(hostname)_$(date +"%FT%T")"
tar -cjvf "$NAME.tar.bz2" testing testing2
参考までに
- すべて大文字の変数名は、環境変数としてシェルにエクスポートしない限り使用しないでください。そうしないと、重要な環境変数がクラッシュまたは上書きされる可能性があります
$PATH
。 - 正確でなければならない変数参照引用、特に変数にファイル名が含まれている場合。それ以外の場合は、シェルスクリプトでスペース、、、、
*
改行文字?
(たとえば、これらの文字もファイル名に表示される可能性があります!)などの特殊文字を含むファイル名を誤って見つけることができます。
ぜひご覧ください。
さらなる読書のため。
答え2
最初の行は次のようになります。
NAME=$(hostname)_$(date +"%FT%T")
あなたのやり方はコマンド置換を使用し、出力をコマンドとして扱い、存在しないのでエラーが発生します。
最後の行は次のとおりです。
tar -cjvf "$NAME.tar.bz2" testing testing2
後で参照するには、shellcheck.netを使用してスクリプトを確認できます。