Тестирование вашего кода на другом файле, действительно работает, даже если немного неэффективно. Предполагая, что файл /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
Символы кажутся дублированными, поскольку информация, предоставленная nm
, является неполной. :Рассматриваемые символы имеют версии. Вы можете увидеть это с помощьюobjdump -T
:
0000000000059d00 g DF.text 0000000000000044 (ALSA_0.9) snd_pcm_hw_params_get_access
0000000000056040 g DF.text 000000000000004b ALSA_0.9.0rc4 snd_pcm_hw_params_get_access
или nm
опции --with-symbol-versions
:
/usr/lib/x86_64-linux-gnu/libasound.so.2.0.0:snd_pcm_hw_params_get_access|0000000000059d00| T | FUNC|0000000000000044| |.text@ALSA_0.9
/usr/lib/x86_64-linux-gnu/libasound.so.2.0.0:snd_pcm_hw_params_get_access|0000000000056040| T | FUNC|000000000000004b| |.text@@ALSA_0.9.0rc4
Двоичные файлы связываются с определенной версией символа, и они получают правильную версию во время связывания. Это позволяет изменять API, сохраняя при этом обратную совместимость -.