我有下一个脚本:
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
。
将字符括在单引号 (') 中可保留文字值 引号内的每个字符。单引号可能不会出现 在单引号之间,即使前面有反斜杠。
因此在 'A=1 ...' 中,A=1 将被保留为字符串
在这种情况下 a.sh 应该只是 :
eval "$@"
也许可以像这样使用它:
./a.sh A=1 ./b.sh \'1 2\' \'\' 3
转义引号仅在将参数传递给 a 时才会发生,因此 b 将像使用
./b.sh '1 2' '' 3
调用一样执行