bash-скрипт для проверки расширения .AWK

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

Вот как файл /etc/profileили /etc/bash.bashrcможет настроить базовую среду, например, для интерактивной оболочки/оболочки входа в систему.

Кроме того, некоторые команды выполняются в среде подоболочки, которая является дубликатом среды оболочки. В такой среде доступны переменные оболочки и функции. См. также стандарт POSIX о Shell Execution Environment(мой акцент):

A subshell environment shall be created as a duplicate of the shell environment, except that signal traps that are not being ignored shall be set to the default action. Changes made to the subshell environment shall not affect the shell environment. Command substitution, commands that are grouped with parentheses, and asynchronous lists shall be executed in a subshell environment. Additionally, each command of a multi-command pipeline is in a subshell environment; as an extension, however, any or all commands in a pipeline may be executed in the current environment. All other commands shall be executed in the current shell environment.

Обратите внимание, что подоболочка отличается от дочернего процесса.

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


Также обратите внимание, что наличие каталога с именем ~/.bash_profileнемного сбивает с толку, так как оболочка bashпопытается найти источник обычный файл~/.bash_profileпри запуске оболочки входа в систему. Я предлагаю вам переименовать ваш каталог ~/.bash_profileво что-то вроде ~/.shellили ~/.shell_startup, если вы хотите переместить файлы инициализации оболочки в другое место.Эти файлы по-прежнему должны вызываться из ~/.bash_profileи ~/.bashrc, если вы хотите, чтобы они были получены автоматически.

0
24.11.2019, 23:55
1 ответ

В bashвы можете выполнить проверку подстановки, используя

if [[ $var == *.awk ]]; then
    echo '$var ends with ".awk"'
else
    echo '$var does not end with ".awk"'
fi

Обратите внимание на двойные квадратные скобки и знаки равенства.

bashтакже поддерживает стандартный способ выполнения таких тестов:

case $var in
    *.awk) echo '$var ends with ".awk"' ;;
    *)     echo '$var does not end with ".awk"' ;;
esac

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

Причина, по которой ваш тест всегда оказывается успешным, двояка:

  1. Вы проверяете литеральную строку  *.awk (, включая пробел с обеих сторон ), которая предположительно никогда не будет совпадать, и
  2. Вы отрицаете тест с помощью !.
1
28.01.2020, 02:38

Теги

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