我生成一个包含所有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有一些”没有这样的文件“错误“的
答案 0 :(得分:50)
答案 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'"'