这最终可能会重复,但事实证明这很难找到。
我的问题如下。想象一个脚本,它接受两个参数,比如prog
和args
,并将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"
术语不会保留为单个参数,而是保留为两个("x
和y"
)?
我该怎样防止这种情况?即,如何将给定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>
答案 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
。