Bash Script Function Return True-False

Microsoft предоставляет виртуальные машины с различными версиями IE на modern.ie для тестирования веб-сайтов. Вы можете использовать VirtualBox, чтобы запустить их на Linux.

В настоящее время они предлагают следующие версии Internet Explorer - Windows:

  • IE6 - XP
  • IE8 - XP
  • IE7 - Vista
  • IE8 - Win7
  • IE9 - Win7
  • IE10 - Win7
  • IE11 - Win7
  • IE10 - Win8
  • IE11 - Win8.1

4
28.02.2019, 12:08
2 ответа

trueи false— это команды, которые завершаются с кодами успешного и неудачного завершения соответственно. Они не заставляют вашу функцию возвращать эти значения, для этого используйте команду returnи целочисленные значения, соответствующие успеху (0 )или сбою (что-либо отличное от 0 ). Кроме того, я почти уверен, что вы не хотите возвращать отказ для первой строки, которая не соответствует, только если нет строки, совпавшей:

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    while read line; do
        if [ "$line" == "$funkx" ]
        then
            return 0    # 0 = success ("true"); break is not needed because return exits the function
        fi
    done < $file
    # If a line matched, it won't get here (it will have returned out of the middle
    # of the loop). Therefore, if it gets here, there must not have been a match.
    return 1    # 1 = failure ("false")
}

Но есть гораздо более простой способ сделать это. Используйте grep--, его работа заключается в поиске в файлах совпадающих строк. Вы хотитеgrep -Fxq---Fозначает поиск фиксированных строк (не шаблонов регулярных выражений ), -xозначает, что требуется совпадение всей строки, а не только ее части, а -qозначает, что не нужно печатать результат, просто выйдите со статусом успеха, если совпадение было найдено, в противном случае произойдет сбой. И даже не нужна явная команда return, так как функция будет неявно возвращать статус последней команды в ней:

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    grep -Fxq "$funkx" "$file"
}

Или еще проще:

check(){
    grep -Fxq "$1" /root/Turkiye.txt
}
7
27.01.2020, 20:48

Тестирование вашего кода на другом файле, действительно работает, даже если немного неэффективно. Предполагая, что файл /root/Turkiye.txtне является пустым файлом -, к которому у вас есть доступ, вызовы trueи false,поскольку они являются последними командами, которые будут выполняться в функции, устанавливает статус выхода функции либо равным нулю, либо отличному от -нулю.

Возможно, вы просто вводите в сценарий строки, которые не могут быть найдены в виде отдельных строк в файле, который вы читаете. К сожалению, в вопросе неясно, как выглядит файл, который вы анализируете, что вы вводите в свой скрипт и что вы ожидаете получить в ответ от скрипта при этом.

Также обратите внимание, что while read lineне обязательно считывает строк из входного файла. См., например. " Понимание "IFS= read -r line" ", а также того, что в [... ]оператор, сравнивающий две строки, - это =, а не ==.

Вам также необходимо заключить в двойные кавычки $keyboardвызов check, чтобы избежать разделения слов и генерации имени файла (подстановки ).


Похоже, вы хотите использовать свою функцию, чтобы определить, встречается ли строка, прочитанная пользователем, как строка в конкретном файле.

Это можно было бы сделать проще с помощью

grep -qxF -e "$keyboard" /root/Turkiye.txt

Эта команда grepбудет искать строку в заданном файле и возвращать нулевой статус выхода(true ), если будет найдена точно идентичная строка, и в противном случае будет возвращать не -ноль статус выхода(ложь). Здесь используются следующие параметры: -qдля того, чтобы grepничего не выводить, -xдля сравнения полных строк (без подстрок )и -Fдля сравнения строк (без сопоставления с регулярными выражениями ). -eсообщает grep, что следующим аргументом является шаблон поиска (, начальный -в шаблоне в противном случае был бы воспринят как введение параметра командной строки ).

Ваш скрипт изменен:

printf 'Please enter the value: ' >&2
IFS= read -r keyboard

if grep -qxF -e "$keyboard" /root/Turkiye.txt; then
    echo 'yes'
else
    echo 'no'
fi

Обратите внимание, что я вывожу приглашение пользователю ввести строку в стандартный поток ошибок.Это принято по соглашению и позволяет перенаправлять вывод сценария и использовать его без приглашения.

В bashвы бы использовали

IFS= read -r -p 'Please enter the value: ' keyboard

(Обратите внимание, что bashтакже выводит строку приглашения в стандартный поток ошибок при использовании read -p.)

Если вы хотите использовать grepв функции:

check () {
    grep -qxF -e "$1" /root/Turkiye.txt
}

Затем используйте

if check "$keyboard"; then
    echo 'yes'
else
    echo 'no'
fi
3
27.01.2020, 20:48

Теги

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