【发布时间】:2023-01-13 00:29:02
【问题描述】:
我在其他人编写的脚本中遇到条件语句的命令语法问题。脚本如下(截断)。
#! /bin/bash
# app_upgrade.sh
# Verify file integrity
filehash=$( md5sum install_package.tgz )
md5hash=$( cat install_package.tgz.md5 )
if [ -z $( diff <(echo $md5hash) <(echo $filehash) ) ]; then
printf "File Integrity Check Passed"
else
printf "File Integrity Check Failed"
exit
fi
当我运行此脚本时,由于出现意外的左括号,它在尝试解释条件语句时失败。报告给 CLI 的确切错误如下。
app_upgrade.sh: command substitution: line 118: syntax error near unexpected token `('
app_upgrade.sh: command substitution: line 118: ` diff <(echo $md5hash) <(echo $filehash) )'
我验证了 diff 是我系统上的可执行命令,由与运行脚本的用户相同的用户执行。我还从 CLI 运行了 diff <(echo $md5hash) <(echo $filehash),这没有任何问题。我也试图逃避括号,但也失败了。我很困惑为什么这会导致问题。
作为解决方法,我尝试了一些其他条件,因为如果我一开始就编写脚本,我就不会使用 diff 进行比较。我尝试对上面脚本中指定的条件进行以下替换。
if [ "$filehash" = "$md5hash" ] 但是,这没有用。即使哈希相同,条件也会导致比较意外失败。
if [[ "$filehash" == "$md5hash" ]] 这终于奏效了。
总之,我的问题是:
-
为什么脚本在尝试解释原始条件语句中的
$( diff <(echo $md5hash) <(echo $filehash)时会因语法错误而失败? -
在我更新的条件语句中,假设两个哈希相同,为什么
if [ "$filehash" = "$md5hash" ]失败但if [[ "$filehash" == "$md5hash" ]]成功?根据我的研究,这两种方法似乎都是在 bash 中比较字符串的有效方法。提前致谢!
【问题讨论】:
-
在
$(diff ...)周围加上双引号 -
if cmp -s <(md5sum install_package.tgz) <(cat install_package.tgz.md5); then foo; else bar; fi也许吧。 -
整个脚本可以简化为
if md5sum -c install_package.tgz.md5 >/dev/null 2>&1; then echo "File Integrity Check Passed"; else echo "File Integrity Check Failed"; exit; fi
标签: bash conditional-statements syntax-error unexpected-token