使用する小さなスクリプトを作成していますrsync
。変更可能な問題に固執しました。
- 私はフォルダがあります: 、フォルダが
/home/folder_1/
あり、このフォルダは毎日追加されます。20210725
20210726
20210727
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)