从bash获取并打印$ PATH目录

我必须写的脚本必须从$PATHvariables中find目录,并只打印以i结尾的目录。

我怎么想这样做

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

问题

  • 这些目录不是用新行分隔的,我不能用for循环读取它们。

关于如何解决这个问题的任何想法,或者你能想出更合适的事情。

你可以使用这个BASH单行来完成这个工作:

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

使用bash的参数扩展来替换所有的分隔符。

 ${parameter//pat/string} 

例如,

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

将按目录拆分路径,那么你可以运行:

 for directory in $mypaths do ... done 

您可以将Inter Field Separator (IFS)更改为冒号,然后将路径从auto_magically解开。 😉

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

尽管倒票,我相信这是一个有效的,简洁的解决方案。 请告诉我们,如果你不同意,也许如何改善答案。

 grep 'i$' <<<"${PATH//:/$'\n'}" 
  • $PATH条目通过在参数扩展中用换行符( $'\n' )替换:实例分成单独的行; $'\n'是ANSI C引号的字符串 。

  • 得到的字符串作为here-string ( <<<... )传递给grep的stdin。

  • 然后使用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