【问题标题】:explanation shell scripting code " for loop"解释shell脚本代码“for循环”
【发布时间】:2015-12-19 19:37:21
【问题描述】:

谁能帮我解释一下这个循环是什么?

for file in `ls *SC*`; do 
  for content in `cat $file `; do
    scid=`echo $file|awk -F'.' '{print $1}'`
    printf "%-10s%s\n" $scid $content
  done
done > text1

【问题讨论】:

  • 尝试在superuser.com做这个问题,你可以在每行的开头使用4个空格,使其格式类似于code,参见help page
  • 你可以试试eplainshell
  • 使用$(…) 代替命令周围的反引号;更容易正确,特别是如果你有时间嵌套符号。
  • 它似乎试图展示 shell 反模式。

标签: linux bash shell loops unix


【解决方案1】:

在这个循环中,shell 代码写得不好(性能、奇怪文件名后的错误)。
外循环:

for file in `ls *SC*`; do 
done > text1

尝试查找名称中包含 SC 的所有文件,对其进行处理,然后将输出写入 text1。更好的是:for file in *SC*; do

内循环:

  for content in `cat $file `; do
  done

对文件中的每个单词进行处理。

scid=`echo $file|awk -F'.' '{print $1}'`

这条线属于内部循环之外。它从第一个点中删除内容(删除文件名中带有 1 个点的扩展名)。您可以使用cut 或更快的${file%.*}

printf "%-10s%s\n" $scid $content

打印截止文件名(最少 10 个位置:附加空格)和第一个单词,当 scid 或内容有特殊字符时,两者都可能失败(最好是printf "%-10s%s\n" "$scid" "$content")。

【讨论】:

  • 还是awk 'f != FILENAME { f=FILENAME; split(FILENAME, x, "[.]"); } { printf "%-10s%s\n", x[1], $0 }' *SC*
  • @tripleee:我只是试图解释循环,我仍然不明白需要什么。每个输出行(以文件名开头)应该有一个单词还是一行输入文件?是的,awk 总是值得知道的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2022-05-17
  • 2016-04-20
  • 1970-01-01
相关资源
最近更新 更多