如何检查 bash 中的特定文件中是否存在包含变量的字符串?
How do I check if a string containing variables is present in a specific file in bash?
背景
我有两个文件:
~/.bash.local # $LOCAL_BASH_CONFIG_FILE
~/.fish.local # $LOCAL_FISH_CONFIG_FILE
我正在向 bash 脚本中的每个文件动态添加配置。如果每个文件用于 bash
,则由 ~/.bash_profile
解析;如果用于 fish
,则由 ~/.config/fish/config.fish
解析。实现这些配置。
但是,我不想在每次 运行 我的 bash 脚本时都将配置二进制文件的行添加到任一文件中。我希望它执行以下操作:
- 检查每个指定文件中是否包含字符串(例如
BASH_CONFIG
或 FISH_CONFIG
)
- 如果它不包含在文件中,
printf
将它放入指定的文件中。
- 如果它包含在文件中,则不要再次添加它。
我下面的脚本的目的是使用 n-install 安装 npm
包 n
并向 bash
和 fish
添加正确的配置。
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)"
}
经过一些研究,似乎可以使用 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
只会搜索文件,直到找到匹配项。
背景
我有两个文件:
~/.bash.local # $LOCAL_BASH_CONFIG_FILE
~/.fish.local # $LOCAL_FISH_CONFIG_FILE
我正在向 bash 脚本中的每个文件动态添加配置。如果每个文件用于 bash
,则由 ~/.bash_profile
解析;如果用于 fish
,则由 ~/.config/fish/config.fish
解析。实现这些配置。
但是,我不想在每次 运行 我的 bash 脚本时都将配置二进制文件的行添加到任一文件中。我希望它执行以下操作:
- 检查每个指定文件中是否包含字符串(例如
BASH_CONFIG
或FISH_CONFIG
) - 如果它不包含在文件中,
printf
将它放入指定的文件中。 - 如果它包含在文件中,则不要再次添加它。
我下面的脚本的目的是使用 n-install 安装 npm
包 n
并向 bash
和 fish
添加正确的配置。
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)"
}
经过一些研究,似乎可以使用 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
只会搜索文件,直到找到匹配项。