假设echo $PATH收益率/first/dir:/second/dir:/third/dir.
问题:如何一次回显$PATH一个目录的内容,如:
```
$ newcommand $PATH
/first/dir
/second/dir
/third/dir
```
Run Code Online (Sandbox Code Playgroud)
最好,我试图弄清楚如何使用for循环发出一个echo目录的每个实例的一个实例$PATH.
echo "$PATH" | tr ':' '\n'
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩.这将简单地获取输出echo "$PATH"并用换行符分隔符替换任何冒号.
请注意,引号周围$PATH可以防止输出中多个连续空格的折叠,$PATH同时仍然输出变量的内容.
这个怎么样:
echo "$PATH" | sed -e 's/:/\n/g'
Run Code Online (Sandbox Code Playgroud)
(参见sed 的s命令;sed -e 'y/:/\n/'也可以工作,并且相当于tr ":" "\n"其他一些答案中的命令。)
除非绝对必要,否则最好不要使事情复杂化:这里不需要 for 循环。还有其他方法可以为列表中的每个条目执行命令,更符合Unix 哲学:
这就是 Unix 哲学:编写只做一件事并把它做好的程序。编写程序以协同工作。编写程序来处理文本流,因为这是一个通用接口。
例如:
echo "$PATH" | sed -e 's/:/\n/g' | xargs -n 1 echo
Run Code Online (Sandbox Code Playgroud)
这在功能上相当于 for 循环迭代 PATH 元素,echo为每个元素执行最后一个命令。告诉-n 1它只xargs提供 1 个参数给它的命令;如果没有它,我们将得到与 相同的输出echo "$PATH" | sed -e 'y/:/ /'。
由于它使用xargs,它具有内置支持来分割输入,并且如果没有给出命令则回显输入,我们可以将其写为:
echo -n "$PATH" | xargs -d ':' -n 1
Run Code Online (Sandbox Code Playgroud)
告诉-d ':'xargs 使用:分隔它的输入而不是换行符,并且告诉 xargs-n不要/bin/echo写入换行符,否则我们最终会得到一个空白的尾随行。
作为附加选项(如果您需要数组中的条目用于其他目的),您可以使用自定义IFSand来执行此操作read -a:
IFS=: read -r -a patharr <<<"$PATH"
printf %s\\n "${patharr[@]}"
Run Code Online (Sandbox Code Playgroud)
或者因为问题要求带有 for 循环的版本:
for dir in "${patharr[@]}"; do
echo "$dir"
done
Run Code Online (Sandbox Code Playgroud)
您可以使用tr(translate) 将冒号 ( :) 替换为换行符 ( \n),然后在 for 循环中对其进行迭代。
directories=$(echo $PATH | tr ":" "\n")
for directory in $directories
do
echo $directory
done
Run Code Online (Sandbox Code Playgroud)