2016-05-26 8 views
0

とスペースの交換:は、バックスラッシュとスペース

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)スクリプトを強制する方法は、コマンドラインのバージョンと同じですか?

+0

可能な複製(http://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-変数) – tripleee

答えて

1

$1に二重引用符を追加します:スクリプトで

source=$(echo "${1}" | sed -r -e "s/\s/\\\ /g") 
target=$(echo "${1}" | sed -r -e "s/\s/_/g") 
echo mv \"${source}\" \"${target}\" 

echoコマンド処理aとパラメータとしてbを。二重引用符を使用すると、$1は分割されません。

は説明するために:

$ echo one  two 
one two 
$ echo "one  two" 
one  two 
[変数の前後に引用符をラップする場合]の
+0

より一般的には、ファイル名を含む変数は常に二重引用符で囲む必要があります。さらに詳しくはhttp://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-variable – tripleee

+0

ありがとうございます。最終的な解決策は、 "source"変数をまったく使用しないようにしてスクリプトがそうするようにすることでした。 target = $(echo "$ {1}" | sed -r -e "s/\ s/_/g") mv "$ {1}" "$ {target}" – ka3ak

関連する問題