2016-04-25 73 views
0

我有4個條目的文本文件。當我第一次運行shell腳本時,只有第一個條目應該被選中。當我第二次運行時,只有第二次輸入應該被拿起,並且當我第五次運行腳本時再次像這樣應該拿起第一次輸入。要從UNIX中的文件中選擇某些條目

基本上它應該逐個挑選文本文件中的條目,當它到達最後時,它應該再次從第一個開始。

我最初以爲用另一個文件保存當前正在運行的條目,所以當它下次運行時它會檢查該文件並處理下一行。但我無法保留任何文件。這個邏輯應該在腳本內部處理,而不要保留任何其他文件。

我希望我解釋了我的問題。請幫我在UNIX這個邏輯..

回答

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個不同的條目返回到第一對第五呼叫如何。

$ (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 

注:自我修改的劇本是不是好的做法。你的單獨檔案的想法更安全。但是,爲了您的目的,這將起作用。但是,我沒有表示這是多麼明智或安全。