![Bash 在 OS X 和 Linux 中的空格处理](https://linux22.com/image/1461212/Bash%20%E5%9C%A8%20OS%20X%20%E5%92%8C%20Linux%20%E4%B8%AD%E7%9A%84%E7%A9%BA%E6%A0%BC%E5%A4%84%E7%90%86.png)
我正在尝试在几个不同的平台上运行一个非常简单的脚本:
#!/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
如果不进行转换,则无法在所有系统上使用相同的脚本。