试图为这个脚本添加选项,不太合适

时间:2013-03-19 01:39:50

标签: bash

我开始使用这个名为wd的脚本:

cat "$@" | tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]' 
| sort | uniq -c | sort -n | awk '{print $2 " " $1}' | sort

将任意数量的文件作为输入,并打印文件中的单词分布,如下所示:

wd file1 file2

blue 2
cat 3
the 5
yes 1

现在我正在尝试添加2个选项:s和t。 s使脚本获取一个名为stopwords的输入文件,并在进行分发之前从输入文件中删除这些单词。 t将数字n作为参数,仅输出前n个单词。默认是所有单词。

所以,到目前为止我有这个脚本。目前,我的问题是当我尝试使用-t 10选项时,它告诉我它找不到文件10,但它应该是一个数字,而不是文件。而且,当我尝试使用-s选项时,它什么都不做,但不输出任何错误。我知道这个问题不是很具体,但我会很感激任何有关错误的想法。

#!/bin/bash

stopwords=FALSE
stopfile=""
topwords=0

while getopts s:t: option 
do
    case "$option"
    in
        s) stopwords=TRUE
        stopfile="$OPTARG";;
        t) topwords=$OPTARG;;
        \?) echo "Usage: wd [-s stopfile] [-t n] inputfile"
            echo "-s takes words in stopfile and removes them from inputfile"
            echo "-t means to output only top n words"
            exit 1;;
    esac
done

if [ "stopwords" = FALSE ]
then
    cat "$@" | tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]' 
| sort | uniq -c | sort -nr | head -n $topwords | awk '{print $2 " " $1}' | sort
else
    cat "$@" | grep -v -f "$stopfile" |  tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]' 
| uniq -c | sort -nr | head -n $topwords | awk '{print $2 " " $1}' | sort
fi

1 个答案:

答案 0 :(得分:2)

通常在while getopts循环之后,您需要shift $((OPTIND - 1))。以下是我之前为kshbash撰写的示例:

PROGNAME=$0

function _echo
{
    printf '%s\n' "$*"
}

function usage
{
    cat << END
usage: $PROGNAME [-a] [-b arg] [-h] file...
END

    exit $1
}

function parseargs
{
    typeset opt v

    [[ $# = 0 ]] && usage 1

    while getopts ":ab:h" opt "$@"; do
        case $opt in
            a)   _echo -$opt ;;
            b)   _echo -$opt $OPTARG ;;
            h)   usage ;;
            :)   _echo "! option -$OPTARG wants an argument" ;;
            '?') _echo "! unkown option -$OPTARG" ;;
        esac
    done
    shift $((OPTIND - 1))

    for v in "$@"; do
        _echo "$v"
    done
}

parseargs "$@"