2

我需要一个简单的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 运行脚本,它不支持数组。

4

3 回答 3

2

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
于 2009-10-20T14:23:50.837 回答
0

这使用了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 重定向,您将看到相同的输出。

于 2009-10-20T13:18:32.320 回答
0

很遗憾您需要处理参数中的空格,否则这可能会起作用:

#!/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 对其进行编码,这会有点难看。

于 2009-10-20T12:35:34.677 回答