2

我正在尝试编写一个脚本来响应 -c 输入作为参数。它应该以大写形式打印下一个参数。第二个是 -[0-9] 的输入,您可以在其中给出从 0 到 9 的任何数字。然后应打印下一个参数与您输入的数字一样多。

这是我的代码:

function print_info(){
  echo mijn CPU-type is: $CPU
  echo mijn Totaal beschikbare RAM is: $RAMTOTAAL kB
  echo mijn IP-adres is $IP_ADDR en mijn Default Gateway is: $GW
  echo momenteel is er $RAMUSEDPROCENT % van mijn geheugen in gebruik
}

while :
do
param=1
params=$#
CPU=$(cat /proc/cpuinfo | grep model | grep name | cut -d: -f2)
RAMTOTAAL=$(free | grep Mem | cut -d: -f2 | awk '{ print $1}')
IP_ADDR=$(ifconfig | grep inet | head -1 | cut -d: -f2 | awk '{print $1}')
GW=$(netstat -nr | awk '{print $2}' | head -3 | awk 'NR == 3 { print $1}')
RAMFREE=$(free | grep Mem | cut -d: -f2 | awk '{ print $3}')
RAMUSED=$(free | grep Mem | cut -d: -f2 | awk '{ print $2}')
RAMUSEDPROCENT=$(($RAMUSED*100/$RAMTOTAAL))
counter=1
while [ "$param" -le "$params" ]
do
  case \$$param in
    "-c"   ) shift; echo \$$param zegt je dat | awk '{print toupper($0)}'; print_info;;
    [0-9] ) shift; while [ $counter -lt \$$param ]; do echo \$$param; print_info; done;;
    *      ) eval echo \$$param zegt je dat; print_info;;
  esac
  (( param ++ ))
done
done

我希望你们能帮助我。

4

3 回答 3

2

问题是您错误地使用了位置参数,并且您正在尝试执行您无法执行的双重取消引用。另外,我看到您正在使用shift,但是您使用不正确...

处理位置参数的正常方法当然是循环。

set -- echo -c foo 4 test
while [ $# -gt 0 ]; do
    case "$1" in
    -c)
        echo second time through the loop, "\$1" == "$1".
        echo also, "\$2" == "$2";
        shift; shift ;;
    [0-9])
        echo third time through, "\$1" == "$1" and "\$2" == "$2"
        : do stuff
        shift; shift ;;
    *)
        echo first time through the loop, "\$1" == "$1"
        shift ;;
    esac
done

看看这对你有什么影响。

于 2013-05-07T20:00:18.260 回答
1

或者您可以使用带有错误处理的 bash 的 getopts 等等

while getopts ":c:0:1:2:3:4:5:6:7:8:9:" opt;
do
    case $opt in
    c)
        tr "[:lower:]" "[:upper:]" <<<"$OPTARG"
        ;;
    0|1|2|3|4|5|6|7|8|9)
        yes "$OPTARG" | head -$opt
        ;;
    \?)
        echo "Invalid option: -$OPTARG" >&2
        exit 1
        ;;
    :)
        echo "Option -$OPTARG requires an argument." >&2
        exit 1
        ;;
    esac
done

为了什么

$bash script -c shoud_be_upper -4 four_times 

会产生

SHOUD_BE_UPPER
four_times
four_times
four_times
four_times

或者

while getopts ":c:0123456789" opt;
do
    case $opt in
    c)
        tr "[:lower:]" "[:upper:]" <<<"$OPTARG"
        ;;
    0|1|2|3|4|5|6|7|8|9)
        number=$opt
        ;;
    \?)
        echo "Invalid option: -$OPTARG" >&2
        exit 1
        ;;
    :)
        echo "Option -$OPTARG requires an argument." >&2
        exit 1
        ;;
    esac
done

shift $((OPTIND-1))
yes $1 | head -$number

输出与上面相同的只是不检查数字后参数的存在

于 2013-05-07T21:01:59.820 回答
0

除非我误解了某些东西,否则我可以看到的文档似乎表明您正在做的事情应该有效。尝试将所有数字指定为替代选项。0|1|2|3|4|5|6|7|8|9 )

它究竟是如何失败的?

于 2013-05-07T19:27:14.400 回答