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”之后开始,而是从行的开头开始,因为这是您(不知不觉)告诉光标要去的地方。然后,它会使前几个字符过度疲劳