如何检查bash中特定文件中是否包含包含变量的字符串?

时间:2018-10-17 17:20:30

标签: linux bash macos unix fish

背景

我有两个文件:

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

我正在为bash脚本中的每个文件动态添加配置。如果用于~/.bash_profile,则由bash解析每个文件;如果用于~/.config/fish/config.fish,则由fish解析每个文件。实现这些配置。

但是,我不想每次运行bash脚本时都将配置二进制文件的行添加到两个文件中。我希望它执行以下操作:

  1. 检查每个指定文件中是否包含字符串(例如BASH_CONFIGFISH_CONFIG
  2. 如果文件中未包含该文件,请printf将其放入指定的文件中。
  3. 如果它包含在文件中,则不要再次添加。

我的以下脚本的目的是使用n-install安装npm软件包n并将适当的配置添加到bashfish

execute是我定义的功能,用于在后台运行任务并使用微调器在屏幕上显示消息。

当前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 :(得分:1)

经过一些研究,看来可以使用{ "error": { "code": "UnknownError", "message": "{\"message\":\"onlinemeeting cannot be null.\"}", "innerError": { "request-id": "da54bfec-c987-4e02-b4b6-1844801d5f00", "date": "2018-10-18T09:52:25" } } } 来完成此任务:

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仅搜索文件,直到找到匹配项。