从带有空格的变量传递参数

时间:2017-07-05 12:04:34

标签: bash arguments parameter-passing command-line-arguments whitespace

我想在执行命令时使用变量中定义的多个参数。让我用一个简单的例子来说明这个案例:

假设我想将文件从一个目标复制到另一个目标,并且我将通过变量提供cp的参数。当参数不包含任何空格时,它可以正常工作:

#!/bin/sh
ARGS="file1 file2"

cp $ARGS

strace显示以下预期解释:

execve("/bin/cp", ["cp", "file1", "file2"]

然而,当我使用带空格的参数时,我无法使其工作。我尝试将每个参数放在转义引号和许多其他内容中,但它被解释为单独的参数:

#!/bin/sh
ARGS="\"file1\" \"file2\""

cp $ARGS

结果不是两个参数,而是四个:

execve("/bin/cp", ["cp", "\"file", "1\"", "\"file", "2\""]

为了使事情进一步复杂化,我的最终目标是在提供的ARGS变量中使用变量替换,但是如何让它工作?请考虑以下事项:

FILENAME1="Picture 1.jpg"
FILENAME2="Picture 2.jpg"

ARGS="$FILENAME1 $FILENAME1"

cp $ARGS

它产生四个参数:

execve("/bin/cp", ["cp", "Picture", "1.jpg", "Picture", "1.jpg"]

1 个答案:

答案 0 :(得分:0)

您无法可靠地使用单个参数来存储值列表;没有办法区分值 part 的空白和分隔值的空格。改为使用数组。

#!/bin/bash

filename1="Picture 1.jpg"
filename2="Picture 2.jpg"

args=( "$filename1" "$filename2" )

cp "${args[@]}"