从带有白色 space 的变量传递参数

Passing arguments from a variable with white space

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

假设我想将一个文件从一个目的地复制到另一个目的地,我将通过一个变量为 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"]

您不能可靠地使用单个参数来存储值列表;无法区分作为值的 部分 的空白和 分隔 值的空白。请改用数组。

#!/bin/bash

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

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

cp "${args[@]}"