用反斜杠和空格替换空间

时间:2016-05-26 11:04:03

标签: linux shell

执行时:

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而非source

3)如何强制脚本执行与命令行版本相同的操作?

1 个答案:

答案 0 :(得分: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命令进程ab作为参数。使用双引号时,$1不会被拆分。

举例说明:

$ echo one     two
one two
$ echo "one     two"
one     two