колотить, как улучшить этот сценарий

Try showmount -e ipaddressOfWindows |grep -i \D:\

Вы получите сетевые группы, Сделайте сервер или компьютер членами этих сетевых групп. Команда mount будет зависеть от типа, CIFS или NFS?

3
05.08.2018, 17:19
2 ответа

решение grep

Используйте функцию «-w» функции grep, чтобы сопоставить слово. Осмелюсь сказать, что он не будет работать на старых grepреализациях, таких как Solaris, AIX и т. д.

echo $IGNORE_USER | grep -qw $USER && exit_program 'bye bye'

Попробуйте онлайн!

внутреннее решение bash

Перейдите полностью на bash и не полагайтесь на grep.

bashне позволяет использовать конструкцию =~ regex, если вы сначала не запустите shopt -s compat31. Таким образом, используя =~ $(echo regex), мы можем преодолеть это. В этом примере мы используем двойные кавычки, так что $USERрасширяется, и при этом нам нужно экранировать \b, чтобы он был \\b.

[[ $IGNORE_USER =~ $(echo "\\b$USER\\b") ]] && exit_program 'bye bye'

Попробуйте онлайн!

4
27.01.2020, 21:08

Этот сценарий не работает.

У вас есть синтаксическая ошибка в первой строке: присваивание IGNORE_USERне должно разыменовывать переменную с помощью $. В вашем операторе ifесть еще одна синтаксическая ошибка. Используйте [ "string1" = "string2" ]для сравнения строк.

В вашем коде используется $IGNORE_USERбез кавычек. Это разбивает строку на пробелы, что вы и хотите сделать. В самом общем случае это а не то, что вы хотите сделать, поскольку элементы в списке вполне могут содержать пробельные символы, которые следует сохранить. Оболочка также будет выполнять генерацию имени файла (подстановку )значений в строке, если она используется без кавычек.

Было бы лучше использовать для этого массив, так как вы имеете дело с отдельными элементами (именами пользователей ). Всякий раз, когда вы хотите обрабатывать отдельные элементы как отдельные элементы, не помещайте их в одну строку. Это потенциально затруднит отличить один элемент от другого.

Предложение:

ignore=( 'user1' 'user2' 'user3' )

for u in "${ignore[@]}"; do
    if [ "$USER" = "$u" ]; then
        exit_program 'bye bye'
    fi
done

Это предполагает, что exit_programобеспечивает выход из программы. Если нет, добавьте exitпосле вызова exit_program. Нет необходимости проверять, пуст ли массив ignore, так как в этом случае цикл не выполнил бы ни одной итерации.

В приведенном выше коде"${ignore[@]}"(обратите внимание, что двойные кавычки )расширяются до списка имен пользователей, каждое имя пользователя заключено в кавычки и защищено от дальнейшего разделения слов и создания имен файлов.

Связанные:


Для версии, не относящейся к bash,но это будет работать в любой POSIX -, такой как оболочка:

set -- 'user1' 'user2' 'user3'

for u do
    if [ "$USER" = "$u" ]; then
        exit_program 'bye bye'
    fi
done

Здесь вместо массива используется список позиционных параметров в качестве списка имен пользователей, которые следует игнорировать.

11
27.01.2020, 21:08

Теги

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