Linux Bash中带有变量的If语句

Linux Bash中带有变量的If语句,linux,bash,shell,variables,if-statement,jq,Linux,Bash,Shell,Variables,If Statement,Jq,我试图检查远程版本是否大于带有变量和if语句的本地版本 但是,到目前为止,变量响应正确的版本,但即使远程版本大于本地版本,if语句也不会发生任何变化,我做错了什么 谢谢 lversion_notepadqq() { notepadqq -v } rmersion_notepadqq() { curl -s https://api.github.com/repos/notepadqq/notepadqq/releases | grep tag_name | cut -d \" -

我试图检查远程版本是否大于带有变量和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


如果版本标记是字符串,则应引用变量(以避免在限制情况下出现语法错误,例如空值)

注1:>和<是重定向运算符,因此使用\来转义


注2:如果你可以有像1.3.9和1.3.10这样的标签(来自@chepner comment),那么字典比较是不够的。如果是这种情况,您应该分别比较每个版本组。。。请参阅以下更新

更新:要正确比较版本,您应该更安全地使用以下功能:

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
比较(){
#返回:
#如果版本相同,则为-0(顺便说一下:1.4==1.4.0)
#-1如果第1个版本更大
#-2如果第二个版本更大
本地v1=($(回显“$1”| tr.”)
本地v2=($(回显“$2”| tr.”)
本地len=“$(最大值“${v1[*]}”${{v2[*]}”)

对于((i=0;i如果版本标记是字符串,则应引用变量(以避免在限制情况下出现语法错误,例如空值)

注1:>和<是重定向运算符,因此使用\来转义


注2:如果你可以有像1.3.9和1.3.10这样的标签(来自@chepner comment),那么字典比较是不够的。如果是这样,你应该分别比较每个版本组…请参阅以下更新

更新:要正确比较版本,您应该更安全地使用以下功能:

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
比较(){
#返回:
#如果版本相同,则为-0(顺便说一下:1.4==1.4.0)
#-1如果第1个版本更大
#-2如果第二个版本更大
本地v1=($(回显“$1”| tr.”)
本地v2=($(回显“$2”| tr.”)
本地len=“$(最大值“${v1[*]}”${{v2[*]}”)

对于((i=0;i不是一个完整的响应,而是获取版本的更好/正确的方法:

curl -s https://api.github.com/repos/notepadqq/notepadqq/releases |
    jq -r '[ .[] | select(.tag_name | contains("v")) | .tag_name][0]'
输出: 注
不要使用grep | tr等解析JSON。请使用正确的解析器:

不是完整的响应,而是更好/正确的获取版本的方法:

curl -s https://api.github.com/repos/notepadqq/notepadqq/releases |
    jq -r '[ .[] | select(.tag_name | contains("v")) | .tag_name][0]'
输出: 注
不要用grep | tr等解析JSON。使用合适的解析器:

echo
命令的结果是什么?什么是
$Local
$Remote
变量值?
((rmersion\u notepadqq>lversion\u notepadqq))
不起作用,因为
rmersion\u notepadqq
lversion\u notepadqq
被解释为变量名。要调用函数,必须将其封装在
$(…)
。您确定脚本是使用bash执行的吗?将
#!/bin/bash
添加到开头。
bash
本身无法有意义地比较版本号。您需要逐个字段进行比较。例如,要比较
1.3.9
1.3.10
,您需要执行
1
的整数比较
1
3
vs
3
、和
9
vs
10
echo
命令的结果是什么?什么是
$Local
$Remote
变量值?
((rmersion\u notepadqq>lversion\u notepadqq))
不起作用,因为
rmersion\u notepadqq
lversion\u notepadqq
被解释为变量名。要调用函数,必须将其封装在
$(…)
。您确定脚本是使用bash执行的吗?将
#!/bin/bash
添加到开头。
bash
本身无法有意义地比较版本号。您需要逐个字段进行比较。例如,要比较
1.3.9
1.3.10
,您需要执行
1
的整数比较
1
3
vs
3
9
vs
10
。不完全是这样,
如果得到
[
的支持,则会按字典顺序比较值。使用
(…)
会产生错误(如果标记看起来像浮点数),或者会给出错误的结果(如果值是有效的标识符)。如果您可以使用
1.3.9
1.3.10
@Socowi:Double括号-(…)用于算术运算,那么字典比较是不够的。因此,通常
[
不能保证支持
进行字符串比较。
bash
的内置
[
确实如此,但是如果您知道您正在使用
bash
,那么您也可以使用
[[…>…]]
。您是否引用了变量($Local“…”)?不完全正确,
,如果
[
支持,则按字典顺序比较值。使用
(…)
会产生错误(如果标记看起来像浮点数)或可能给出错误的结果(如果值是有效标识符)。如果可以使用
1.3.9
1.3.10
@Socowi:Double圆括号-(…)这样的标记,词典比较是不够的,因此通常
[
不能保证支持
进行字符串比较。
bash
的内置
[
支持字符串比较,但是如果您知道您正在使用
bash
,您也可以改为使用
[…>]
。您是否引用了变量($Local…)?