评估:未找到命令

问题描述 投票:0回答:1

我有下一个脚本:

a.sh:

if [ $# -eq 1 ]; then
    eval "$@"
else
    eval '"$@"'
fi

b.sh:

echo "para1: $1"
echo "para2: $2"
echo "para3: $3"

当我下一步时,无论带引号还是不带引号,都可以:

$ ./a.sh "./b.sh '1 2' '' 3"
para1: 1 2
para2:
para3: 3
$ ./a.sh ./b.sh '1 2' '' 3
para1: 1 2
para2:
para3: 3

但是当我将命令更改为下一个时,没有引号的命令报告错误:

$ ./a.sh "A=1 ./b.sh '1 2' '' 3"
para1: 1 2
para2:
para3: 3
$ ./a.sh A=1 ./b.sh '1 2' '' 3
./a.sh: line 4: A=1: command not found

我怎样才能让两者都工作?

请注意:我应该让

b.sh
'1 2'
视为第一个参数,
''
视为第二个参数,而
3
视为第三个参数,这就是我在
中在
''
周围添加
$@
的原因a.sh

bash shell eval
1个回答
0
投票

3.1.2.2 单引号

将字符括在单引号 (') 中可保留文字值 引号内的每个字符。单引号可能不会出现 在单引号之间,即使前面有反斜杠。

因此在 'A=1 ...' 中,A=1 将被保留为字符串

在这种情况下 a.sh 应该只是 :

eval "$@"

也许可以像这样使用它:

./a.sh A=1 ./b.sh \'1 2\' \'\' 3

转义引号仅在将参数传递给 a 时才会发生,因此 b 将像使用

./b.sh '1 2' '' 3

调用一样执行
© www.soinside.com 2019 - 2024. All rights reserved.