この変数を代入するために私のbash変数が拡張されないのはなぜですか?

この変数を代入するために私のbash変数が拡張されないのはなぜですか?

使用する小さなスクリプトを作成していますrsync。変更可能な問題に固執しました。

  • 私はフォルダがあります: 、フォルダが/home/folder_1/あり、このフォルダは毎日追加されます。202107252021072620210727
  • folder_2各フォルダには、転送したいファイルを含むフォルダがあります。
  • フルパスの例:/home/folder_1/20210727/folder_2/*

毎日マシン1からマシン2に転送する必要があるので、スクリプトをcronに入れて毎日自動的に実行したいと思います。

今日を念頭に置いて、次のように書きます。

y=${BASH_REMATCH[1]}
m=${BASH_REMATCH[2]}
d=${BASH_REMATCH[3]}
BASEDATE=`date '+%Y%m%d'`
DATA=$(eval "echo $BASEDATE")

したがって、と言えば今日(2021年7月27日)にecho $DATA返されます。20210727

ただし、次の変数を入力すると:

VAR_1='/home/folder_1/${DATA}/folder_2/*'

動作しません。echo $VAR_1戻ってくる

/home/folder_1/${DATA}/folder_2/*

私が望むものの代わりに:

/home/folder_1/20210727/folder_2/*

私のrsyncコマンドは次のようなので必要です。

rsync -av user@machine_1:${VAR_1} ${VAR_2}

VAR_2新しい場所へのパスは次のとおりですmachine_2

VAR_2='/home/folder_3/folder_4/'

その変数を使用して、毎日の日付で正しいパスを返す方法がわかりません。

どのように助け/アドバイスをすることができますか?よろしくお願いします!

答え1

問題は、一重引用符内で変数拡張が無効になることです。だからあなたの使命は

VAR_1='/home/folder_1/${DATA}/folder_2/*'

に変更する必要があります

VAR_1="/home/folder_1/${DATA}/folder_2/*"

代わりに。二重引用符は、グローバル文字()の拡張を依然として抑制します*。これはグローバル文字を引数として渡そうとするため必要ですrsync

注:

  • 環境にエクスポートしたくない場合は、シェル変数名にすべて大文字を使用しないことをお勧めします(PATHたとえば、誤って上書きすることを想像してください)。
  • シェル変数を使用する場合(あなたのrsync呼び出しを参照)二重引用符噴射が発生したくない限り。ほとんどの場合、ファイル名を処理するときにspaceファイル名に文字が許可されるため、これは起こりたくありません。
  • `...`コマンドを置き換えるために、古いスタイルシンボルと新しいスタイルシンボルを混在させています$( ... )。これは尊敬される簡単にネストできるように、新しいスタイルに固執してください。
  • なぜ必要なのか明確ではありません。
    DATA=$(eval "echo $BASEDATE")
    
    別言します。単に割り当てるだけで十分です。
    DATA=$(date +%Y%m%d)
    

関連情報