这使用bash arrays - 但我从 cmets 看到另一个答案,代码不应该在 bash 下运行(尽管 bash 标记最初应用于问题);它旨在在busybox shell 下运行。
我几乎可以肯定它没有回答这个问题,因为鉴于busybox 的局限性,这个问题基本上无法回答。在过去,我使用了一个名为“escape”的自定义程序来构建一个参数字符串,该字符串可以被评估以获取原始参数 - 空格和所有参数。但这需要外壳外部的支持。
此解决方案仅使用“bash”。我不确定它是否是完全惯用的 bash 代码,但它可以工作。
#!/bin/bash
i=0
Qflag=0
for arg in "$@"
do
if [ "X$arg" = "X-Q" ]
then Qflag=1
else args[$((i++))]=$arg
fi
done
if [ $Qflag = 1 ]
then exec acommand "${args[@]}" 2>&1 >/dev/null
else exec acommand "${args[@]}"
fi
第一个循环使用脚本的参数构建一个数组 args,但它没有将“-Q”添加到列表中并将其存在记录在变量 Qflag 中。
最后的 if 语句说明 Qflag 是否设置为 1,如果是,则将错误从 'acommand' 发送到标准输出,并将常规标准输出发送到 /dev/null(这与如果I/O 重定向是相反的——这会将标准输出发送到 /dev/null 并将标准错误发送到同一个地方,从而强制“acommand”保持沉默)。
“exec”的使用是一种微不足道的优化,在这种情况下简化了退出状态处理。
使用在单独的行上打印其参数的“acommand”进行测试:
#!/bin/sh
for arg in "$@"
do echo "$arg"
done
并使用命令行,例如:
bash wrapper.sh -c -d 'arg with spaces'
产生输出:
-c
-d
arg with spaces
显然,在 I/O 重定向到位后,以下位置没有输出:
bash wrapper.sh -c -Q -d 'arg with spaces'
但是,如果您省略 I/O 重定向,您将看到相同的输出。