在bash中从$ PATH获取并打印目录

时间:2014-01-12 17:21:49

标签: linux bash

我必须编写的脚本必须找到$PATH变量中的目录,并仅打印以i结尾的目录。

我如何考虑这样做

  • 使用for循环从变量中获取每个目录。
  • 查找每个目录的长度,并使用子字符串
  • 获取每个目录的最后一个字符
  • 使用If条件打印以i
  • 结尾的目录

问题

  • 目录没有用新行分隔,我无法使用for循环读取它们。

关于如何克服这个问题的任何想法,或者你能想到更合适的事情。

4 个答案:

答案 0 :(得分:2)

你可以使用这个BASH单线程来完成这项工作:

(IFS=':'; for i in $PATH; do [[ -d "$i" && $i =~ i$ ]] && echo "$i"; done)
  • IFS=':'将输入字段分隔符设置为:
  • $PATHfor loop
  • 中进行了迭代
  • 如果每个路径元素都是一个目录,并且使用BASH正则表达式以i结尾,则会对其进行测试
  • 如果测试通过,那么它就会被剔除

答案 1 :(得分:1)

使用bash的parameter expansion替换所有分隔符。

${parameter//pat/string}

例如,

mypaths="${PATH//:/ }"

将按目录拆分路径,因此您可以运行:

for directory in $mypaths
do
    ...
done

答案 2 :(得分:0)

您可以将 Inter Field Separator (IFS)更改为冒号,然后以auto_magically方式解析路径。 ; - )

IFS=:
for i in $PATH
do
 echo $i | egrep -e 'i$'
done

答案 3 :(得分:-1)

grep 'i$' <<<"${PATH//:/$'\n'}"
  • $PATH项被分为单独的行,方法是将:个实例替换为parameter expansion中的换行符($'\n'); $'\n'ANSI C-quoted string

  • 生成的字符串作为here-string传递给grep的标准输入 (<<<...)。

  • grep用于仅匹配以$结尾的字母i的那些行。
    要不区分大小写,请使用grep -i 'i$'

示范:

$ (PATH='/ends/in_i:/usr/bin:/also/ends_in_i'; grep 'i$' <<<"${PATH//:/$'\n'}")
/ends/in_i
/also/ends_in_i