使用shell脚本迭代$ PATH变量

Fog*_*ert 3 unix linux bash shell

如果我输入echo $PATH终端,我会得到以下结果:

/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/fnorbert/.local/bin:/home/fnorbert/bin
Run Code Online (Sandbox Code Playgroud)

我想使用shell脚本迭代这些路径,但我不知道如何做到这一点.
我尝试了以下方法:

for i in 1 2 3  
do
    echo $PATH | cut -d':' -f$i
done
Run Code Online (Sandbox Code Playgroud)

这会打印前三个路径,但是i如果可能的话,我想用变量表示每个路径.

anu*_*ava 7

您可以使用read分隔符设置为:

while read -d ':' p; do
   echo "$p"
done <<< "$PATH:"
Run Code Online (Sandbox Code Playgroud)

  • 这似乎删除了 var 的最后一个元素:`% FOO="one:two:three" ; 读取时 -d ':' p; 做 echo "$p" ; done &lt;&lt;&lt; "$FOO"` 结果为“(空)一二” (2认同)

ilk*_*chu 5

最简单的方法可能是更改IFS为冒号并让单词拆分来完成:

IFS=:
for p in $PATH ; do 
    echo "$p"
done
Run Code Online (Sandbox Code Playgroud)

但这可能会触发文件名通配符,在奇怪的情况下,您PATH包含的字符如*?[]. 你需要使用set -f来避免这种情况。

尽管IFS无论如何更改可能会被认为是有问题的,因为它会影响脚本的其余部分。因此,在 Bash 中,我们可以使用 将路径拆分为一个数组read -a,这对于 glob 字符也没有问题:

IFS=: read -a paths <<< "$PATH"
for p in "${paths[@]}" ; do
    echo "$p"
done
Run Code Online (Sandbox Code Playgroud)