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