如何在bash环境变量列表中进行迭代?

时间:2013-09-26 18:34:57

标签: bash

通常在环境变量中包含目录列表,以:分隔(如$PATH$LD_LIBRARY_PATH和其他许多内容。)

是否有任何工具或标准方法为列表中的每个目录应用命令?

在我的情况下,我需要检查它们是否存在,但是许多其他命令也很有用,所以我正在寻找一种方法来轻松迭代这些列表。

4 个答案:

答案 0 :(得分:4)

在bash中执行此操作的正确方法是将其与数组分开:

IFS=: read -ra PATHS <<< "$PATH"

for P in "${PATHS[@]}"; do
    echo "$P"
done

使用此表单会使循环中的任何变量赋值丢失:

echo "$PATH" | tr : '\n' | while read P; do
    ALL=$ALL:$P
done

echo "$ALL" # => empty string

另一个更好的方法是通过:

while read P; do
    ALL=$ALL:$P
done <<< "${PATH//:/$'\n'}"

启动Bash 3.1后,ALL=$ALL:$P可以进一步简化为ALL+=$P

答案 1 :(得分:2)

我做的快事就是

echo $PATH | tr : '\n' | while read dir; do
  ls "$dir" > /dev/null
done

对于任何不存在(或不可读)的组件,您将收到错误。它可能不是防弹的。

答案 2 :(得分:1)

你可以这样做:

$ echo $PATH | tr : ' ' | xargs -n1 ls -d
/usr/local/bin
/usr/bin
/bin
/usr/local/sbin
/usr/sbin
/usr/local/sbin
/usr/sbin
ls: cannot access /a/b/c: No such file or directory

仅适用于不存在的目录:

$ echo $PATH | tr : ' ' | xargs -n1 ls -d > /dev/null
ls: cannot access /a/b/c: No such file or directory

答案 3 :(得分:0)

您还可以利用位置参数:

IFS=:
set -- $PATH
for dir in "$@"; do
    : do something with "$dir"
done

也可以更简洁地编写for循环来循环遍历位置参数:

for dir; do ...

根据您在脚本中执行的操作,您可能希望在覆盖之前保存当前的IFS:

oldIFS=$IFS
IFS=:
# ...