以下命令序列
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch
在终端中执行时或通过source
给出输出
b\\_d
当作为 scipt 运行时
sh script.sh
其中脚本内容是:
#!/bin/bash
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch
输出是
b\_d
终端的输出是首选。使用shell脚本的解决方案是什么?也接受作为答案的是如何修改的想法
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
为sh
.
我使用 bash shell:
echo $0
bash
sh
不同bash
并且表现不同。我想那
sh
是真的dash
。顺便说一句:如果你检查不同的 shell,这个命令会有不同的行为。
bosh
,dash
,mksh
,zsh
以及ksh
在 Solaris 上打印一个反斜杠bash
在 Linux上ksh
打印两个反斜杠。通过查看 $shell -x 输出,我相信一个反斜杠是正确的输出。
我不知道为什么
ksh
在 Linux 上会这样。可能是它试图模仿bash
行为。对于
bash
可以解释的行为:bash 有一个非 POSIXecho
,它不会按照 POSIX 的要求解释反斜杠。POSIX
bash
只允许在小型嵌入式系统上的行为,否则 POSIX 需要实现所谓的XSI
扩展。有了echo
,这需要完全遵循echo
AT&T 在 1982 年为 SYSv 实施的行为。重要说明:
如果您有一个以
那是可执行
x
的(位设置chmod
),如果你打电话sh myscript
该脚本仍然运行,
/bin/sh
通常dash
在 Linux 上运行。所以要小心你如何运行你的代码。有一种方法可以避免您的问题。更改您的脚本以使用:
这样,您可以避免
echo
1989 年引入的问题bash
。printf
仍然不能解决所有问题,因为有许多错误的实现,但是参数中的反斜杠引起的常见问题不受printf
.