Bash :向带空格的字符串添加额外的单引号
Bash : Adding extra single quotes to strings with spaces
当我尝试将参数作为变量传递给 bash 中的任何命令时,如果变量值有空格,我会看到 bash 添加的额外引号。
我正在创建一个文件 "some file.txt" 并将其添加到变量 $file。
我正在使用 $file 并将其存储在另一个变量 $arg 中,并在 $file 上加上引号。
bash 变量扩展后我希望得到的命令是
find . -name "some text.txt"
但我收到错误,实际执行的文件是,
find . -name '"some' 'file.txt"
为什么会这样。 bash 变量 expanson 在这种情况下如何工作?
$ touch "some file.txt"
$ file="some file.txt"
$ arg=" -name \"$file\""
$ find . $arg
find: paths must precede expression: file.txt"
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
$ set -x
$ find . $arg
+ find . -name '"some' 'file.txt"'
find: paths must precede expression: file.txt"
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
为什么会这样?
参数值中的引号在参数展开后被视为文字字符。您的尝试与
相同
find . -name \"some file.txt\"
没有
find . -name "some file.txt"
要处理包含空格的参数,您需要使用数组。
file="some file.txt"
# Create an array with two elements; the second element contains whitespace
args=( -name "$file" )
# Expand the array to two separate words; the second word contains whitespace.
find . "${args[@]}"
当我尝试将参数作为变量传递给 bash 中的任何命令时,如果变量值有空格,我会看到 bash 添加的额外引号。
我正在创建一个文件 "some file.txt" 并将其添加到变量 $file。 我正在使用 $file 并将其存储在另一个变量 $arg 中,并在 $file 上加上引号。 bash 变量扩展后我希望得到的命令是
find . -name "some text.txt"
但我收到错误,实际执行的文件是,
find . -name '"some' 'file.txt"
为什么会这样。 bash 变量 expanson 在这种情况下如何工作?
$ touch "some file.txt"
$ file="some file.txt"
$ arg=" -name \"$file\""
$ find . $arg
find: paths must precede expression: file.txt"
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
$ set -x
$ find . $arg
+ find . -name '"some' 'file.txt"'
find: paths must precede expression: file.txt"
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
为什么会这样?
参数值中的引号在参数展开后被视为文字字符。您的尝试与
相同find . -name \"some file.txt\"
没有
find . -name "some file.txt"
要处理包含空格的参数,您需要使用数组。
file="some file.txt"
# Create an array with two elements; the second element contains whitespace
args=( -name "$file" )
# Expand the array to two separate words; the second word contains whitespace.
find . "${args[@]}"