我想循环一个我从echo $VARIABLE
命令中获得的路径列表.
例如:
echo $MANPATH
将返回
/usr/lib:/usr/sfw/lib:/usr/info
这是三条不同的路径,每条路径用冒号分隔.我想循环每个路径.有没有办法做到这一点?谢谢.
感谢到目前为止的所有回复,看起来我实际上根本不需要循环.我只需要一种取出冒号的方法,这样我就可以ls
在这三条路径上运行一个命令.
cho*_*oba 49
您可以设置内部字段分隔符:
( IFS=:
for p in $MANPATH; do
echo "$p"
done
)
Run Code Online (Sandbox Code Playgroud)
我使用了子shell,因此IFS中的更改不会反映在我当前的shell中.
Tod*_*obs 17
您可以使用Bash的模式替换参数扩展来填充循环变量.例如:
MANPATH=/usr/lib:/usr/sfw/lib:/usr/info
# Replace colons with spaces to create list.
for path in ${MANPATH//:/ }; do
echo "$path"
done
Run Code Online (Sandbox Code Playgroud)
注意:请勿将替换扩展括在引号中.您希望MANPATH中的扩展值被for循环解释为单独的单词,而不是单个字符串.
gni*_*urf 13
在Bash中执行此操作的规范方法是read
适当地使用内置函数:
IFS=: read -r -d '' -a path_array < <(printf '%s:\0' "$MANPATH")
Run Code Online (Sandbox Code Playgroud)
这是唯一可靠的解决方案:将不正是你想要什么:分裂的分隔字符串:
和安全相对于空格,换行,像水珠字符*
,[ ]
等(不像其他的答案:他们都打破).
在这个命令之后,你将有一个数组path_array
,你可以循环它:
for p in "${path_array[@]}"; do
printf '%s\n' "$p"
done
Run Code Online (Sandbox Code Playgroud)
这样,您可以安全地完成$PATH
一个循环,而$IFS
在循环内或循环外保持相同。
while IFS=: read -d: -r path; do # `$IFS` is only set for the `read` command
echo $path
done <<< "${PATH:+"${PATH}:"}" # append an extra ':' if `$PATH` is set
Run Code Online (Sandbox Code Playgroud)
您可以检查的值$IFS
,
IFS='xxxxxxxx'
while IFS=: read -d: -r path; do
echo "${IFS}${path}"
done <<< "${PATH:+"${PATH}:"}"
Run Code Online (Sandbox Code Playgroud)
输出将是这样的。
xxxxxxxx/usr/local/bin
xxxxxxxx/usr/bin
xxxxxxxx/bin
Run Code Online (Sandbox Code Playgroud)