Как я могу проверить, соответствует ли переменная другому значению и перейти к другой функции?

Я пишу сценарий, в котором я сохраняю заранее заданную строку текста в строку (мы назовем abc). Я сохраняю результаты из grep -iqs $USER file (мы назовем def) в другую строку.

Как я могу проверить, соответствует ли $abc содержанию в $def, и если это так, перейти к следующей функции? Если это не так, попросите пользователя ввести данные.

Это моя попытка:

firstFunction() {
abc="$USER content";               #text stored as string
def=`grep -iqs $USER /file`;       #results of grep stored to string
if [[ $def = "$abc" ]]; then       #test if result from grep command matches text in
   secondFunction                  #string $def. If true, move to secondFunction. If
else                               #false, prompt user.
   echo "Message to user with a y/n prompt"; read prmt;
fi;
if [[ $prmt != "y" || $prmt != "n" ]]; then prmt
elif [[ $prmt == "y" ]]; then
   sed -i "s/$def/$abc/g" /file    #If user chooses y at prompt, replace $abc with $def
elif [[ $answer == "n" ]]; then    #in file. If user chooses no at prompt, move to 
   secondFunction                  #secondFunction.
fi;
clear;
};

Заголовки среды были изменены, но концепция, стоящая за фрагментом, должна быть ясной.

3
задан 20 September 2013 в 11:44

1 ответ

Сначала из-за того, что вы использовали grep с аргументом -q, значение переменной def всегда будет равно пустой строке. Из man grep:

-q, --quiet, --silent
       Quiet;  do  not  write  anything  to  standard   output.    Exit
       immediately  with  zero status if any match is found, even if an
       error was detected.  Also see the -s  or  --no-messages  option.
       (-q is specified by POSIX.)

Second , вам следует подумать немного о логике. Это выражение:

$prmt != "y" || $prmt != "n"

всегда на любом языке программирования оценивается как true :

  • если $prmt = "y", то точно ] $prmt != "n", поэтому ваше выражение истинно
  • , если $prmt = "n", то точно $prmt != "y", поэтому ваше выражение истинно ]
  • в любых других случаях ясно, что ваше выражение верно.

В-третьих , ваша функция должна выглядеть следующим образом:

firstFunction() {
    abc="$USER content"
    def=`grep -is $USER /path/to/file`
    if [[ $def = "$abc" ]]; then
       secondFunction 
       return                            #does not make sense to go ahead
    else
       echo "Message to user with a y/n prompt"
       read prmt
    fi
    while : ; do
    if [  "$prmt" = "n" ]; then 
       secondFunction
       return                            #does not make sense to go ahead
    elif [ "$prmt" = "y" ]; then
       sed -i "s/$def/$abc/g" /path/to/file
       return                            #does not make sense to go ahead
    else
       echo "Message to user with a y/n prompt"
       read prmt
    fi
    done
}

Или, как вы сказали, вы можете использовать оператор case.

См. Также:

0
ответ дан 20 September 2013 в 11:44

Другие вопросы по тегам:

Похожие вопросы: