【问题标题】:Numbering Array Elements - Bash Scripting给数组元素编号 - Bash 脚本
【发布时间】:2015-04-27 20:01:14
【问题描述】:

我有一个名为 c 的数组。 它的元素是在当前目录中找到的文件名。我如何在他们自己的行上列出他们之前的数字? 例如:

1. aaa
2. filename2
3. bbb
4. asdf

我现在的代码只是将每个文件打印在自己的行上。喜欢:

aaa
filename2
bbb
asdf

我的代码如下:

#!/bin/bash
c=( $(ls --group-directories-first $*) )

   printf '%s\n' "${c[@]}"

【问题讨论】:

  • 你有没有为此尝试过?
  • 您询问的是数组编号,而不是创建它们,但创建部分值得评论:c=( $(ls --group-directories-first $*) ) 如果您的任何文件的名称中有空格,则会导致问题。
  • 我现在看到了@John1024,感谢您提到这一点。知道如何解决这个问题吗?
  • 最简单的是c=( * )。这将创建一个包含所有文件名的数组,并且可以安全地使用文件名中的任何字符。但是,这种方法确实不提供--group-directories-first 功能。

标签: bash shell unix scripting


【解决方案1】:

从数组c开始,这里有三种方法:

使用cat -n

cat 实用程序将为输出行编号:

$ cat -n < <(printf "%s\n" "${c[@]}")
     1  aaa
     2  filename2
     3  bbb
     4  asdf

使用bash

此方法使用 shell 算法对行进行编号:

$ count=0; for f in "${c[@]}"; do  echo "$((++count)). $f"; done
1. aaa
2. filename2
3. bbb
4. asdf

使用nl

在 cmets 中,twalberg 建议使用nl

$ nl < <(printf "%s\n" "${c[@]}")
     1  aaa
     2  filename2
     3  bbb
     4  asdf

实用程序nl 有许多选项可用于精确控制您希望如何完成编号,例如左/右对齐、包含前导零。见man nl

【讨论】:

  • nlcat -n 的有用替代品,它有许多选项可以准确控制您希望如何完成编号...
  • 感谢 John1024,我使用 bash(第二种方法)来修复它,并且效果很好。
  • @twalberg,很好的建议。我在答案中添加了nl。 JRM1201,很高兴它对你有用。
【解决方案2】:

这应该可行:

for (( i=0; i<${#c[@]}; i++)); do
printf '%d. %s\n' $((i+1)) "${c[$i]}"
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-21
    • 2018-01-29
    • 2016-08-31
    • 2015-12-19
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多