【问题标题】:How do I check if a string containing variables is present in a specific file in bash?如何检查包含变量的字符串是否存在于 bash 的特定文件中?
【发布时间】:2018-10-17 17:20:30
【问题描述】:

背景

我有两个文件:

  • ~/.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 安装npmn 并将正确的配置添加到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)"

}

【问题讨论】:

  • 你只需要 something 比如if ! grep -q N_PREFIX "$file"; then add it; fi
  • @glennjackman 除了BASH_CONFIGSFISH_CONFIGS 之外,有没有办法做同样的事情?
  • 当然可以。我试图给你一个提示,而不是整个解决方案。我认为很明显你会用...替换$file...

标签: linux bash macos unix fish


【解决方案1】:

经过一番研究,似乎可以使用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 只会搜索文件,直到找到匹配项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 2011-04-15
    • 2018-06-14
    • 2013-07-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多