【问题标题】:Unix shell for loop [duplicate]Unix shell for循环[重复]
【发布时间】:2011-03-23 00:48:49
【问题描述】:

可能重复:
Unix for loop help please?

我正在尝试列出目录中所有文件的名称,并用空行分隔。我正在使用 for 循环,但在尝试了几个示例之后,通过在其间添加空行,没有一个真正起作用。有什么想法吗?

在 unix 中有没有只输出文件第一行的命令?我怎么能只显示第一行?

for i in ls  
do
echo "\n" && ls -l
done

for i in ls  
do
echo "\n" 
ls 
done

【问题讨论】:

  • 有没有打赌 aaron 和 cid 上的是同一门课程?

标签: shell unix for-loop


【解决方案1】:

使用headsed 1q 仅显示文件的第一行。但在这种情况下,如果我对您的理解正确,您希望捕获并修改ls 的输出。

ls -l | while read f; do
  printf '%s\n\n' "$f"
  # alternately
  echo "$f"; echo
done

【讨论】:

  • for 在这里是错误的答案,因为它会在空格处中断(实际上,在$IFS 中的任何字符上),而您需要完整的行。
  • 是的。你应该把它放在我的答案下面。
  • 嗯...我希望您的文件名也不包含换行符,否则这会破坏同样严重。我认为在while 之前通过xargs 的管道将解决它。
  • @D.Shawley:不会,因为while 不会在那里工作。如果您需要处理包含换行符的文件名,您的第一个错误是使用ls 枚举它们,这就是我不打扰的原因。使用 globbing 枚举和分隔 ls 命令......但现在事情已经够丑陋了(而且速度很慢,一次只能处理一个 ls),可以用更强大的东西重写。
  • 我认为ls -lB 也可以解决问题。使用ls -l | xargs | while read f... 似乎可以在我的MacBook 上使用,但在大多数情况下我会使用find -print0xargs -0 :)
【解决方案2】:
 IFS="
 "
 for i in $(ls /dir/name/here/or/not)
 do
     echo -e "$i\n"  
 done

查看文件的第一部分使用head,查看文件的结尾使用tail(当然)。命令head -n 1 filename 将显示第一行。使用man head 获得更多选择。 (我知道这听起来如何)。

【讨论】:

  • 现在它确实有效了。感谢极客龙。当然,这些答案中的大多数都会在包含名称的换行符等病理情况下中断。
  • 终于!让我愚蠢的 for 循环工作!
【解决方案3】:

使用 shell 扩展而不是 ls 来列出文件。

for file in *
do
  echo "$file"
  echo
  if [ -f "$file" ];then
    read firstline < "$file"
    echo "$firstline" # read first line
  fi
done

【讨论】:

  • +1 这是迄今为止唯一正确的答案。
猜你喜欢
  • 2012-10-22
  • 2021-08-21
  • 1970-01-01
  • 2019-04-02
  • 2013-05-12
  • 1970-01-01
  • 2016-06-05
  • 2020-10-18
  • 2014-03-23
相关资源
最近更新 更多