linux bash:在一个case中对-c和 – 作出反应

我正在尝试编写一个脚本,作为参数与-cinput作出反应。 它应该以大写打印下一个参数。 第二个是input – [0-9],您可以input0到9之间的任意一个数字。然后打印下一个参数,就像input的数字一样多。

这是我的代码:

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 

我希望你们能帮助我。

问题是你正在使用位置参数,而且你试图做一个你不能做的双重解引用。 另外,我看到你正在使用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 

看看这是如何解决你的。

或者你可以使用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 

只有输出与上面相同的东西才不会检查数字后面的参数是否存在

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

究竟是如何失败?