変数を受け入れるスクリプトを取得できません

変数を受け入れるスクリプトを取得できません

バックアップを自動化するための最初の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)NAMENAME

したがって、変更されたスクリプトは次のようになります。

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を使用してスクリプトを確認できます。

関連情報