【问题标题】:Manipulate the output of echo $PATH操作 echo $PATH 的输出
【发布时间】:2016-09-10 13:46:48
【问题描述】:

echo $PATH 我明白了:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

而我希望以以下格式获取这些内容:

/usr/local/sbin
/usr/local/bin
...

我想做什么:

i=1;
for dir in `echo $PATH|cut -d ':' -f $i`
do
    echo $dir
    i=`expr $i + 1`
done

但它不起作用。有人可以帮我解答吗?

【问题讨论】:

  • 常见问题,例如thisthis
  • 那为什么没有人将它标记为重复呢?

标签: shell


【解决方案1】:

类似这样的:

old_IFS=$IFS
IFS=:
set -- $PATH
while [ $# -gt 0 ]; do
    echo $1;
    shift;
done
IFS=$old_IFS

【讨论】:

  • 你是说最后一行的$old_IFS 吗?如果用户执行其他操作而不是仅仅回显$1,这种方法也应该失败,
【解决方案2】:

tr 救援:

echo "$PATH" | tr : '\n'

【讨论】:

    【解决方案3】:

    你应该这样做:

    i=0
    echo "$PATH" | awk 'BEGIN{RS=":"}{printf "%s\0",$0}'| while read -rd '' line
    do
    echo "$line"; # or do something else with it?
    i=`expr $i + 1`
    done
    

    这将处理路径变量中的非标准文件夹,例如
    /usr/local folder &/usr/new/continued/in/next/line folder 等等。

    您也可以使用tr 代替awk,但将\n 替换为\0,如下所示:

    echo "$PATH" | tr : '\0' | while ...
    

    【讨论】:

    • @Biffen Not bashism coz this wiki article 说它至少在 bash、ksh 或 zs 中受支持。无论如何,好点。我将编辑答案。
    • @Biffen:感谢时间,编辑:D
    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2014-09-09
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多