我有4个条目的文本文件。当我第一次运行shell脚本时,应该只选择第一个条目。当我第二次跑的时候,只有第二次进入,当我第五次运行脚本时,应该选择第一次进入第一次进入。
基本上它应该逐个拾取文本文件中的条目,当它到达最后时,它应该从第一个开始。
我最初考虑使用当前运行的条目再保留一个文件,所以当它下次运行时它将检查该文件并处理下一行。但我不能保留任何文件。这个逻辑应该在脚本本身内处理,而不保留任何其他文件。
我希望我解释了我的问题..请在unix中帮助我解决这个问题..
答案 0 :(得分:2)
您可以在强制调用trap
时使用sed
在终止或退出时更新文件中的索引。例如:
#!/bin/bash
declare -i current_idx=0
trap 'sed -i "s/^declare[ ]-i[ ]current_idx[=].*$/declare -i \
current_idx=$(((current_idx+1) % 4))/" $(readlink -f "$0")' SIGTERM EXIT
case "$current_idx" in
0 ) printf "picked up %d entry\n" "$current_idx";;
1 ) printf "picked up %d entry\n" "$current_idx";;
2 ) printf "picked up %d entry\n" "$current_idx";;
3 ) printf "picked up %d entry\n" "$current_idx";;
* ) printf "error: current_idx is '%d'\n" "$current_idx";;
esac
使用示例
这是一个名为11次的脚本,显示它如何循环通过4个不同的条目返回到第5次呼叫的第一个。
$ (for i in {0..10}; do bash selfmod.sh; done)
picked up 0 entry
picked up 1 entry
picked up 2 entry
picked up 3 entry
picked up 0 entry
picked up 1 entry
picked up 2 entry
picked up 3 entry
picked up 0 entry
picked up 1 entry
picked up 2 entry
注意:自我修改脚本不是一个好习惯。你的单独文件想法更安全。但是,出于您的目的,这将起作用。但是,我没有说明这是多么明智或安全。