次のコマンドシーケンス
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
端末の出力がデフォルト出力です。シェルスクリプトを使用するソリューションは何ですか?修正方法のアイデアも答えとして受け入れられます。
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
のためのsh
。
私はbashシェルを使用します:
echo $0
bash
答え1
sh
違うbash
、違う行動をします。
sh
そう思いますdash
。
注:このコマンドは、他のシェルを確認すると異なる動作をします。
bosh
、、、dash
およびmksh
Solarisからバックスラッシュを印刷しますzsh
。ksh
bash
ksh
Linuxでは、2つのバックスラッシュを印刷します。
$shell -x 出力を見ると、バックスラッシュが正しい出力だと思われます。
ksh
Linuxでなぜこれが機能するのかわかりません。行動を模倣しようとすることもできますbash
。
この動作の説明bash
は、bashにPOSIX以外の実装があり、echo
POSIXが要求するようにバックスラッシュを解釈しないことです。
bash
POSIX は、小規模の組み込みシステムでのみ動作を許可します。それ以外の場合、POSIXではいわゆる拡張実装が必要です。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
。