如何旋转bash中的变量列表,以便每次运行脚本时都选择下一个变量?

时间:2019-06-16 15:53:37

标签: bash

因此,当我的脚本运行时,我需要在上一个脚本运行的变量之后的行中选择下一个变量。

这就是我需要发生的事情

脚本运行#1

var=(Run1 Run2 Run3)
echo ${var[0]}

OUTPUT: Run1

脚本运行#2

var=(Run1 Run2 Run3)
echo ${var[1]}

OUTPUT: Run2

脚本运行#3

var=(Run1 Run2 Run3)
echo ${var[2]}

OUTPUT: Run3

然后,当脚本第四次运行时,应返回到第一个变量并重复轮换过程。

脚本运行#4

var=(Run1 Run2 Run3)
echo ${var[0]}

OUTPUT: Run1

现在,在此之前,我一直在使用一种糟糕的方法来在脚本启动时选择随机变量,但是现在我正尝试正确地做到这一点。这是我之前的操作方式:

脚本运行#1

rndNum = $(( $RANDOM % 3 ))
var=(Run1 Run2 Run3)
echo ${var[$rndNum]}

OUTPUT: Run3

脚本运行#2

rndNum = $(( $RANDOM % 3 ))
var=(Run1 Run2 Run3)
echo ${var[$rndNum]}

OUTPUT: Run1

以此类推...

很抱歉,如果这个问题不好,我对bash还是陌生的。

谢谢!

1 个答案:

答案 0 :(得分:3)

随机数方法根本不是一个坏方法,它是无需外部存储即可使用的 only 方法。

安全地使用外部存储 ,即使同时启动多个脚本副本也可以正常工作,如下所示:

#!/usr/bin/env bash

choices=( one two three )
counterFile=$HOME/.myVar
exec {lock_fd}>"$counterFile.lck"   # first: open a lockfile
flock -x "$lock_fd" || exit         # grab a lock *before* reading the data file
if [[ -s $counterFile ]]; then      # if the data file exists and is populated...
  # add one to its content and rotate if over the number of choices.
  counter=$(( ( $(<"$counterFile") + 1 ) % ${#choices[@]} ))
else
  counter=0                         # otherwise initialize at 0
fi
printf '%s\n' "$counter" >"$counterFile"  # update the file while lock still held
exec {lock_fd}>&-                         # then release the lock

chosen=${choices[$counter]}
echo "This run chose $chosen"

之所以可行,是因为flock确保尽管同时启动了许多脚本副本,但是只有一个副本能够同时在flock -x "$lock_fd"exec {lock_fd}>&-之间运行代码。