为什么我的 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")

所以如果我说echo $DATA,它会返回20210727今天:2021 年 7 月 27 日

但是,当我输入这样的变量时:

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

作为旁注:

  • 建议不要对 shell 变量使用全大写名称,除非您想将它们导出到环境中(想象一下意外覆盖PATH例如)。
  • 当使用 shell 变量时(参见您的rsync调用),建议双引号除非你希望发生分词。在大多数情况下,在处理文件名时,您不希望发生这种情况,因为 是space文件名中允许的字符。
  • 您正在混合使用旧式`...`和新式$( ... )符号来进行命令替换。这是受到推崇的坚持新的风格,因为这样可以轻松嵌套。
  • 目前尚不清楚为什么您需要
    DATA=$(eval "echo $BASEDATE")
    
    根本不。简单地分配就足够了
    DATA=$(date +%Y%m%d)
    

相关内容