8

我对 ubuntu 和 bash 脚本很陌生,想知道为什么在使用 GETOPTS 时可能会出现此错误。

这是我用来运行它的代码。

sh /home/ubuntu/Desktop/test.sh -f /home/u/Desktop/ -p 'TEST'

我认为我正确地调用了脚本,它应该使用 grap 搜索我作为搜索词输入的词。但由于某种原因它没有。任何关于我在使用 grep 时作为一般规则可以做什么的建议也将不胜感激,谢谢。

#!/bin/bash

valid=0
file_arg=""
display_help=""
column=""
pattern=""

while getopts f:d:s:m: opt
do
    case "$opt" in
        d)  display_help=$OPTARG
            ;;
        f)  file_arg=$OPTARG
            ;;
        c)  column=$OPTARG
            ;;
        p)  pattern=$OPTARG
            ;;
        *)  valid=1
            break
            ;;
    esac
done

if [ $valid -eq "0" ]
then
    if [ $pattern != "" ]
    then
        cat $file_arg | grep $pattern
    else
        cat $file
    fi
else
    echo -n "Usage: FILE -f <name> | COLUMN -> -c <name> | HELP -> -d | PATTERN -> -p <expression>"
fi
4

3 回答 3

15

getopts您不指定p选项时,您只有f:d:s:m:选项。

我认为您的意思是p相反m,反之亦然。

它应该f:d:s:m:p:f:d:s:p:

于 2014-04-07T10:07:37.550 回答
10

您还应该考虑getopts.

如果选项字符串的第一个字符是冒号 ( :),则getopts不会报告错误,而是提供一种自行处理错误的方法。然后可以在您的案例条件处理中使用两个额外的字符:

  • ?如果输入了无效选项,$opt则将设置为?$OPTARG保留无效字符,例如,如果-z使用了不在您的选项字符串中的字符,$OPTARG则将设置为z

  • :如果用户省略了所需的附加参数,$opt则将设置为:$OPTARG保存命令字符,例如,如果-p使用了而不是-p arg则将$OPTARG设置为p

如果实现了这一点,那么包罗万象*就变得多余,应该被删除。注意:如果你把它留在里面并且它在上面,?否则:你会问问题。还要确保?像这样逃脱\?)

希望这可以帮助。

# Note the addition of the inital colon before 'f'.
while getopts :f:d:c:p: opt;
do
    case $opt in
        d)  display_help=$OPTARG
            ;;
        f)  file_arg=$OPTARG
            ;;
        c)  column=$OPTARG
            ;;
        p)  pattern=$OPTARG
            ;;

        # Option error handling.

        \?) valid=0
            echo "An invalid option has been entered: $OPTARG"
            ;;

        :)  valid=0
            echo "The additional argument for option $OPTARG was omitted."
            ;;

        # This is now redundant:
        # *)  valid=0
        #     break
        #     ;;
    esac
done
于 2014-07-21T14:47:40.610 回答
2

正如 Jayesh 所提到的,您的脚本还有一些其他问题,您需要包含 getopt 的所有参数,但您还需要小心字符串比较,这里有一些带有建议的修复:

(有关字符串比较信息,请参见http://www.tldp.org/LDP/abs/html/comparison-ops.html )

#!/bin/bash

# switch around valid, convention is 1 == true and 0 == false
valid=1
file_arg=""
display_help=""
column=""
pattern=""

# getopt patterns need to match following case statement
while getopts f:d:c:p: opt;
do
    case $opt in
        d)  display_help=$OPTARG
            ;;
        f)  file_arg=$OPTARG
            ;;
        c)  column=$OPTARG
            ;;
        p)  pattern=$OPTARG
            ;;
        *)  valid=0
            break
            ;;
    esac
done

# changed value to reflect true false convention
if [ "$valid" -eq "1" ]
then
    # string comparison in bash should be done using specific operators
    if [ -n "$pattern" ]
    then
        cat $file_arg | grep $pattern
    else
        # typo, this should be file_arg?
        cat $file_arg
    fi
else
    echo -n "Usage: FILE -f <name> | COLUMN -> -c <name> | HELP -> -d | PATTERN -> -p <expression>"
fi
于 2014-04-07T10:30:37.090 回答