Linux Bash中带有变量的If语句
我试图检查远程版本是否大于带有变量和if语句的本地版本 但是,到目前为止,变量响应正确的版本,但即使远程版本大于本地版本,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 \" -
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
vs3
、和9
vs10
。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
vs3
和9
vs10
。不完全是这样,
如果得到[
的支持,则会按字典顺序比较值。使用(…)
会产生错误(如果标记看起来像浮点数),或者会给出错误的结果(如果值是有效的标识符)。如果您可以使用1.3.9
和1.3.10
@Socowi:Double括号-(…)用于算术运算,那么字典比较是不够的。因此,通常[
不能保证支持
进行字符串比较。bash
的内置[
确实如此,但是如果您知道您正在使用bash
,那么您也可以使用[[…>…]]
。您是否引用了变量($Local“…”)?不完全正确,
,如果[
支持,则按字典顺序比较值。使用(…)
会产生错误(如果标记看起来像浮点数)或可能给出错误的结果(如果值是有效标识符)。如果可以使用1.3.9
和1.3.10
@Socowi:Double圆括号-(…)这样的标记,词典比较是不够的,因此通常[
不能保证支持
进行字符串比较。bash
的内置[
支持字符串比较,但是如果您知道您正在使用bash
,您也可以改为使用[…>]
。您是否引用了变量($Local…)?