Как проверить, присутствует ли строка, содержащая переменные, в определенном файле в bash? - PullRequest
0 голосов
/ 17 октября 2018

Фон

У меня есть два файла:

  • ~/.bash.local # $LOCAL_BASH_CONFIG_FILE
  • ~/.fish.local # $LOCAL_FISH_CONFIG_FILE

Я динамически добавляю конфигурациик каждому файлу в скрипте bash.Каждый файл анализируется либо ~/.bash_profile, если он для bash, либо ~/.config/fish/config.fish, если он для fish.реализовать эти конфигурации.

Однако я не хочу добавлять строки, которые конфигурируют двоичный файл, в любой файл каждый раз, когда я запускаю свой скрипт bash.Я хотел бы сделать следующее:

  1. Проверить, содержится ли строка (например, BASH_CONFIG или FISH_CONFIG) в каждом указанном файле
  2. Если она не содержитсявнутри файла printf в указанный файл.
  3. Если он содержится в файле, не добавляйте его снова.

Цель моего скрипта ниже - установить пакет npm n, используя n-install и добавить правильную конфигурацию для bash и fish.

execute - это функция, которую я определил для запуска задачи в фоновом режиме и отображения сообщения на экране с помощьюspinner.

Текущий фрагмент сценария Bash

add_n_configs() {

    # bash

    declare -r BASH_CONFIGS="
# n - Node version management.
export N_PREFIX=\"\$HOME/n\";
[[ :\$PATH: == *\":\$N_PREFIX/bin:\"* ]] || PATH+=\":\$N_PREFIX/bin\"
"

    execute \
        "printf '%s\n' '$BASH_CONFIGS' >> $LOCAL_BASH_CONFIG_FILE \
        && . $LOCAL_BASH_CONFIG_FILE" \
        "n (update $LOCAL_BASH_CONFIG_FILE)"

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    # fish

    declare -r FISH_CONFIGS="
# n - Node version management.
set -xU N_PREFIX \"\$HOME/n\"
set -U fish_user_paths \"\$N_PREFIX/bin\" \$fish_user_paths
"

    execute \
        "printf '%s\n' '$FISH_CONFIGS' >> $LOCAL_FISH_CONFIG_FILE" \
        "n (update $LOCAL_FISH_CONFIG_FILE)"

}

1 Ответ

0 голосов
/ 18 октября 2018

После небольшого исследования кажется, что эта задача может быть выполнена с использованием grep следующим образом:

if ! grep -q "$BASH_CONFIGS" "$LOCAL_BASH_CONFIG_FILE"; then
        execute \
            "printf '%s\n' '$BASH_CONFIGS' >> $LOCAL_BASH_CONFIG_FILE \
            && . $LOCAL_BASH_CONFIG_FILE" \
            "n (update $LOCAL_BASH_CONFIG_FILE)"
fi

if ! grep -q "$FISH_CONFIGS" "$LOCAL_FISH_CONFIG_FILE"; then
        execute \
            "printf '%s\n' '$FISH_CONFIGS' >> $LOCAL_FISH_CONFIG_FILE" \
            "n (update $LOCAL_FISH_CONFIG_FILE)"
fi

grep - утилита командной строки, которая может искать и фильтровать текст, используя обычныесинтаксис регулярного выражения.

Для поиска точной строки: grep search_string path/to/file

Для поиска точной строки в тихом режиме: grep -q search_string path/to/file

  • grep -q будет выполнять поиск толькофайл, пока не будет найдено совпадение.
...