从带有白色 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[@]}"
我想在执行命令时使用变量中定义的多个参数。让我用一个简单的例子来说明这个案例:
假设我想将一个文件从一个目的地复制到另一个目的地,我将通过一个变量为 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[@]}"