Параметр флага по умолчанию Get Ops - PullRequest
0 голосов
/ 25 февраля 2019

Я хотел бы получить значение по умолчанию для флага -8, если кто-то запускает -9 и не ставит ничего для OPTARG после флага ИЛИ я могу проверить, является ли OPTARG нулевым, и заменить пустое значение на базовоезначение.

ft1 и ftx - просто функции форматирования.

Когда я запускаю мой goat -8, он печатает этот файл

Когда я запускаю goat -9 SEARCH STRING, он печатает файл только с результатами этой строки поиска.

Если я запускаю goat -9 и не помещаю строку поиска, это ничего не делает, потому что OPTARG пусто, поэтому программе поиска нечего искать.

Я бы хотел, чтобы он мог изменить -9 на -8, если пользователь не введет строку после goat -9.

    function goat() {
        local OPTIND
        local OPTARG
            if [ "$1" = "" ] ;
            then ft1 ;
            printf "

        This command requires an OPTION. Refer to the help menu (-h) for assistance.

    " | layoutcc
    ft1 ;
    fi

    while getopts ":h89:" opt;
    do case $opt in 

     8) for file in analysis/connection_history.txt ; do ftx $file | layoutcc ; 
                printf "%s" "$(<$file)"                                                    
                echo ;
                ft1 ;
                done 
    ;;

    9) grep_expr=$OPTARG

       for file in analysis/connection_history.txt ; do
            ftx "$file" | layoutcc
            grep "$grep_expr" $file | perl -ne 'print if /-201[8-9]/' | 
            perl -pe 's/......-2019/\e[1;32m$&\e[0m/g' 
                echo
                ft1
                done 
                ;;

function ft1
{
printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = 
}   

function ft2
{
ft1 ;
ft1
}

function ftx
{ 
ft1 ;
echo "                         File Name: $1    $(grep -h "Created on" *-Report.txt | head -n1)" 
ft1
}       

function fsx
{
ft1 ;
echo "                         File Name: $1"
ft1
}

1 Ответ

0 голосов
/ 25 февраля 2019

Я бы взял бизнес-логику из кода синтаксического анализа опции:

grep_expr=""
has_8=false
has_9=false

while getopts ":h89:" opt; do
    case $opt in 
        h) do_some_h_thing ;;
        8) has_8=true ;;
        9) has_9=true; grep_expr=$OPTARG ;;
        :) echo "Error: missing argument for option -$OPTARG" >&2; exit 1 ;;
        *) echo "Error: unknown option -$OPTARG" >&2; exit 1 ;;
     esac
done
shift $((OPTIND - 1))

if $has_8 || ($has_9 && [[ -z $grep_expr ]]); then
    for file in analysis/connection_history.txt ; do
        ftx $file | layoutcc
        printf "%s" "$(<$file)"   # why not `cat "$file"` ?                                                    
        echo ;                    #
        ft1 ;
    done 
elif $has_9; then
   for file in analysis/connection_history.txt ; do
        ftx "$file" | layoutcc
        # following pipeline can be greatly simplified
        grep "$grep_expr" $file |
          perl -ne 'print if /-201[8-9]/' | 
          perl -pe 's/......-2019/\e[1;32m$&\e[0m/g' 
        echo
        ft1
    done 
 else
    echo "Error: you must use one of '-8' or '-9 basic_regex'" >&2
    exit 1
fi
...