如何使用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
如何更改程序?
答案 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)。