系统:freebsd 9.2
我想使用getopts来解析命令行。如
./tesh.sh -o good a.c
can get good.out
./tesh.sh -o a.c
can get a.out
但是在getopts中没有“选项”变量。 有谁知道如何解决这个问题? 我发现了很多网页,但没人能解决。
这是我的代码
#!/bin/bash
while getopts "hs:o:" optname
do
case "$optname" in
"h")
echo "Option $optname is specified"
;;
"s")
echo "Option $optname has value $OPTARG"
;;
"o")
echo "$optname"
;;
"?")
echo "Unknown option $OPTARG"
;;
":")
;;
*)
# Should not occur
echo "Unknown error while processing options"
;;
esac
echo "OPTIND is now $OPTIND"
done
如果我输入./test.sh -o a.c 它将打印echo“$ optname”
我希望如此 如果我输入 ./test.sh -o 也可以打印echo“$ optname”
现在它会打印错误信息
THX!
答案 0 :(得分:0)
根据您的要求,您无需使用getopts,您可以使用以下代码来实现它。
如果只给出-o,它将被视为标志。 如果-o是任意值的givne,则将其视为选项。
> cat test
#!/bin/bash
while [ $# -gt 0 ]; do
case $1 in
-h) echo "Option $optname is specified" ;;
-s) VAL_S=$2; echo "Option $optname has value $VAL_S" ;shift;;
-o) VAL_O=$2; F=$(echo $VAL_O |cut -c1);
if [ "$F" = "-" -o -z "$F" ]; then
echo "-o is a flag"
DEFAULT=a.c
else
echo "-o is a option"
DEFAULT=$VAL_O
shift
fi
;;
*) echo "Unknown option $OPTARG" ;exit ;;
esac
shift
done
我在可能的情况下运行它。
> ./test -o
-o is a flag
> ./test -o a.c
-o is a option
> ./test -o -h
-o is a flag
Option is specified
> ./test -o a.c -h
-o is a option
Option is specified