以下命令序列
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
答案1
sh
不同于bash
并且行为不同。
我想sh
确实如此dash
。
顺便说一句:如果您检查不同的 shell,此命令会有不同的行为。
bosh
, dash
, mksh
,zsh
以及ksh
在 Solaris 上打印一个反斜杠
bash
在ksh
Linux 上打印两个反斜杠。
通过查看 $shell -x 输出,我相信一个反斜杠是正确的输出。
我不知道为什么ksh
在 Linux 上会有这样的行为。它可能试图模仿bash
行为。
对于bash
该行为可以解释为:bash 有一个非 POSIX echo
,它不会按照 POSIX 的要求解释反斜杠。
POSIX 只允许在小型嵌入式系统上进行行为,否则 POSIX 需要实现bash
所谓的扩展。XSI
对于,这需要完全遵循AT&T 于 1982 年为 SYSv 实施echo
的行为。echo
重要提示:
如果您有一个以以下开头的脚本
#!/bin/bash
这是可执行的(x
由设置的位chmod
),如果你调用
sh myscript
/bin/sh
该脚本仍然在Linux 上运行dash
。因此,请注意运行代码的方式。
有一种方法可以避免您的问题。更改您的脚本以使用:
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
printf '%s\n' $ch
echo
这样,您就可以避免1989 年引入的问题bash
。printf
仍然不能解决所有问题,因为存在许多错误的实现,但是参数中的反斜杠引起的常见问题不受printf
.