通过脚本传递时防止引用参数的中断

时间:2013-12-03 11:38:48

标签: bash

这最终可能会重复,但事实证明这很难找到。

我的问题如下。想象一个脚本,它接受两个参数,比如progargs,并将args传递给prog。我希望为args保留引用prog

我们以这两个脚本为例:

$ cat x
#! /bin/bash

while [ $# -gt 0 ]; do
    echo "$1"
    shift
done

$ cat y
#! /bin/bash

echo $1
./x $1

第一个脚本(x)只是在一行中打印参数(以便告诉参数如何分解)。第二个脚本将参数传递给第一个脚本。

以下是发生的事情:

$ ./y 'a b "x y"'
a b "x y"
a
b
"x
y"

当第一行(来自echo)显示时,$1正确地扩展为a b "x y",其中"x y"附近的引号就位。那么,为什么,当传递给另一个脚本./x $1时,"x y"术语不会保留为单个参数,而是保留为两个("xy")?

我该怎样防止这种情况?即,如何将给定y的参数集作为单个参数(即'a b "x y"')传递给x作为多个参数并引用生效?


P.S。我也试过$@但行为没有区别。 %q的{​​{1}}也没有任何明智之处。为了清楚起见,我的预期输出是:

printf

编辑:我要做的是为$ ./y 'a b "x y"' a b "x y" a b x y 脚本中的两个程序分别提供参数。例如:

y

$ ./y 'args to prog1' 'args to prog2' 使用自己的参数运行y,并使用自己的prog1运行。{/ p>

2 个答案:

答案 0 :(得分:2)

我发现一种解决方法是不将参数作为单个参数(如'separate arguments in one ')给出,但是在脚本中单独给出它们并将它们存储在数组中然后将它们传递给程序。为了能够区分第一个和第二个程序的参数,我使用了一个分隔符(在这种情况下是::)。

例如:

$ cat y
#! /bin/bash

i=0
while [ $# -gt 0 ] && [ "$1" != "::" ]; do
    args1[i]="$1"
    ((i=i+1))
    shift
done

has_second=false
if [ "$1" == "::" ]; then
    shift
    has_second=true
fi

if $has_second; then
    i=0
    while [ $# -gt 0 ]; do
        args2[i]="$1"
        ((i=i+1))
        shift
    done
fi

echo "First:"
./x "${args1[@]}"
echo "Second:"
./x "${args2[@]}"

答案 1 :(得分:0)

script y中使用引号:

#!/bin/bash

echo "$1"
./x "$1"

$1周围没有引号将字符$1作为多个参数传递给script x

相关问题