Почему (и как )мне (кажется! )дубликаты символов в моих общих библиотеках?

Тестирование вашего кода на другом файле, действительно работает, даже если немного неэффективно. Предполагая, что файл /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

1
06.06.2019, 11:09
1 ответ

Символы кажутся дублированными, поскольку информация, предоставленная 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, сохраняя при этом обратную совместимость -.

3
27.01.2020, 23:30

Теги

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