【问题标题】:Using counter each time you run bash script每次运行 bash 脚本时使用计数器
【发布时间】:2014-09-05 05:00:58
【问题描述】:

假设我有一个包含这些文件的目录:

file-1.txt  file-2.txt ...

我想为我的 bash 写一个条件并检查 file-2.txt 是否存在,然后将输出写入 file-3.txt

示例 bash 脚本文件:

while read line;do
    <A command here> #could be anything
    if [ "$?" -eq "0" ]; then
        echo "$line" >> file-$counter.txt  #Pay attention to counter here
    fi
done < $LIST

当 bash 完成运行并停止时。然后我想再次运行它。现在我想检查最后一个文件是否是等等,然后告诉计数器将输出写入新文件。

【问题讨论】:

  • 什么是“等等”?
  • :) 这是上一个文件是通过运行 bash 创建的示例
  • 是否有一个循环,其中 $counter 从 0 开始,它从 1 开始计数,并在 file-$counter.txt 不存在时立即终止?有没有什么具体的部分你写不出来?
  • 不,我第一次运行 bash 输出是 file-1.txt 。我希望下次运行 bash 时它停止运行并输出 file-2.txt。下次file-3.txt等等...
  • 好的,那么你可以简单地修改我上面的想法,让$counter 从 1 而不是 0 开始。你明白我的想法吗?在伪代码中:counter = 0; while(file-$counter.txt is a file){ $counter = $counter + 1 } 在循环结束时,您可以使用字符串 file-$counter.txt 作为下一个要写入的未使用文件。现在你只需要谷歌一下就知道如何在 bash 中编写它。

标签: bash loops counter let


【解决方案1】:

你可以通过一系列命令获取文件的最后一个编号,然后加一个得到下一个:

pax> ll file-*.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-1.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-10.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-11.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-12.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-13.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-14.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-15.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-2.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-3.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-4.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-5.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-6.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-7.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-8.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-9.txt

pax> next=$(expr $(ls -1 file-*.txt |sed 's/file-//;s/.txt$//' |sort -nk1 |tail -1) + 1)

pax> echo $next
16

然后你可以用它来创建下一个:

pax> touch file-${next}.txt

pax> ll file-*.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-1.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-10.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-11.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-12.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-13.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-14.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-15.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:23 file-16.txt  <== here it is
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-2.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-3.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-4.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-5.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-6.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-7.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-8.txt
-rw-r--r-- 1 pax None 0 Jul 15 14:01 file-9.txt

逐个命令分解该行:

ls -1 file-*.txt           # get all files one per line.
sed 's/file-//;s/.txt$//'  # get rid of "file-" and '.txt', leaves numbers only.
sort -nk1                  # numerically sort (1..15).
tail -1                    # get last entry only (15).
expr $(... + 1)            # add one (16).
next=$(...)                # assign it to "next" variable.

解析ls 的输出并不总是一个好主意,因为文件名有时可能包含不寻常的字符。但是,如果您可以保证它们符合您的规范,那么这将正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2020-08-25
    • 1970-01-01
    • 2013-08-20
    • 2020-06-07
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多