Bash
Shell 命令在終端和腳本中以不同方式執行
以下命令序列
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 實施的行為。重要說明:
如果您有一個以
#!/bin/bash
那是可執行
x
的(位設置chmod
),如果你打電話sh myscript
該腳本仍然執行,
/bin/sh
通常dash
在 Linux 上執行。所以要小心你如何執行你的程式碼。有一種方法可以避免您的問題。更改您的腳本以使用:
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'` printf '%s\n' $ch
這樣,您可以避免
echo
1989 年引入的問題bash
。printf
仍然不能解決所有問題,因為有許多錯誤的實現,但是參數中的反斜杠引起的常見問題不受printf
.