Bash 在shell脚本中,冒号(:)被视为变量创建的运算符

Bash 在shell脚本中,冒号(:)被视为变量创建的运算符,bash,shell,Bash,Shell,我有以下片段: host="https://example.com" port="80" url="${host}:${port}" echo $url 输出为: :80ps://example.com https://example.com:80 我怎么能逃出这里的结肠呢。我还尝试: url="${host}\:${port}" 但它没有起作用。 预期产出为: :80ps://example.com https://example.com:80 这对我来说很有效,尝试删除变量中的回

我有以下片段:

host="https://example.com"
port="80"
url="${host}:${port}"
echo $url
输出为:

:80ps://example.com
https://example.com:80
我怎么能逃出这里的结肠呢。我还尝试:

url="${host}\:${port}"
但它没有起作用。 预期产出为:

:80ps://example.com
https://example.com:80

这对我来说很有效,尝试删除变量中的回车,然后再试一次

new_host=$(echo "$host" |  tr -d '\r')
new_port=$(echo "$port" |  tr -d '\r')
new_url="${new_host}:${new_port}"

这对我来说很有效,尝试删除变量中的回车,然后再试一次

new_host=$(echo "$host" |  tr -d '\r')
new_port=$(echo "$port" |  tr -d '\r')
new_url="${new_host}:${new_port}"

您很可能遇到了我称之为Linefeed的困境。 如果我从StackOverflow复制您提供的代码并在我的机器上运行它(bash版本4.4.19(1)),那么它将正确输出

user@host:~$ cat script.sh
host="https://example.com"
port="80"
url="${host}:${port}"
echo $url

user@host:~$ bash script.sh
https://example.com:80
什么是Linefeed Limbo? 不同的操作系统使用不同的ASCII符号来表示文本(如脚本)中出现新行的时间。这是一个很好的介绍

如您所见,Unix和类Unix系统使用单个字符
\n
,也称为“换行符”。Windows以及其他系统都使用
\r\n
,因此“回车”后面跟着“换行”

现在的情况是,当您在Windows上的记事本之类的编辑器上编写脚本时,您编写的是
host=“example.com”\r\n
。当您将此文件复制到Linux中时,Linux会将
\r
解释为脚本的一部分,因为只有
\n
被视为新行。事实上,当我将我的换行样式更改为DOS样式时,我会得到您得到的确切输出

我怎样才能解决这个问题? 您有几个选项可以解决此问题

转换脚本(使用
dos2unix
) 由于您只需将
\r\n
的每个实例替换为
\n
,因此您可以使用所需的任何文本编辑软件。但是,如果您喜欢简单的解决方案,那么您可能需要
dos2unix
(及其姐妹
unix2dos
):

user@host:~$ dos2unix script.sh
dos2unix: converting file script.sh to Unix format...
就这样。现在运行您的文件,您将看到它运行良好

正确编码源文件 通过使用更高级的文本编辑器(如),可以定义要使用的换行符样式

通过将换行符类型更改为要在其上运行脚本的系统,您将不会再遇到类似的问题

奖金回合:为什么它会输出
:80ps://example.com
? 要理解为什么输出是这样,您必须查看脚本在做什么,以及
\r
的含义

试着把你的终端想象成一台老式打字机。归还马车意味着你又开始在左边写字了。画一条“新线”意味着滑动纸张。这两件事是分开的,我认为这就是为什么一些系统决定使用这两个字符作为逻辑“新行”

但我离题了。让我们看一下第一行,
host=”https://example.com“\r

打印时的意思是“打印,然后将托架放回起始位置”。然后打印
:80\r
时,它不会在“.com”之后开始,而是从行的开头开始,因为这是您(不知不觉)告诉光标要去的地方。然后,它会覆盖前几个字符,导致写入“:80ps://example.com”。请记住,在80岁之后,您再次放置了回车符,因此您编写的任何新文本最终都会再次覆盖开头。

您很可能遇到了我称之为换行延迟的情况。 如果我从StackOverflow复制您提供的代码并在我的机器上运行它(bash版本4.4.19(1)),那么它将正确输出

user@host:~$ cat script.sh
host="https://example.com"
port="80"
url="${host}:${port}"
echo $url

user@host:~$ bash script.sh
https://example.com:80
什么是Linefeed Limbo? 不同的操作系统使用不同的ASCII符号来表示文本(如脚本)中出现新行的时间。这是一个很好的介绍

如您所见,Unix和类Unix系统使用单个字符
\n
,也称为“换行符”。Windows以及其他系统都使用
\r\n
,因此“回车”后面跟着“换行”

现在的情况是,当您在Windows上的记事本之类的编辑器上编写脚本时,您编写的是
host=“example.com”\r\n
。当您将此文件复制到Linux中时,Linux会将
\r
解释为脚本的一部分,因为只有
\n
被视为新行。事实上,当我将我的换行样式更改为DOS样式时,我会得到您得到的确切输出

我怎样才能解决这个问题? 您有几个选项可以解决此问题

转换脚本(使用
dos2unix
) 由于您只需将
\r\n
的每个实例替换为
\n
,因此您可以使用所需的任何文本编辑软件。但是,如果您喜欢简单的解决方案,那么您可能需要
dos2unix
(及其姐妹
unix2dos
):

user@host:~$ dos2unix script.sh
dos2unix: converting file script.sh to Unix format...
就这样。现在运行您的文件,您将看到它运行良好

正确编码源文件 通过使用更高级的文本编辑器(如),可以定义要使用的换行符样式

通过将换行符类型更改为要在其上运行脚本的系统,您将不会再遇到类似的问题

奖金回合:为什么它会输出
:80ps://example.com
? 要理解为什么输出是这样,您必须查看脚本在做什么,以及
\r
的含义

试着把你的终端想象成一台老式打字机。归还马车意味着你又开始在左边写字了。画一条“新线”意味着滑动纸张。这两件事是分开的,我认为这就是为什么一些系统决定使用这两个字符作为逻辑“新行”

但我离题了。让我们看一下第一行,
host=”https://example.com“\r
。 打印时的意思是“打印,然后将托架放回起始位置”。然后打印
:80\r
时,它不会在“.com”之后开始,而是从行的开头开始,因为这是您(不知不觉)告诉光标要去的地方。然后,它会使前几个字符过度疲劳