我需要一个简单的busybox sh 包装器,它可以:
IF "-Q" PARAMETER IS PROVIDED THEN
acommand ALL PARAMETERS BUT "-Q" 2>&1 1>/dev/null
ELSE
acommand ALL PARAMETERS
FI
参数可能包括空格。
顺便说一句,我想用busybox sh 运行脚本,它不支持数组。
It's possible to do it all in busybox
's ash
shell:
#!/bin/sh
for i in "${@}"
do
if [ "$i" = "-Q" ]
then
flagQ=1
else
args="$args \"$i\""
fi
done
if [ "$flagQ" = "1" ]
then
eval acommand "$args" 2>&1 1>/dev/null
else
eval acommand "$args"
fi
这使用了bash 数组——但我从另一个答案的评论中看到,代码不应该在 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 重定向,您将看到相同的输出。
很遗憾您需要处理参数中的空格,否则这可能会起作用:
#!/bin/sh
Q=0
ARGS=
while [ $# -ge 1 ]; do
case $1 in
-Q)
Q=1
;;
*)
ARGS="$ARGS $1"
;;
esac
shift
done
if [ $Q -eq 1 ] ; then
acommand $ARGS 2>&1 1>/dev/null
else
acommand $ARGS
fi
编辑:
所以这个版本以解释反引号为代价来处理空格。
#!/bin/busybox ash
Q=0
ARGS=
while [ $# -ge 1 ]; do
case $1 in
-Q)
Q=1
;;
*)
ARGS="$ARGS \"$1\""
;;
esac
shift
done
if [ "$Q" -eq 1 ] ; then
eval acommand $ARGS 2>&1 1>/dev/null
else
eval acommand $ARGS
fi
我认为要拥有一个完整的解决方案,您将不得不用 C 对其进行编码,这会有点难看。