Linux 为什么Bash评估我存储在先前变量中的变量扩展?
我试图弄明白为什么Bash似乎在为一个变量计算变量扩展,在这个变量中,我使用了一个先前定义的变量,该变量使用变量扩展。也许这里还发生了什么事,但到底是什么,我不太明白 我定义了$LATEST_VERSION,以使所有内容都超过$LOCATION中的最后一个“/”,即从$LATEST_URL重定向到的URL 目前,$LATEST_版本的评估结果如下: v0.11.17 这是我正在执行的代码:Linux 为什么Bash评估我存储在先前变量中的变量扩展?,linux,bash,Linux,Bash,我试图弄明白为什么Bash似乎在为一个变量计算变量扩展,在这个变量中,我使用了一个先前定义的变量,该变量使用变量扩展。也许这里还发生了什么事,但到底是什么,我不太明白 我定义了$LATEST_VERSION,以使所有内容都超过$LOCATION中的最后一个“/”,即从$LATEST_URL重定向到的URL 目前,$LATEST_版本的评估结果如下: v0.11.17 这是我正在执行的代码: #!/bin/bash OS=${1:-"linux"} ARCH=${2:-"arm"} LATEST_
#!/bin/bash
OS=${1:-"linux"}
ARCH=${2:-"arm"}
LATEST_URL="https://github.com/syncthing/syncthing/releases/latest"
LOCATION=`curl -I $LATEST_URL | perl -n -e '/^Location: (.*)$/ && print "$1\n"'`
LATEST_VERSION=${LOCATION##*/}
VERSION=${3:-$LATEST_VERSION}
DOWNLOAD_URL="https://github.com/syncthing/syncthing/release/download/${VERSION}/syncthing-${OS}-${ARCH}-${VERSION}.tar.gz"
echo "DOWNLOAD_URL: ${DOWNLOAD_URL}"
在我回显下载URL:${DOWNLOAD\u URL}之前,一切都很好
.tar.gzing-linux-arm-v0.11.17com/syncthing/syncthing/release/download/v0.11.17
如果我从$DOWNLOAD_URL中取出$VERSION,它看起来就像预期的那样,$OS和$ARCH被替换了:
下载网址:
我尝试了所有的方法,从用echo-e,即
到
它们都给了我意想不到的结果。这里有我遗漏的东西吗
谢谢。您可能已经在来自互联网的数据中找到了CRLF行结尾,而回车CR则把事情搞砸了。它们将打印位置移动到行首,而不强制换行或换行。这就是为什么你会看到.tar.gz在这行的开头 如果您通过像od-c这样的程序回显最新版本的值,您将在末尾看到一个回车符 您的下载URL是从以下位置创建的:
DOWNLOAD_URL="https://github.com/syncthing/syncthing/release/download/${VERSION}/syncthing-${OS}-${ARCH}-${VERSION}.tar.gz"
echo "DOWNLOAD_URL: ${DOWNLOAD_URL}"
显示这些线段时,您会看到以下三个线段重叠:
DOWNLOAD_URL: https://github.com/syncthing/syncthing/release/download/v0.11.17\r
/syncthing-linux-arm-v0.11.17\r
.tar.gz
导致观察到的输出:
.tar.gzing-linux-arm-v0.11.17com/syncthing/syncthing/release/download/v0.11.17
要修复此问题,可以编辑回车符,请参见Bash手册中的:
LATEST_VERSION=${LATEST_VERSION/$'\r'/}
你可能从互联网上得到的数据中有CRLF行结尾,而回车CR把事情搞砸了。它们将打印位置移动到行首,而不强制换行或换行。这就是为什么你会看到.tar.gz在这行的开头 如果您通过像od-c这样的程序回显最新版本的值,您将在末尾看到一个回车符 您的下载URL是从以下位置创建的:
DOWNLOAD_URL="https://github.com/syncthing/syncthing/release/download/${VERSION}/syncthing-${OS}-${ARCH}-${VERSION}.tar.gz"
echo "DOWNLOAD_URL: ${DOWNLOAD_URL}"
显示这些线段时,您会看到以下三个线段重叠:
DOWNLOAD_URL: https://github.com/syncthing/syncthing/release/download/v0.11.17\r
/syncthing-linux-arm-v0.11.17\r
.tar.gz
导致观察到的输出:
.tar.gzing-linux-arm-v0.11.17com/syncthing/syncthing/release/download/v0.11.17
要修复此问题,可以编辑回车符,请参见Bash手册中的:
LATEST_VERSION=${LATEST_VERSION/$'\r'/}
有一个称为回车ASCII 13的特殊字符,也称为CR或\r,在打印时将光标移动到行首 HTTP头由回车/换行组合CR LF终止 Perl regex/^位置:.*$/将LF剥离。默认情况下不匹配换行符,但保留CR 最新版本包含v0.11.17,其中\r表示不可见的回车符 下载URL最终被删除https://github.com/syncthing/syncthing/release/download/v0.11.17\r/syncthing-linux-arm-v0.11.17\r.tar.gz再次使用\r表示回车符,打印时看起来乱七八糟,因为\r将光标向后移动: https://github.com/syncthing/syncthing/release/download/v0.11.17 /syncthing-linux-arm-v0.11.17 .tar.gz ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .tar.gzing-linux-arm-v0.11.17syncthing/release/download/v0.11.17
解决此问题的一种方法是将正则表达式更改为/^位置:.*\r\n/,这将\r移出$1。有一个名为回车ASCII 13的特殊字符,也称为CR或\r,在打印时将光标移动到行的开头 HTTP头由回车/换行组合CR LF终止 Perl regex/^位置:.*$/将LF剥离。默认情况下不匹配换行符,但保留CR 最新版本包含v0.11.17,其中\r表示不可见的回车符 下载URL最终被删除https://github.com/syncthing/syncthing/release/download/v0.11.17\r/syncthing-linux-arm-v0.11.17\r.tar.gz再次使用\r表示回车符,打印时看起来乱七八糟,因为\r将光标向后移动: https://github.com/syncthing/syncthing/release/download/v0.11.17 /syncthing-linux-arm-v0.11.17 .tar.gz ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .tar.gzing-linux-arm-v0.11.17syncthing/release/download/v0.11.17
解决此问题的一种方法是将正则表达式更改为/^位置:.*\r\n/,这会将\r移出$1。您可能在来自internet的数据中有CRLF行结尾,回车会把事情搞砸。这就是为什么您会在行的开头看到.tar.gz。脚本本身可能有DOS行的结尾;输出似乎与每个参数赋值一致,在赋值的末尾存储一个回车符。你可能在来自互联网的数据中有CRLF行结尾,回车符把事情搞砸了。这就是你看到的原因
可能脚本本身有DOS行的结尾;输出似乎与每个参数赋值一致,在赋值末尾存储回车符。