如何使用awk对$ PATH进行标记?

时间:2011-03-23 10:05:43

标签: bash awk

如何使用awk标记$ PATH?

我试了3个小时,但它完全搞砸了。

#!/bin/bash

i=1

while true; do
  token=$($echo $PATH | awk -F ':' '{print $"$i"}')

  if [ -z "$token" ]; then
    break
  fi  

  ((i++))

  if [ -a "$TOKEN/$1" ]; then
    echo "$TOKEN/$1"
    break
  fi  

  break
done

当我运行此代码时,我得到了

/home/$USERID/bin/ff: line 6: /home/$USERID/bin:/usr/local/symlinks:/usr/local/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/$USERID/bin: No such file or directory

如何更改程序?

4 个答案:

答案 0 :(得分:6)

你想做什么?

这将允许您针对各个路径进行迭代:

echo $PATH | tr ':' '\n' | while read line; do echo $line; done

正如@SiegeX所说,更短版本的作品

echo $PATH | while read -d ':' line; do echo $line; done

答案 1 :(得分:2)

在awk中完成整个事情

#!/bin/bash

awk -v addPath="$1" 'BEGIN{RS=":";ORS=addPath "\n"}{$1=$1}1' <<< $PATH

概念证明

$ addPath="/foo"
$ awk -v addPath="$addPath" 'BEGIN{RS=":";ORS=addPath "\n"}{$1=$1}1' <<< $PATH
/usr/local/bin/foo
/usr/bin/foo
/bin/foo
/usr/games/foo
/usr/lib/java/bin/foo
/usr/lib/qt/bin/foo
/usr/share/texmf/bin/foo
./foo
/sbin/foo
/usr/sbin/foo
/usr/local/sbin/foo

答案 2 :(得分:1)

我认为简单的tr : \\n就足够了。使用sed 's#$#blabla#g'对其进行管道处理,以便为行添加内容,就是这样。

答案 3 :(得分:0)

您不需要使用外部工具(如awk或tr)来标记PATH。 Bash能够这样做:

#!/bin/sh

IFS=:
for p in $PATH
do
    if [ -a "$p/$1" ]; then
        echo "$p/$1"
        break
    fi
done

IFS是一个bash内置变量,它将bash用作输入字段分隔符(IFS)。