因此,当我的脚本运行时,我需要在上一个脚本运行的变量之后的行中选择下一个变量。
这就是我需要发生的事情
脚本运行#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还是陌生的。
谢谢!
答案 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}>&-
之间运行代码。