Я пишу сценарий, в котором я сохраняю заранее заданную строку текста в строку (мы назовем 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;
};
Заголовки среды были изменены, но концепция, стоящая за фрагментом, должна быть ясной.
Сначала из-за того, что вы использовали 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.)blockquote>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
.См. Также: