Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么Bash评估我存储在先前变量中的变量扩展?_Linux_Bash - Fatal编程技术网

Linux 为什么Bash评估我存储在先前变量中的变量扩展?

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_

我试图弄明白为什么Bash似乎在为一个变量计算变量扩展,在这个变量中,我使用了一个先前定义的变量,该变量使用变量扩展。也许这里还发生了什么事,但到底是什么,我不太明白

我定义了$LATEST_VERSION,以使所有内容都超过$LOCATION中的最后一个“/”,即从$LATEST_URL重定向到的URL

目前,$LATEST_版本的评估结果如下:

v0.11.17

这是我正在执行的代码:

#!/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行的结尾;输出似乎与每个参数赋值一致,在赋值末尾存储回车符。