achille
achille

Reputation: 315

fill variable from bash menu

Here is a pretty straight forward menu:

VAR=""
PS3='Make a selection: '
options=("opt 1" "opt 2" "opt 3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "opt 1")
            echo "opt 1 selected"
            ;;
        "opt 2")
            echo "opt 2 selected"
            ;;
        "opt 3")
            echo "opt 3 selected"
            ;;
        "Quit")
            break
            ;;
        *) echo "invalid option $REPLY";;
    esac
done

I would like for each option to add the following: for instance if "opt 1" is selected:

[[ $(VAR) ]] && VAR="${VAR}\|123" || VAR=123

for "opt 2", 456

for "opt 3", 789

At the end, we should have: VAR=123\|789 if "opt 1" and "opt 3" have been choosen

or VAR=789 if only "opt 3" have been choosen.

The issue I am facing with is that my syntax to populate VAR does not work: VAR stays empty after having exited menu.

Thanx folks!

Upvotes: 0

Views: 860

Answers (2)

Bayou
Bayou

Reputation: 3451

Hope this helps you a little. It's less programming than with a case in it.

#! /bin/bash

VAR=""

# Declare options and values for options
declare -A OPTIONS
OPTIONS[opt 1]="123"
OPTIONS[opt 2]="456"
OPTIONS[opt 3]="789"

echo "Options: ${!OPTIONS[@]}"
while read -r -p "Make a selection: " opt; do

        # If opt becomes quit or Quit, break from loop.
        ! [[ $opt =~ (Q|q)uit ]] || break

        if [[ ${OPTIONS[$opt]}x == "x" ]]; then
                echo "$opt unknown"
        else
                VAR+=${OPTIONS[$opt]}
        fi
done

echo $VAR
exit 0

Upvotes: 1

vsergi
vsergi

Reputation: 785

Following your approach.

You are missing to export the variable VAR in order to be available once the script has been executed.

VAR=""
PS3='Make a selection: '
options=("opt 1" "opt 2" "opt 3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "opt 1")
            echo "opt 1 selected"
            VAR="${VAR}\|123"
            ;;
        "opt 2")
            echo "opt 2 selected"
           VAR="${VAR}\|456"
            ;;
        "opt 3")
            echo "opt 3 selected"
           VAR="${VAR}\|789"
            ;;
        "Quit")
            break
            ;;
        *) echo "invalid option $REPLY"
                echo $VAR ;;
    esac
done
export VAR

However, export only applies to child-processes. As workaround, you can execute the script as . test.sh

Example of output:

[10:08:18][/]# . test.sh
1) opt 1
2) opt 2
3) opt 3
4) Quit
Make a selection: 1
opt 1 selected
Make a selection: 2
opt 2 selected
Make a selection: 4
[10:08:18][/]#echo $VAR
\|123\|456

You can modify the way to assign the value of the variable for having the desired output.

By adding the dot as way of execution, you are sourcing the variable. More information here: Export variable from bash

Upvotes: 2

Related Questions