使用shell脚本迭代$ PATH变量

时间:2017-06-13 14:19:28

标签: linux bash shell unix

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

/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/fnorbert/.local/bin:/home/fnorbert/bin

我想使用shell脚本迭代这些路径,但我不知道该怎么做 我尝试了以下方法:

for i in 1 2 3  
do
    echo $PATH | cut -d':' -f$i
done

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

5 个答案:

答案 0 :(得分:7)

您可以将 UIView.animate(withDuration: 0.4, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations: { dst.view.transform = CGAffineTransform(translationX: 0, y: 0) }, completion: { finished in src.present(dst, animated: true, completion: nil) } 与分隔符设置为read

:

答案 1 :(得分:4)

最简单的方法可能是将IFS更改为冒号并让分词执行:

IFS=:
for p in $PATH ; do 
    echo "$p"
done

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

虽然更改IFS可能会被视为有问题,但因为它会影响脚本的其余部分。所以在Bash中,我们可以将路径拆分为带有read -a的数组,这对于glob字符也没有问题:

IFS=: read -a paths <<< "$PATH"
for p in "${paths[@]}" ; do
    echo "$p"
done

答案 2 :(得分:2)

with echo:

echo "${PATH//:/$'\n'}"

sed的:

sed 's/:/\n/g' <<< "$PATH"

TR:

tr ':' '\n' <<< "$PATH"

蟒:

python -c "import os; print os.environ['PATH'].replace(':', '\n')"

用于迭代:

for in in ${PATH//:/ }; do echo $i; done

答案 3 :(得分:1)

这是一个简单的解决方案,可以稍微扩展你的尝试

for i in $( echo "$PATH" | cut -d: -f 1- --output-delimiter=" " ) ; 
do 
   echo "$i" ; 
done

这里使用的一个技巧是-f 1-来指定所有字段而不是一个字段。

另一个技巧是使用--output-delimiter选项。

此解决方案对目录名称中的特殊字符敏感。

考虑以下示例

PATH="help me":\*:now
for i in $( echo "$PATH" | cut -d: -f 1- --output-delimiter=" " ) ; 
do 
   echo "$i" ; 
done

这将输出

help
me
foo
now

即,

  • 目录名称中的空格将无法正确处理
  • *等特殊字符将由shell扩展为当前目录中的文件列表(foo是驻留在当前目录中的文件的名称)

但是,如果您的PATH不包含任何特殊内容,则可以使用。否则或者更确切地说,在所有情况下都会使用read的{​​{3}}。

答案 4 :(得分:0)

您可以使用awk来满足要求,

echo $PATH | awk -F: '{ for (i=1; i<=NF; i++) {print $i}}'

这在性能方面非常有效。