linux - Bash 中带有变量的 If 语句

标签 linux bash shell variables if-statement

<分区>

我正在尝试使用变量和 if 语句检查远程版本是否大于本地版本。

但是,到目前为止,变量回显了正确的版本,但即使远程版本大于本地版本,if 语句也没有任何反应,我做错了什么。

谢谢

lversion_notepadqq() {
    notepadqq -v
}

rmersion_notepadqq() {
    curl -s https://api.github.com/repos/notepadqq/notepadqq/releases | grep tag_name | cut -d \" -f 4 | grep v| tr -d 'v,' | head -1
}

Remote=$(curl -s https://api.github.com/repos/notepadqq/notepadqq/releases | grep tag_name | cut -d \" -f 4 | grep v| tr -d 'v,' | head -1)
Local=$(notepadqq -v)
echo Local Version: $Local
echo Remote Version: $Remote

if (( rmersion_notepadqq > lversion_notepadqq )); then 
    echo Updating && Update_Notepadqq
else
    echo No Update Needed
fi

#Neither if statement seems to work

if (( $Remote > $Local )); then 
    echo Updating && Update_Notepadqq
else
    echo No Update Needed
fi

输出:

Local Version: Notepadqq 1.4.8
Remote Version: 1.4.0
No Update Needed
./Specific-Updates.sh: line 50: ((: 1.4.0 > Notepadqq 1.4.8 : syntax error: invalid arithmetic operator (error token is ".4.0 > Notepadqq 1.4.8 ")
No Update Needed

最佳答案

如果您的版本标签是字符串,您应该引用您的变量(以避免在极限情况下出现语法错误,例如空值)。

Remote="1.4.0"
Local="1.3.9"

# lexicographic comparison
if [ "$Remote" \> "$Local" ]; then
  echo Updating # && Update_Notepadqq
else
  echo No Update Needed
fi

注意 1:> 和 < 是重定向操作符,所以用\. 转义它。

注意 2:如果您可以使用 1.3.9 和 1.3.10 之类的标签(来自@chepner 评论),词典顺序比较是不够的。如果是这种情况,您应该分别比较每个版本组...请参阅以下更新...

更新:要正确比较版本,您应该更安全地使用如下函数:

compareVersions() {

  # returns:
  #  - 0 if versions are equal (by the way: 1.4 == 1.4.0)
  #  - 1 if the 1st version is greater
  #  - 2 if the 2nd version is greater

  local v1=( $(echo "$1" | tr '.' ' ') )
  local v2=( $(echo "$2" | tr '.' ' ') )
  local len="$(max "${#v1[*]}" "${#v2[*]}")"
  for ((i=0; i<len; i++)); do
    [ "${v1[i]:-0}" -gt "${v2[i]:-0}" ] && return 1
    [ "${v1[i]:-0}" -lt "${v2[i]:-0}" ] && return 2
  done
  return 0
}

result=compareVersions "$Local" "$Remote";
if [ $result -eq 1 ]; then
  echo Updating # && Update_Notepadqq
else
  echo No Update Needed
fi

关于linux - Bash 中带有变量的 If 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55419534/

相关文章:

linux - 如何增加内核内部的进程能力?

c - 在 yyparse() 调用时执行操作?

linux - Cygwin:在高分辨率显示器上使用窗口缩放时 xwin 缩放损坏

python - 从 bash 脚本运行 Python 导致自定义模块导入错误

c - linux - 如何将编译器的所有输出捕获到文件以及需要显示输出

linux - 如何使用 set 设置 shell 函数的复杂参数

linux - dialog --menu 选中的选项

java - 在 Linux (Ubuntu) 中在 java 7 和 java 8 之间切换的推荐方法是什么?

linux - CURL 用于访问需要从其他页面登录的页面

javascript - Cron Job 在 Cloudwatch Events 中从上午 8 点到下午 4.30 每分钟运行一次