Ошибка при проверке подстроки в Bash - PullRequest
0 голосов
/ 17 июня 2020

Я новичок в написании сценариев оболочки и столкнулся с проблемой при попытке проверить наличие подстрок в строке. Я хочу создать код, который проверяет, используете ли вы 64-битную систему. Об этом свидетельствует вывод команды uname -m && cat /etc/*release с помощью x86_64 в первой строке.

Вот мой код:

INFO=$(uname -m && cat /etc/*release)
if [ "$INFO" == *"x86_64"* ]
then
    echo "You are running a 64bit-based system!"
else
    echo "Your system architecture is wrong!"
    exit
fi

Хотя я использую 64-разрядную систему и x86_64 отображается в выводе моей команды, оператор if по-прежнему возвращает false, поэтому я получаю вывод Your system architecture is wrong!. Должно быть наоборот. Может ли кто-нибудь помочь мне, определив, что я сделал не так? Я также принимаю общие предложения по улучшению моего подхода, но в первую очередь я хотел бы знать, где находится ошибка.

Большое спасибо за вашу помощь!

Ответы [ 4 ]

4 голосов
/ 17 июня 2020
[

Команда [ эквивалентна команде test . test не поддерживает никаких расширенных соответствий. test может сравнивать строки с = - сравнение строк с == в test является расширением bash.

Выполняя:

[ "$INFO" == *"x86_64"* ]

Вы действительно работаете команда типа [ "$INFO" == <the list of files that match "x86_64" pattern> ] - *"x86_64"* подвергается расширению имени файла. Если у вас есть файл с именем something_x86_64_something, он будет помещен туда, точно так же будет работать cat *"x86_64"*.

bash extension [[ команда поддерживает сопоставление с образцом. Сделайте:

if [[ "$INFO" == *"x86_64"* ]]

Для переносимых сценариев, которые всегда будут работать с любой оболочкой posix, используйте case:

case "$INFO" in
*x86_64*) echo yes; ;;
*) echo no; ;;
esac
1 голос
/ 17 июня 2020

Не знаю, почему это так, но ваш код начинает работать после удвоения квадратных скобок:

INFO=$(uname -m && cat /etc/*release)
if [[ "$INFO" = *x86_64* ]]
then
    echo "You are running a 64bit-based system!"
else
    echo "Your system architecture is wrong!"
    exit
fi

Возможно, какое-то объяснение можно найти в разделе Двойные квадратные скобки [[]] предпочтительнее одинарных квадратных скобок [] в Bash? и подобных.

1 голос
/ 17 июня 2020

С bash версия> = 3 вы можете использовать регулярное выражение:

[[ "$INFO" =~ x86_64 ]]
0 голосов
/ 17 июня 2020

Один из способов проверить 64-битность - просто выполнить grep с выводом / bin / arch

if  /bin/arch | grep -q x86_64
then
  echo "it is 64 bit"
else
  echo "it is not"
fi
...