包含多个参数的变量,在Bash中带引号

时间:2011-09-17 11:54:09

标签: bash variables escaping quotes

我生成一个包含所有args的bash变量,这些args包含空格。 当我用这些args启动命令时 - 例如。 ls $ args - 引号未正确解释。 这是一个例子 - 还创建和删除所需的文件。

#!/bin/bash
f1="file n1"
f2="file n2"
# create files
touch "$f1" "$f2"
# concatenate arguments
args="\"$f1\" \"$f2\""
# Print arguments, then launch 'ls' command
echo "arguments :" $args
ls $args
# delete files
rm "$f1" "$f2"

有了这个,我对“file n1”“file n2有一些”没有这样的文件“错误“

5 个答案:

答案 0 :(得分:50)

您可以考虑使用array作为args,如下所示:

args=( "$f1" "$f2" )
ls "${args[@]}"

(目前您遇到的问题是,一旦插值发生,文件名间和文件名间空间就没有区别。)

答案 1 :(得分:30)

使用eval这将首先评估任何扩展和引用,然后执行结果字符串,就像它已被输入shell一样。

args="'$f1' '$f2'"
eval ls $args

eval将执行ls 'file n1' 'file n2'

有一个非常类似的问题,试图在init脚本中将源自/etc/default/的变量中的参数传递给start_stop_daemon

答案 2 :(得分:5)

使用set将变量设置为位置参数;如果您通过"$@""$1""$2"等引用它们,则会保留引用。确保在变量名称周围使用双引号。

set -- "$f1" "$f2"
touch "$@"
ls "$@"
rm "$@"

答案 3 :(得分:4)

这可能是最糟糕的答案,但您可以更改IFS。这是“内部字段分隔符”,默认情况下等于空格+制表符+换行符。

#!/bin/sh
IFS=,
MAR="-n,my file"
cat $MAR

上面的脚本将运行cat。第一个参数是-n(编号行),第二个参数是my file

答案 4 :(得分:0)

这是我连接引用参数的方法 - 主要用于保持脚本可读。但是,轻松评论一些论点也很舒服:

PARAM1="a param with white spaces"
PARAM2="some other funny param"
PARAM3="third spaced param"
#...

PARAMS=$PARAM1
PARAMS+='" "'
PARAMS+=$PARAM2
PARAMS+='" "'
PARAMS+=$PARAM3
#...

eval command '"'$PARAMS'"'