변수 값을 x번만 사용

변수 값을 x번만 사용

특정 ID로 명령을 실행해야 하는 bash 스크립트를 만들고 있습니다. 하지만 하나의 ID는 10번만 사용할 수 있습니다. 그 이후에는 ID가 변경되어야 합니다.

예를 들어 ID가 3개 있습니다.

ID=(abcd1
abcd2
abcd3)

echo $ID

이제 스크립트를 10번 실행하면 ID 값이 abcd2로 변경되어야 합니다. 10번 이후에는 ID 값이 abcd3으로 변경되어야 합니다.

구글에 검색해봤는데 비슷한 내용은 못 찾았어요

편집: 이 경우에는 json을 사용하는 아이디어가 떠올랐기 때문에 다른 기사를 만들었습니다.여기

답변1

스크립트에 카운터를 넣을 수 있습니다. 그런 다음 스크립트가 실행될 때마다 이를 업데이트하도록 합니다.

#!/usr/bin/env bash

_list=(
  abc
  def
  ghi
)
_list_index=0 # autoupdate
_list_usage_counter=0 # autoupdate

max_uses=10
if [ $((_list_usage_counter)) -eq $((max_uses - 1)) ] ; then
  # reset counter
  sed -Ei \
    -e "s/^(_list_usage_counter)\=${_list_usage_counter}( # autoupdate)\$/\1=0\2/" \
    "$(readlink -f "$0")"
  _list_usage_counter=0

  # update list index
  sed -Ei \
    -e "s/^(_list_index)\=${_list_index}( # autoupdate)\$/\1=$((++_list_index))\2/" \
    "$(readlink -f "$0")"
fi

# make sure index is not out of bounds
if [ $_list_index -ge ${#_list[@]} ] ; then
  echo "no more items to use"
  exit
fi

# ... do stuff ...
echo "item: ${_list[_list_index]}"
echo "used: $((_list_usage_counter + 1))"

# update counter
sed -Ei \
  -e "s/^(_list_usage_counter)\=${_list_usage_counter}( # autoupdate)\$/\1=$((++_list_usage_counter))\2/" \
  "$(readlink -f "$0")"

답변2

임시 파일에 "카운터"를 저장할 수 있습니다.

#!/bin/bash

ID=(abcd1 abcd2 abcd3)

#if script run for the first time create "file" counters
id_file="/tmp/$(basename ${0})_id"
us_file="/tmp/$(basename ${0})_usage"
if [[ ! -f $id_file ]]; then
   echo "0" > $id_file
fi

if [[ ! -f $us_file ]]; then
   echo "0" > $us_file
fi

#set variables
max_usage=10
id="$(cat $id_file)"
usage="$(cat $us_file)"

#if all ids used, exit script
if [[ $id -eq ${#ID[@]} ]]; then
   echo "No more ids available! Create new ones and delete '$id_file' and '$us_file' files."
   exit
fi

if [[ $usage -lt $max_usage ]]; then
   usage="$(( $(cat $us_file) + 1 ))"
   echo $usage > $us_file
   # do your stuff
   echo "Your id is: ${ID[$id]}."
else
   #reset usage and change (use next) id
   usage="1"
   echo "1" > $us_file
   id=$((id+1))
   echo "$id" > $id_file
   if [[ $id -lt ${#ID[@]} ]]; then
      echo "Your id x is: ${ID[$id]}."
   else
      echo "No more ids available! Create new ones and delete '$id_file' and '$us_file' files."
   fi
fi

관련 정보