Bash 在 OS X 和 Linux 中的空格处理

Bash 在 OS X 和 Linux 中的空格处理

我正在尝试在几个不同的平台上运行一个非常简单的脚本:

#!/bin/bash
STRING="this is a test"
echo $STRING

,我不知道为什么在 Mavericks 和 Yosemite 上我得到了这样的输出:

./starter.sh line 2: is": command not found

而在线 Bash 终端模拟器(抱歉,我手边没有任何 Linux 设置,因此我使用:)按预期运行代码。根据Apple 自己的入门文档这应该可行。换句话说,双引号会被忽略。

几点:

  • 变量名、等号运算符和赋值之间没有空格;
  • 对我来说,转义空格不是一个有效的答案,因为最终目标是制作一些更复杂的脚本……但显然我必须先“完成”这一小步。

答案1

错误消息不太正确,但它看起来很像脚本使用花哨(或“智能”)双引号而不是普通(ASCII)双引号时收到的消息。shell 无法理解花哨的引号,因此它们会使脚本的行为非常奇怪。尝试使用以下命令打印出脚本:

LC_ALL=c cat -vet starter.sh

这将显示文件中任何奇怪的(非纯 ASCII 或非打印)字符。如果它打印如下内容:

#!/bin/bash$
STRING=?M-^@M-^\this is a test?M-^@M-^]$
echo $STRING$

... “?M-^@M-^\” 和 “?M-^@M-^]” 位是 UTF-8 编码中的花哨引号。另一方面,如果文件的行以“^M$”而不是“$”结尾,那么 Sleafar 是正确的,您得到的是 DOS/Windows 格式的文件。

答案2

检查文件中使用什么作为“行尾”。不同的系统使用不同的控制字符:

  • Linux:LF
  • 视窗:CR+LF
  • 苹果:CR

如果不进行转换,则无法在所有系统上使用相同的脚本。

相关内容