とスペースの交換:は、バックスラッシュとスペース
varx=$(echo "a b"|sed -r -e "s/\s/\\\ /g"); echo $varx
出力は次のようになります。
a\ \ b
しかし、ときに私は、引数"a b"
(フォルダa b
が存在する)で次のスクリプトを実行します。
#!/bin/bash
set -x
target=$(echo ${1} | sed -r -e "s/\s/_/g")
source=$(echo ${1} | sed -r -e "s/\s/\\\ /g")
mv ${source} ${target}
set +x
出力は
++ echo a b
++ sed -r -e 's/\s/_/g'
+ target=a_b
++ echo a b
++ sed -r -e 's/\s/\\ /g'
+ source='a\ b' 1) question
+ mv 'a\' b a_b 2) question
mv: target ‘a_b’ is not a directory
+ set +x
3つの質問:
1)なぜsource='a\ b'
なく'a\ \ b'
?
2)なぜmv 'a\' b a_b
であり、mv 'a\ b' a_b
でないのは、以前に計算されたの値によるか?
3)スクリプトを強制する方法は、コマンドラインのバージョンと同じですか?
可能な複製(http://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-変数) – tripleee