`第 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 line
或 LC_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
执行您的脚本以打印变量的值,然后您就会看到问题所在。
#!/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 line
或 LC_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
执行您的脚本以打印变量的值,然后您就会看到问题所在。