Bash 设置用于打印目录内容的输出分隔符
我想打印由特定分隔符分隔的目录内容(在我的例子中是“:”)。 所以我在寻找这个循环的等价物:Bash 设置用于打印目录内容的输出分隔符,bash,Bash,我想打印由特定分隔符分隔的目录内容(在我的例子中是“:”)。 所以我在寻找这个循环的等价物: for f in * ; do printf $f: ; done 但是这个循环在最后打印了额外的“:”,我很确定我的案例有更优雅的解决方案。我试过类似的东西 echo * | tr " " : 但如果文件名包含空格,则会出现问题。有什么想法吗?您可以使用sed删除尾随的:: for f in * ; do printf $f: ; done | sed 's/:$//' 但是如果文件名中有例如%
for f in * ; do printf $f: ; done
但是这个循环在最后打印了额外的“:”,我很确定我的案例有更优雅的解决方案。我试过类似的东西
echo * | tr " " :
但如果文件名包含空格,则会出现问题。有什么想法吗?您可以使用
sed
删除尾随的:
:
for f in * ; do printf $f: ; done | sed 's/:$//'
但是如果文件名中有例如%s
或%d
或%f
或%c
或空格或制表符,则打印f%f
将失败。最好引用您的变量并执行以下操作:
for f in * ; do printf "%s:" "$f"; done | sed 's/:$//'
或者只是:
printf "%s:" * | sed 's/:$//'
如果文件名没有换行符,您可以使用换行符打印它们,并使用paste
:
printf "%s\n" * | paste -sd:
或者,您可以使用IFS
和$*
扩展来加入输出,并具有附加功能:
f() { ( IFS=:; printf "%s" "$*"; ); }; f *
我会成功的
这里还有另一个选项:当用双引号括起来时,
$*
将展开为位置参数列表,并用IFS
的第一个字符分隔。那么,给你:
( set -- * ; IFS=':' ; printf '%s\n' "$*" )
美好的你可以用简单的
echo
@F.Hauri-Nah替换printf“%s\n”
,echo不可靠。看<代码>(设置--*;IFS=:;echo“$*”工作正常,设置变量:dirColon=$(设置--*;IFS=:;echo“$*”
)!你说的不可靠是什么意思?(注意:IFS=
声明中冒号上的引号是无用的)请遵循我添加到注释中的链接。我真的没有时间就这件事做讲座。变量赋值中的引号是一个趣味问题;我喜欢这种方式奥古斯指挥棒极了,但有两件事我不清楚:1)为什么在集合中要双冲刺?我知道双破折号的一般含义,但找不到为什么我需要它的例子。2) 最后一部分不能打印为“$*”吗?我们需要字符串格式部分吗?
( set -- * ; IFS=':' ; printf '%s\n' "$*" )