我尝试在 bash 脚本中进行基本的字符串替换:
#!/bin/bash
x="I love Linux"
echo "${x/Linux/Unix}"
它在我的 Mac 上运行良好,但在我的服务器上不起作用。我尝试了不同网站的不同示例,但总是收到错误:
Bad substitution
我的 bash 版本:GNU bash, Version 4.4.12(1)-release (x86_64-pc-linux-gnu)
我究竟做错了什么?
答案1
echo "${x/Linux/Unix}"
自 1996 年发布的 2.0 版以来,这是 bash 中的正确语法。
Bash 不会发出确切的错误消息Bad substitution
。当它遇到看起来差不多但又不完全一样的东西(比如参数替换)时,它的消息略有不同:
$ bash -c '${}'
bash: ${}: bad substitution
另一方面,dash(/bin/sh
在许多 Linux 系统上实现)确实会发出以下确切消息:
$ dash -c 'echo "${x/Linux/Unix}"'
dash: 1: Bad substitution
这个错误足以暗示,正如库萨罗南达注意到的,您实际上并没有将此脚本作为程序运行:您正在运行某个程序(大概是sh
或 )/bin/sh
,并告诉它运行此脚本。您的脚本是正确的 bash 程序,但不是正确的 sh 程序,因此该脚本无法在 sh 是不同方言且不具有与 bash 相同功能集的系统上运行。
您的脚本是一个独立的程序。这舍邦脚本顶部的行告诉系统要使用什么解释器。要运行该脚本,只需键入其路径或文件名(如果它位于命令搜索路径 ( ) 上$PATH
)。与任何其他可执行程序一样,无论它是脚本(具有 shebang 行)还是非脚本(内核自行执行的二进制文件1),它都需要具有执行权限 ( chmod +x path/to/script
)。如果由于某种原因你有一个不是独立程序的脚本并且你想用 bash 运行它,请运行bash path/to/script
,而不是sh path/to/script
。
1 或者使用其他方式来传达如何执行文件,例如 Linux 上的 binfmt_misc 机制。