How to iterate through a set of variables, then expand the variables in Bash











up vote
0
down vote

favorite












I'm trying to set up a "check if machines are online" script with Bash, but running into an issue of when and where to define the variables so they're expanded properly. Something like:



#!/bin/bash
rm01="c01 c02 c03"
rm02="d01 d02 d03"
rm10="e11 e22 e33"
for room in rm01 rm02 rm03; do
echo $room
for computer in $room; do
#run various nslookup/ping tests and report
done
done
exit 0


I'm running into issues because I can't find a way to expand $room for its corresponding set of computers (in $rm01, $rm02, $rm10) listed at the beginning.



What am I doing wrong?










share|improve this question




























    up vote
    0
    down vote

    favorite












    I'm trying to set up a "check if machines are online" script with Bash, but running into an issue of when and where to define the variables so they're expanded properly. Something like:



    #!/bin/bash
    rm01="c01 c02 c03"
    rm02="d01 d02 d03"
    rm10="e11 e22 e33"
    for room in rm01 rm02 rm03; do
    echo $room
    for computer in $room; do
    #run various nslookup/ping tests and report
    done
    done
    exit 0


    I'm running into issues because I can't find a way to expand $room for its corresponding set of computers (in $rm01, $rm02, $rm10) listed at the beginning.



    What am I doing wrong?










    share|improve this question


























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I'm trying to set up a "check if machines are online" script with Bash, but running into an issue of when and where to define the variables so they're expanded properly. Something like:



      #!/bin/bash
      rm01="c01 c02 c03"
      rm02="d01 d02 d03"
      rm10="e11 e22 e33"
      for room in rm01 rm02 rm03; do
      echo $room
      for computer in $room; do
      #run various nslookup/ping tests and report
      done
      done
      exit 0


      I'm running into issues because I can't find a way to expand $room for its corresponding set of computers (in $rm01, $rm02, $rm10) listed at the beginning.



      What am I doing wrong?










      share|improve this question















      I'm trying to set up a "check if machines are online" script with Bash, but running into an issue of when and where to define the variables so they're expanded properly. Something like:



      #!/bin/bash
      rm01="c01 c02 c03"
      rm02="d01 d02 d03"
      rm10="e11 e22 e33"
      for room in rm01 rm02 rm03; do
      echo $room
      for computer in $room; do
      #run various nslookup/ping tests and report
      done
      done
      exit 0


      I'm running into issues because I can't find a way to expand $room for its corresponding set of computers (in $rm01, $rm02, $rm10) listed at the beginning.



      What am I doing wrong?







      bash variables iteration






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 3 hours ago









      Benjamin W.

      19.7k124554




      19.7k124554










      asked 4 hours ago









      phonedog365

      133




      133
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          1
          down vote



          accepted










          The quick fix is to use variable indirection:



          for computer in ${!room}; do


          Relying on word splitting is rarely the best idea, though. You could use arrays and namerefs instead (requires Bash 4.3 or newer):



          #!/usr/bin/env bash

          # Declare arrays
          rm01=(c01 c02 c03)
          rm02=(d01 d02 d03)
          rm03=(e11 e22 e33)

          # Declare room as nameref
          declare -n room

          # Using nameref as control variable sets room as reference to each variable in turn
          for room in rm{01..03}; do
          # Properly quoted array expansion
          for computer in "${room[@]}"; do
          echo "$computer" # or whatever needs to be done
          done
          done
          exit 0





          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














             

            draft saved


            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53415559%2fhow-to-iterate-through-a-set-of-variables-then-expand-the-variables-in-bash%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            1
            down vote



            accepted










            The quick fix is to use variable indirection:



            for computer in ${!room}; do


            Relying on word splitting is rarely the best idea, though. You could use arrays and namerefs instead (requires Bash 4.3 or newer):



            #!/usr/bin/env bash

            # Declare arrays
            rm01=(c01 c02 c03)
            rm02=(d01 d02 d03)
            rm03=(e11 e22 e33)

            # Declare room as nameref
            declare -n room

            # Using nameref as control variable sets room as reference to each variable in turn
            for room in rm{01..03}; do
            # Properly quoted array expansion
            for computer in "${room[@]}"; do
            echo "$computer" # or whatever needs to be done
            done
            done
            exit 0





            share|improve this answer



























              up vote
              1
              down vote



              accepted










              The quick fix is to use variable indirection:



              for computer in ${!room}; do


              Relying on word splitting is rarely the best idea, though. You could use arrays and namerefs instead (requires Bash 4.3 or newer):



              #!/usr/bin/env bash

              # Declare arrays
              rm01=(c01 c02 c03)
              rm02=(d01 d02 d03)
              rm03=(e11 e22 e33)

              # Declare room as nameref
              declare -n room

              # Using nameref as control variable sets room as reference to each variable in turn
              for room in rm{01..03}; do
              # Properly quoted array expansion
              for computer in "${room[@]}"; do
              echo "$computer" # or whatever needs to be done
              done
              done
              exit 0





              share|improve this answer

























                up vote
                1
                down vote



                accepted







                up vote
                1
                down vote



                accepted






                The quick fix is to use variable indirection:



                for computer in ${!room}; do


                Relying on word splitting is rarely the best idea, though. You could use arrays and namerefs instead (requires Bash 4.3 or newer):



                #!/usr/bin/env bash

                # Declare arrays
                rm01=(c01 c02 c03)
                rm02=(d01 d02 d03)
                rm03=(e11 e22 e33)

                # Declare room as nameref
                declare -n room

                # Using nameref as control variable sets room as reference to each variable in turn
                for room in rm{01..03}; do
                # Properly quoted array expansion
                for computer in "${room[@]}"; do
                echo "$computer" # or whatever needs to be done
                done
                done
                exit 0





                share|improve this answer














                The quick fix is to use variable indirection:



                for computer in ${!room}; do


                Relying on word splitting is rarely the best idea, though. You could use arrays and namerefs instead (requires Bash 4.3 or newer):



                #!/usr/bin/env bash

                # Declare arrays
                rm01=(c01 c02 c03)
                rm02=(d01 d02 d03)
                rm03=(e11 e22 e33)

                # Declare room as nameref
                declare -n room

                # Using nameref as control variable sets room as reference to each variable in turn
                for room in rm{01..03}; do
                # Properly quoted array expansion
                for computer in "${room[@]}"; do
                echo "$computer" # or whatever needs to be done
                done
                done
                exit 0






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited 3 hours ago

























                answered 3 hours ago









                Benjamin W.

                19.7k124554




                19.7k124554






























                     

                    draft saved


                    draft discarded



















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53415559%2fhow-to-iterate-through-a-set-of-variables-then-expand-the-variables-in-bash%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    What visual should I use to simply compare current year value vs last year in Power BI desktop

                    Alexandru Averescu

                    Trompette piccolo