`第 1 行:当 运行 bash `case` 函数时,意外标记 `newline' 附近出现语法错误

`line 1: syntax error near unexpected token `newline'` when run bash `case` function

#!/bin/bash
set -e

deb_folder='/home'


myinstall(){
    deb=
    temp="${1%.*}"
    num="${temp##*.}"
    temp2="${temp%.*}"
    method="${temp2##*.}"
    case "$method" in
    md5)
    md5=md5sum $deb
    echo 'here'
    if [[ "${md5:0:3}${md5: -3}" == "$num" ]]; then echo 'correct' else echo $deb'md5 error';false;fi
    ;;
    256)
    sha256=sha256sum $deb
    if [[ "${sha256:0:3}${sha256: -3}" == "$num" ]]; then apt-get install $deb; else echo $deb'sha256 error';false;fi
       ;;
    *) echo $deb'sum type wrong'
       ;;
esac
}

myinstall "${deb_folder}/rstudio-1.4.1106-amd64.md5.e596d3.deb"

上面bash脚本的预期结果是correct/home/rstudio-1.4.1106-amd64.md5.e596d3.debmd5 error,但我在将md5=md5sum $deb更改为md5=$(md5sum $deb)后得到了here

问题出在哪里?

问题 1

而不是 md5=md5sum $deb 你可能意味着 md5=$(md5sum $deb) 甚至更好 md5=$(md5sum "$deb")sha256=sha256sum $deb.

也是如此

md5=$(md5sum $deb) 运行命令 md5sum $deb 并将其输出存储在变量 md5.

md5=md5sum $deb 运行“命令”$deb,同时为此命令设置环境变量 md5=md5sum。您可能以前在 IFS= read -r lineLC_ALL=C sort 等成语中看到过这种结构。

问题 2

以下if只有一个分支。 else 非常具有误导性。

if [[ "${md5:0:3}${md5: -3}" == "$num" ]]; then echo 'correct' else echo $deb'md5 error';false;fi

如果格式写得好,问题就很明显了:

if [[ "${md5:0:3}${md5: -3}" == "$num" ]]; then
  echo 'correct' else echo $deb'md5 error'
  false
fi

这里的else不是关键字,而是echo的简单参数。 如果 你输入 if 你会得到输出 correct else echo /home/rstudio-1.4.1106-amd64.md5.e596d3.debmd5 error.

要解决此问题,请在 else 之前添加一个 ; 或换行符。

您也可以修复检查 "${md5:0:3}${md5: -3}" == "$num"。我认为这些东西永远不会平等。使用 set -x 执行您的脚本以打印变量的值,然后您就会看到问题所在。