Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 设置用于打印目录内容的输出分隔符_Bash - Fatal编程技术网

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' "$*" )