Home > Software design >  Use a set of variables that start with the same string in bash
Use a set of variables that start with the same string in bash

Time:09-16

I know something like this is possible with DOS but I am not sure how to do it within bash.

I am writing a script that takes some configuration data: source, name, and destination. There will be a variable number of these in the configuration. I need to iterate over each set.

So, for example:

#!/bin/bash

FOLDER_1_SOURCE="/path/one"
FOLDER_1_NAME="one"
FOLDER_1_DESTINATION="one"

FOLDER_2_SOURCE="/path/two two"
FOLDER_2_NAME="two"
FOLDER_2_DESTINATION="here"

FOLDER_3_SOURCE="/something/random"
FOLDER_3_NAME="bravo"
FOLDER_3_DESTINATION="there"

FOLDER_..._SOURCE="/something/random"
FOLDER_..._NAME="bravo"
FOLDER_..._DESTINATION=""

FOLDER_X_SOURCE="/something/random"
FOLDER_X_NAME="bravo"
FOLDER_X_DESTINATION=""

Then I want to iterate over each set and get the SOURCE and NAME values for each set.

I am not stuck on this format. I just don't know how else to do this. The end goal is that I have 1 or more set of variables with source, name, and destination and then I need to iterate over them.

CodePudding user response:

AFIK bash does not have a facility to list all variables. A workaround - which also would mimic what is going on in DOS - is to use environment variables and restrict your search to those. In this case, you could do a

printenv|grep ^FOLDER||cut -d = -f 1

This is the same as doing in Windows CMD shell a

SET FOLDER

CodePudding user response:

The answer to this type of question is nearly always "use arrays".

declare -a folder_source folder_name folder_dest

folder_source[1]="/path/one"
folder_name[1]="one"
folder_dest[1]="one"

folder_source[2]="/path/two two"
folder_name[2]="two"
folder_dest[2]="here"

folder_source[3]="/something/random"
folder_name[3]="bravo"
folder_dest[3]="there"

folder_source[4]="/something/random"
folder_name[4]="bravo"
folder_dest[4]=""

for((i=1; i<=${#folder_source[@]};   i)); do
    echo "$i source:" "${folder_source[$i]}"
    echo "$i name:" "${folder_name[$i]}"
    echo "$i destination:" "${folder_dest[$i]}"
done

Demo: https://ideone.com/gZn0wH

Bash array indices are zero-based, but we just leave the zeroth slot unused here for convenience.

Tangentially, avoid upper case for your private variables.

  • Related