有/bin/bash,我如何检测用户的$ PATH变量中是否有特定的目录?
例如
if [ -p "$HOME/bin" ]; then
echo "Your path is missing ~/bin, you might want to add it."
else
echo "Your path is correctly set"
fi
Run Code Online (Sandbox Code Playgroud)
Gor*_*son 129
使用grep是过度杀伤,如果您正在搜索包含RE元字符的任何内容,可能会造成麻烦.使用bash的内置[[命令可以很好地解决这个问题:
if [[ ":$PATH:" == *":$HOME/bin:"* ]]; then
echo "Your path is correctly set"
else
echo "Your path is missing ~/bin, you might want to add it."
fi
Run Code Online (Sandbox Code Playgroud)
请注意,在$ PATH的扩展和搜索路径之前添加冒号解决了子串匹配问题; 双引号路径避免了元字符的麻烦.
Pau*_*ce. 11
以下是没有的方法grep:
if [[ $PATH == ?(*:)$HOME/bin?(:*) ]]
Run Code Online (Sandbox Code Playgroud)
这里的关键是使用?()构造使冒号和通配符可选.此表单中的元字符应该没有任何问题,但是如果要包含引号,这就是它们的位置:
if [[ "$PATH" == ?(*:)"$HOME/bin"?(:*) ]]
Run Code Online (Sandbox Code Playgroud)
这是使用match运算符(=~)执行此操作的另一种方法,因此语法更像grep是:
if [[ "$PATH" =~ (^|:)"${HOME}/bin"(:|$) ]]
Run Code Online (Sandbox Code Playgroud)
There is absolutely no need to use external utilities like grep for this. Here is what I have been using, which should be portable back to even legacy versions of the Bourne shell.
case :$PATH: # notice colons around the value
in *:$HOME/bin:*) ;; # do nothing, it's there
*) echo "$HOME/bin not in $PATH" >&2;;
esac
Run Code Online (Sandbox Code Playgroud)
一些非常简单和天真的东西:
echo "$PATH"|grep -q whatever && echo "found it"
Run Code Online (Sandbox Code Playgroud)
无论你在寻找什么.而不是&&你可以放入$?变量或使用适当的if语句.
限制包括:
或使用perl one-liner:
perl -e 'exit(!(grep(m{^/usr/bin$},split(":", $ENV{PATH}))) > 0)' && echo "found it"
Run Code Online (Sandbox Code Playgroud)
它仍有限制,它不会进行任何shell扩展,但如果子字符串匹配则不会失败.(以上匹配" /usr/bin",如果不清楚的话).
| 归档时间: |
|
| 查看次数: |
26816 次 |
| 最近记录: |