if [ "@$1@" = "@@" ]; 会做什么? bash 中的意思?

if [ "@$1@" = "@@" ]; 会做什么? bash 中的意思?

我是脚本新手,正在尝试弄清楚它的作用。您能帮忙吗?

if [ "@$1@" = "@@" ]; then
strDate ='date +%Y%m%d' 
else
strDate=$1
fi

答案1

整体构造是一个if {条件} then {做某事} else {做一些不同的事情}。 shell 本身需要更多的语法来帮助它解析构造,例如fi表示构造的结束,以及[ ... ]执行条件测试。)

  • 条件测试[ "@$1@" = "@@" ]比较两个字符串是否相等 ( [ X = Y ]):

    • 第一个字符串@后跟程序或函数的第一个参数 ( $1),然后是另一个@。因此,如果您作为第一个参数传递,red那么字符串将为@red@.另一方面,如果你什么也没传递,那么字符串就只是@@
    • 第二个字符串是文字@@

    这里发生的是条件测试正在检查$1(程序或函数的第一个参数)是否为空。最好写成[ -z "$1" ].

  • 下一行strDate ='date +%Y%m%d'语法错误,无法运行。也许您的意思是strDate=`date +%Y%m%d`,现在最好写成strDate=$(date +%Y%m%d). (无论哪种情况,变量名、 和它的赋值之间都不能有空格=。显示的单引号 ( '...') 意味着赋值将是字符串中的 12 个字符date +%Y%m%d,但其目的是明确地使用反引号来分配运行该命令的输出。)此行将以$strDate格式将变量分配给今天的日期YYYYMMDD(例如 2022 年 8 月 12 日将是20220812)。

  • 最终赋值将作为程序或函数的第一个参数提供的值strDate=$1分配给变量。$strDate没有对您提供的代码中的值进行进一步验证。

我应该指出,您可以通过传递代码来识别许多语法和构造错误shellcheck(也可以在https://shellcheck.net/)。

这是更正后的代码,带有缩进以提高可读性:

if [ -z "$1" ]
then
    strDate=$(date +'%Y%m%d')
else
    strDate=$1
fi

您将看到 shell 的语法清楚地实现了我在第一段中给出的描述。有些人喜欢将与iethen放在同一行,就像您在原始代码中所做的那样;只要你保持一致,这两种方式都不重要。然而,几乎所有经验丰富的编码人员都使用缩进来显示代码结构,这将是一种非常值得在您自己的代码中使用的方法,因为它有助于减少整个类别的错误。ifif [ -z "$1" ]; then

最后,可以使用单个条件赋值以更惯用的方式替换整个块:

strDate=${1:-$(date +'%Y%m%d')}

相关内容