我是脚本新手,正在尝试弄清楚它的作用。您能帮忙吗?
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
放在同一行,就像您在原始代码中所做的那样;只要你保持一致,这两种方式都不重要。然而,几乎所有经验丰富的编码人员都使用缩进来显示代码结构,这将是一种非常值得在您自己的代码中使用的方法,因为它有助于减少整个类别的错误。if
if [ -z "$1" ]; then
最后,可以使用单个条件赋值以更惯用的方式替换整个块:
strDate=${1:-$(date +'%Y%m%d')}