Bash 将环境变量转换为脚本参数

Bash 将环境变量转换为脚本参数,bash,shell,Bash,Shell,我试图通过允许用户使用命令行选项指定环境变量,为用户提供一个配置层。此配置实际上是针对一个包装程序(run.sh),它接收参数,然后调用我的程序(program.sh) 我对保留引用的参数有问题,这会导致传递意外的参数 下面是一个示例实现: run.sh exec `pwd`/program.sh ${CONFIG} "$@" for var in "$@" do echo "$var" done program.sh exec `pwd`/program.sh ${CONFIG}

我试图通过允许用户使用命令行选项指定环境变量,为用户提供一个配置层。此配置实际上是针对一个包装程序(
run.sh
),它接收参数,然后调用我的程序(
program.sh

我对保留引用的参数有问题,这会导致传递意外的参数

下面是一个示例实现:

run.sh

exec `pwd`/program.sh ${CONFIG} "$@"
for var in "$@"
do
    echo "$var"
done
program.sh

exec `pwd`/program.sh ${CONFIG} "$@"
for var in "$@"
do
    echo "$var"
done
调用示例如下所示:

$> CONFIG='--foo="bar baz quo" --foo2="bar2 baz2"' ./run.sh hello abc123    
--foo="bar
baz
quo"
--foo2="bar2
baz2"
hello
abc123
我预期的结果如下:

--foo="bar baz quo"
--foo2="bar2 baz2"
hello
abc123
我曾尝试在qoutes中的run.sh中包装${CONFIG},但这只产生了一个参数
--foo=“bar baz quo”--foo2=“bar2 baz2”
。转义
CONFIG
中的引号也会产生错误的结果。

run.sh

eval exec `pwd`/program.sh "${CONFIG}" "$@"
for var                     # The 'in "$@"' is not required, it is the default
do
    echo "$var"
done
program.sh

eval exec `pwd`/program.sh "${CONFIG}" "$@"
for var                     # The 'in "$@"' is not required, it is the default
do
    echo "$var"
done
输出:

$ CONFIG='--foo="bar baz quo" --foo2="bar2 baz2"' ./run.sh hello 
--foo=bar baz quo
--foo2=bar2 baz2
hello

请注意,确定输出中的
abc123
应该来自哪里。

abc123来自哪里?环境不是传递此类参数的正确方式。@cdarke
abc123
被放在错误的行中,更新问题以反映这一点。您不能安全地这样做。这也是SystemInit脚本的一个问题,并且已经存在很多年了。传递空间安全参数的唯一方法是使用无法导出但在某些上下文中可以按名称传递的数组。这很危险,因为
CONFIG
变量来自外部用户。一旦可以设置
CONFIG='$(rm program.sh)--foo=“bar baz quo”--foo2=“bar2 baz2””