BASH-正确引用日期命令

BASH-正确引用日期命令,bash,Bash,在编写bash脚本以解析选项卡分隔的文件的过程中,不幸的是,我需要向用户询问文件内容/创建之外的日期。我已经让一切工作正常,除了从用户那里循环输入错误的日期,直到他们输入与所需格式匹配的日期。 我的调试代码块如下所示 代码: 综上所述,似乎没有一个date命令在if中正确计算,而是直接在CLI上执行调试命令。 我相信这将是一个报价/回扣交易,但我似乎无法理解 不需要对不在类似引号内的引号进行转义。例如,不是 date -j -f \"%Y-%m-%d\" \"$EXPERIMENTDATE\"

在编写bash脚本以解析选项卡分隔的文件的过程中,不幸的是,我需要向用户询问文件内容/创建之外的日期。我已经让一切工作正常,除了从用户那里循环输入错误的日期,直到他们输入与所需格式匹配的日期。 我的调试代码块如下所示

代码:

综上所述,似乎没有一个date命令在if中正确计算,而是直接在CLI上执行调试命令。
我相信这将是一个报价/回扣交易,但我似乎无法理解

不需要对不在类似引号内的引号进行转义。例如,不是

date -j -f \"%Y-%m-%d\" \"$EXPERIMENTDATE\" +%Y-%m-%d > /dev/null  2>&1
但是


作为将来的参考,对于所提出的问题来说,这完全是太多的代码了。将来请更努力地创建一个或mcve。为了解释它的原因:“
\”
创建一个文字引号字符——也就是说,它将引号本身传递给
日期
命令;
\“
是作为数据的单个
,而不是语法,因此,如果您将
\“
作为传递到日期的格式字符串,您将得到文字
s在
date
的输出中。语法引号的要点是告诉shell如何在将内容传递给底层命令之前展开和拆分它们……现在,在一些不同的点上,您应该避免使用
echo-e
——请参阅POSIX规范中的
echo
部分,包括应用程序用法和基本原理部分。此外,如果您想要“调试打印”在这里,复制和粘贴它将实际运行与命令本身相同的操作<代码>打印“调试:”;printf“%q”date-j-f\%Y-%m-%d\“\”$EXPERIMENTDATE\“+%Y-%m-%d;printf'\n'在另一个点上——不要为自己的变量使用所有大写名称;这些是为环境变量和shell内置项保留的。有关环境变量命名约定的指导,请参见的第四段,记住环境变量和外壳变量共享一个名称空间。暗示总是可以转义类似引号内的引号并不一定准确<例如,代码>'\'',并没有达到预期效果。这只是一个措辞快速的语句,用于排除调试消息中转义的双引号。是的,就是这样。是故意转义双引号的,出于某种原因,我认为date需要将输入引号括起来。@Keiron,如果
EXPERIMENTDATE
可以包含空格或全局字符,那么您可以合法地使用语法引号将其作为单个参数传递(不管怎样,使用它们都是很好的做法)。您不需要将引号作为数据传递给
date
本身。
date -j -f \"%Y-%m-%d\" \"$EXPERIMENTDATE\" +%Y-%m-%d > /dev/null  2>&1
date -j -f "%Y-%m-%d" "$EXPERIMENTDATE" +%Y-%m-%d > /dev/null  2>&1