shell 如何将'$PATH'的内容分割成不同的行?

nzrxty8p  于 2023-03-09  发布在  Shell
关注(0)|答案(8)|浏览(252)

假设echo $PATH产生/first/dir:/second/dir:/third/dir

**问题:**如何一次回显$PATH中一个目录的内容,如下所示:

$ newcommand $PATH
/first/dir
/second/dir
/third/dir

最好,我尝试弄清楚如何使用for循环来完成此操作,该循环针对$PATH中的每个目录示例发出一个echo示例。

fd3cxomn

fd3cxomn1#

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

应该可以了。这将简单地获取echo "$PATH"的输出,并将任何冒号替换为换行符。
如果您需要循环使用:

for dir in `echo "$PATH" | tr ':' '\n'`; do
    echo "$dir"
done

注意,$PATH两边的引号可以防止$PATH输出中的多个连续空格折叠,同时仍然输出变量的内容。

bxpogfeg

bxpogfeg2#

作为一个附加选项(如果您需要数组中的条目用于其他目的),您可以使用自定义的IFSread -a来完成此操作:

IFS=: read -r -a patharr <<<"$PATH"
printf %s\\n "${patharr[@]}"

或者因为问题要求使用for循环的版本:

for dir in "${patharr[@]}"; do
    echo "$dir"
done
iq0todco

iq0todco3#

不如这样:

echo "$PATH" | sed -e 's/:/\n/g'

(See sed的s命令;sed -e 'y/:/\n/'也可以使用,并且等效于其他答案中的tr ":" "\n"。)
除非绝对必要,否则最好不要把事情复杂化:这里不需要for循环。还有其他方法可以为列表中的每个条目执行命令,更符合Unix Philosophy
这就是Unix的哲学:写程序做一件事并且做得很好。写程序一起工作。写程序处理文本流,因为那是一个通用的接口。
例如:

echo "$PATH" | sed -e 's/:/\n/g' | xargs -n 1 echo

这在功能上等价于一个for循环,它遍历PATH元素,对每个元素执行最后一个echo命令,-n 1告诉xargs只提供一个参数给它的命令;没有它,我们将得到与echo "$PATH" | sed -e 'y/:/ /'相同的输出。
由于它使用xargs,它内置了对拆分输入的支持,并且在没有给出命令时回显输入,因此我们可以将其写为:

echo -n "$PATH" | xargs -d ':' -n 1

-d ':'告诉xargs使用:而不是换行符来分隔输入,-n告诉/bin/echo不要写换行符,否则我们以一个空白的尾随行结束。

kuarbcqp

kuarbcqp4#

下面是另一个较短的例子:

echo -e ${PATH//:/\\n}
ldxq2e6h

ldxq2e6h5#

您可以使用tr(translate)将冒号(:)替换为换行符(\n),然后在for循环中对其进行迭代。

directories=$(echo $PATH | tr ":" "\n")
for directory in $directories
do
    echo $directory
done
niknxzdl

niknxzdl6#

我的想法是使用echoawk

echo $PATH | awk 'BEGIN {FS=":"} {for (i=0; i<=NF; i++) print $i}'
    • 编辑**

这个命令比我以前的主意好。

echo "$PATH" | awk 'BEGIN {FS=":"; OFS="\n"} {$1=$1; print $0}'
zpgglvta

zpgglvta7#

如果可以保证PATH不包含嵌入空格,则可以:

for dir in ${PATH//:/ }; do
    echo $dir
done

如果有嵌入的空格,这将严重失败。

5f0d552i

5f0d552i8#

# preserve the existing internal field separator
OLD_IFS=${IFS}
# define the internal field separator to be a colon
IFS=":"
# do what you need to do with $PATH
for DIRECTORY in ${PATH}
do
  echo ${DIRECTORY}
done
# restore the original internal field separator
IFS=${OLD_IFS}

相关问题