Как мне повернуть список переменных в bash, чтобы при каждом запуске скрипта он выбирал следующую переменную? - PullRequest
1 голос
/ 16 июня 2019

Поэтому, когда мой скрипт запускается, мне нужно выбрать следующую переменную в строке, которая следует за той, которая запускалась при предыдущем запуске скрипта.

Вот что мне нужно, чтобы это произошло

Сценарий № 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-й раз, он должен вернуться к первой переменной и повторить вращающийся процесс.

Script Run # 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 Ответ

3 голосов
/ 16 июня 2019

Подход со случайными числами вовсе не плохой метод - это метод 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}>&- одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...