如果我在终端中输入echo $PATH
,我会得到以下结果:
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/fnorbert/.local/bin:/home/fnorbert/bin
我想使用shell脚本迭代这些路径,但我不知道该怎么做 我尝试了以下方法:
for i in 1 2 3
do
echo $PATH | cut -d':' -f$i
done
这会打印前三个路径,但如果可能的话,我想用变量i
表示每个路径。
答案 0 :(得分:7)
您可以将 UIView.animate(withDuration: 0.4,
delay: 0.0,
options: UIViewAnimationOptions.curveEaseInOut,
animations: {
dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
},
completion: { finished in
src.present(dst, animated: true, completion: nil) }
与分隔符设置为read
:
答案 1 :(得分:4)
最简单的方法可能是将IFS
更改为冒号并让分词执行:
IFS=:
for p in $PATH ; do
echo "$p"
done
但是,这可能会触发文件名称通配,在奇怪的情况下,PATH
包含*?[]
等字符。您需要使用set -f
来避免这种情况。
虽然更改IFS
可能会被视为有问题,但因为它会影响脚本的其余部分。所以在Bash中,我们可以将路径拆分为带有read -a
的数组,这对于glob字符也没有问题:
IFS=: read -a paths <<< "$PATH"
for p in "${paths[@]}" ; do
echo "$p"
done
答案 2 :(得分:2)
with echo:
echo "${PATH//:/$'\n'}"
sed的:
sed 's/:/\n/g' <<< "$PATH"
TR:
tr ':' '\n' <<< "$PATH"
蟒:
python -c "import os; print os.environ['PATH'].replace(':', '\n')"
用于迭代:
for in in ${PATH//:/ }; do echo $i; done
答案 3 :(得分:1)
这是一个简单的解决方案,可以稍微扩展你的尝试
for i in $( echo "$PATH" | cut -d: -f 1- --output-delimiter=" " ) ;
do
echo "$i" ;
done
这里使用的一个技巧是-f 1-
来指定所有字段而不是一个字段。
另一个技巧是使用--output-delimiter
选项。
此解决方案对目录名称中的特殊字符敏感。
考虑以下示例
PATH="help me":\*:now
for i in $( echo "$PATH" | cut -d: -f 1- --output-delimiter=" " ) ;
do
echo "$i" ;
done
这将输出
help
me
foo
now
即,
*
等特殊字符将由shell扩展为当前目录中的文件列表(foo
是驻留在当前目录中的文件的名称)但是,如果您的PATH
不包含任何特殊内容,则可以使用。否则或者更确切地说,在所有情况下都会使用read
的{{3}}。
答案 4 :(得分:0)
您可以使用awk来满足要求,
echo $PATH | awk -F: '{ for (i=1; i<=NF; i++) {print $i}}'
这在性能方面非常有效。