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

问题描述

#!/bin/bash
set -e

deb_folder='/home'


myinstall(){
    deb=$1
    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,但在将 here 更改为 md5=md5sum $deb 后我得到了 md5=$(md5sum $deb)

问题出在哪里?

解决方法

问题 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 执行脚本以打印变量的值,然后您就会看到问题。