for f in *.*
do
echo -n | ls $f | rev | sed 's/^[^.]*//g'| sed 's/^.//' | rev
echo -n " ima koncnico "
echo -n | ls $f | rev | cut -d . -f1 | rev
done我有下面的代码,对于for循环的每一次迭代都应该在同一行中回显。我的输出是什么样子的:
examples
ima koncnico desktop
naloga_2
ima koncnico sh
naloga_6
ima koncnico sh
NALOGE
ima koncnico zip
UVOS.tar
ima koncnico xz它应该是什么样子:
examples ima koncnico desktop
naloga_2 ima koncnico sh
naloga_6 ima koncnico sh
NALOGE ima koncnico zip
UVOS.tar ima koncnico xz为什么会发生这种情况?我想是和ls有关吧。什么是最好的解决方案?
发布于 2020-03-08 23:54:53
关于你手头问题的:
在大多数情况下,echo -n | something不会做任何有用的事情。它什么也不输出,什么也不输出。
您的解决方案是echo -n $(something),因为它运行something,然后输出不带尾换行符的输出。
for f in *.*
do
echo -n $(ls $f | rev | sed 's/^[^.]*//g'| sed 's/^.//' | rev)
echo -n " ima koncnico "
ls $f | rev | cut -d . -f1 | rev
done我完全删除了最后一个echo,因为您无论如何都需要一个换行符,否则所有文件都是一行。
用一种也许更清晰的方式写这篇文章的方法是:
for f in *.*
do
NAME=$(ls $f | rev | sed 's/^[^.]*//g'| sed 's/^.//' | rev)
EXT=$(ls $f | rev | cut -d . -f1 | rev)
echo "$NAME ima koncnico $EXT"
done关于一个更好的方法的一般情况:
整个管道实际上没有必要--有更简单的方法。正如用户oguz在他们的回答中提到的,you can use parameter expansion。
发布于 2020-03-08 23:53:50
只需使用参数扩展;您不需要该管道,它也不会执行您认为它可以做的事情。
for f in *.*; do
printf '%s ima koncnico %s\n' "${f%.*}" "${f##*.}"
donehttps://stackoverflow.com/questions/60593119
复制相似问题