通常在环境变量中包含目录列表,以:
分隔(如$PATH
,$LD_LIBRARY_PATH
和其他许多内容。)
是否有任何工具或标准方法为列表中的每个目录应用命令?
在我的情况下,我需要检查它们是否存在,但是许多其他命令也很有用,所以我正在寻找一种方法来轻松迭代这些列表。
答案 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=:
# ...