Dynamic substitution of variables in bash The 2019 Stack Overflow Developer Survey Results Are...

Deal with toxic manager when you can't quit

Output the Arecibo Message

Why can't devices on different VLANs, but on the same subnet, communicate?

Can you cast a spell on someone in the Ethereal Plane, if you are on the Material Plane and have the True Seeing spell active?

Can there be female White Walkers?

Are spiders unable to hurt humans, especially very small spiders?

What to do when moving next to a bird sanctuary with a loosely-domesticated cat?

How come people say “Would of”?

Did Scotland spend $250,000 for the slogan "Welcome to Scotland"?

What is this business jet?

Why does the nucleus not repel itself?

If a sorcerer casts the Banishment spell on a PC while in Avernus, does the PC return to their home plane?

How to notate time signature switching consistently every measure

Is bread bad for ducks?

Does adding complexity mean a more secure cipher?

Inverse Relationship Between Precision and Recall

Why didn't the Event Horizon Telescope team mention Sagittarius A*?

How did passengers keep warm on sail ships?

Why doesn't shell automatically fix "useless use of cat"?

Why not take a picture of a closer black hole?

For what reasons would an animal species NOT cross a *horizontal* land bridge?

Pokemon Turn Based battle (Python)

Likelihood that a superbug or lethal virus could come from a landfill

If I score a critical hit on an 18 or higher, what are my chances of getting a critical hit if I roll 3d20?



Dynamic substitution of variables in bash



The 2019 Stack Overflow Developer Survey Results Are InHow to insert bash variables in awk?Joining bash arguments into single string with spacesDouble variable substitution in bashHow to generate dynamic menu and make it usable?Can't pipe from echo to bash built-in read?How can I evaluate bash arguments in a string once variables have changedHow can I change a Bash variable name in a loop and then expand the changed name?Creating n variables in Bash without assigning them one by one?bash share array in “for do () & wait” loopHow can I export a variable in bash where the variable name is comprised of two variables?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}







1















Honestly I don't even know how to ask this, or what are the proper terms lol



So what I'm trying to do, is to work on variables with variable names. I think I'd best describe it by actually showing it:
So what I had before was this



if [ -z ${file_var} ]; then
echo "empty argument"
fi
if [ -z ${pw_var} ]; then
echo "empty argument"
fi


So what I was trying to do was not have two if statements, but have just one and a for loop, something like this:



for i in file_var, pw_var;do
if [ -z ${${i}} ]; then
echo "empty argument"
fi
done


Now this obviously doesn't work, so I'm wondering how is it properly done.










share|improve this question





























    1















    Honestly I don't even know how to ask this, or what are the proper terms lol



    So what I'm trying to do, is to work on variables with variable names. I think I'd best describe it by actually showing it:
    So what I had before was this



    if [ -z ${file_var} ]; then
    echo "empty argument"
    fi
    if [ -z ${pw_var} ]; then
    echo "empty argument"
    fi


    So what I was trying to do was not have two if statements, but have just one and a for loop, something like this:



    for i in file_var, pw_var;do
    if [ -z ${${i}} ]; then
    echo "empty argument"
    fi
    done


    Now this obviously doesn't work, so I'm wondering how is it properly done.










    share|improve this question

























      1












      1








      1








      Honestly I don't even know how to ask this, or what are the proper terms lol



      So what I'm trying to do, is to work on variables with variable names. I think I'd best describe it by actually showing it:
      So what I had before was this



      if [ -z ${file_var} ]; then
      echo "empty argument"
      fi
      if [ -z ${pw_var} ]; then
      echo "empty argument"
      fi


      So what I was trying to do was not have two if statements, but have just one and a for loop, something like this:



      for i in file_var, pw_var;do
      if [ -z ${${i}} ]; then
      echo "empty argument"
      fi
      done


      Now this obviously doesn't work, so I'm wondering how is it properly done.










      share|improve this question














      Honestly I don't even know how to ask this, or what are the proper terms lol



      So what I'm trying to do, is to work on variables with variable names. I think I'd best describe it by actually showing it:
      So what I had before was this



      if [ -z ${file_var} ]; then
      echo "empty argument"
      fi
      if [ -z ${pw_var} ]; then
      echo "empty argument"
      fi


      So what I was trying to do was not have two if statements, but have just one and a for loop, something like this:



      for i in file_var, pw_var;do
      if [ -z ${${i}} ]; then
      echo "empty argument"
      fi
      done


      Now this obviously doesn't work, so I'm wondering how is it properly done.







      bash






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 4 hours ago









      user323587user323587

      562




      562






















          2 Answers
          2






          active

          oldest

          votes


















          3














          What you're trying to do is indirect expansion, which Bash supports using !:



          if [ -z "${!i}" ] ; then



          If the first character of parameter is an exclamation point (!), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.




          In this case, "${!i}" expands to whatever the value of the variable whose name is stored in i, and -z will test that indirectly-accessed value.





          Alternatively, a nameref is a special type of variable that has this behaviour automatically. You make a nameref variable using declare -n name, and thereafter




          All references, assignments, and attribute modifications to name, except for those using or changing the -n attribute itself, are performed on the variable referenced by name’s value.




          So if you add



          declare -n i


          before your loop, it will mean that just



          for i in file_var pw_var
          do
          if [ -z "$i" ]
          then
          ...
          fi
          done


          will work as you wanted. Do note though that assignments to i (as opposed to its being set in a loop like this) will modify the target variable.





          Note also that there is no comma between items you're looping over in a Bash for loop like how you've written it in the question.






          share|improve this answer


























          • Thank you! That's exactly what I needed! Also thanks for the for loop tip :D

            – user323587
            4 hours ago



















          0














          This code works, if file_var or pw_var are empty it will print that the specific variable is empty. You can tweak it to fit your usage.



          file_var=""
          pw_var=""

          for i in 'file_var' 'pw_var';do
          if [ -z ${!i} ]; then
          echo "$i is empty"
          fi
          done





          share|improve this answer








          New contributor




          Bob Dole is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.





















            Your Answer








            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "106"
            };
            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',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            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%2funix.stackexchange.com%2fquestions%2f512008%2fdynamic-substitution-of-variables-in-bash%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            3














            What you're trying to do is indirect expansion, which Bash supports using !:



            if [ -z "${!i}" ] ; then



            If the first character of parameter is an exclamation point (!), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.




            In this case, "${!i}" expands to whatever the value of the variable whose name is stored in i, and -z will test that indirectly-accessed value.





            Alternatively, a nameref is a special type of variable that has this behaviour automatically. You make a nameref variable using declare -n name, and thereafter




            All references, assignments, and attribute modifications to name, except for those using or changing the -n attribute itself, are performed on the variable referenced by name’s value.




            So if you add



            declare -n i


            before your loop, it will mean that just



            for i in file_var pw_var
            do
            if [ -z "$i" ]
            then
            ...
            fi
            done


            will work as you wanted. Do note though that assignments to i (as opposed to its being set in a loop like this) will modify the target variable.





            Note also that there is no comma between items you're looping over in a Bash for loop like how you've written it in the question.






            share|improve this answer


























            • Thank you! That's exactly what I needed! Also thanks for the for loop tip :D

              – user323587
              4 hours ago
















            3














            What you're trying to do is indirect expansion, which Bash supports using !:



            if [ -z "${!i}" ] ; then



            If the first character of parameter is an exclamation point (!), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.




            In this case, "${!i}" expands to whatever the value of the variable whose name is stored in i, and -z will test that indirectly-accessed value.





            Alternatively, a nameref is a special type of variable that has this behaviour automatically. You make a nameref variable using declare -n name, and thereafter




            All references, assignments, and attribute modifications to name, except for those using or changing the -n attribute itself, are performed on the variable referenced by name’s value.




            So if you add



            declare -n i


            before your loop, it will mean that just



            for i in file_var pw_var
            do
            if [ -z "$i" ]
            then
            ...
            fi
            done


            will work as you wanted. Do note though that assignments to i (as opposed to its being set in a loop like this) will modify the target variable.





            Note also that there is no comma between items you're looping over in a Bash for loop like how you've written it in the question.






            share|improve this answer


























            • Thank you! That's exactly what I needed! Also thanks for the for loop tip :D

              – user323587
              4 hours ago














            3












            3








            3







            What you're trying to do is indirect expansion, which Bash supports using !:



            if [ -z "${!i}" ] ; then



            If the first character of parameter is an exclamation point (!), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.




            In this case, "${!i}" expands to whatever the value of the variable whose name is stored in i, and -z will test that indirectly-accessed value.





            Alternatively, a nameref is a special type of variable that has this behaviour automatically. You make a nameref variable using declare -n name, and thereafter




            All references, assignments, and attribute modifications to name, except for those using or changing the -n attribute itself, are performed on the variable referenced by name’s value.




            So if you add



            declare -n i


            before your loop, it will mean that just



            for i in file_var pw_var
            do
            if [ -z "$i" ]
            then
            ...
            fi
            done


            will work as you wanted. Do note though that assignments to i (as opposed to its being set in a loop like this) will modify the target variable.





            Note also that there is no comma between items you're looping over in a Bash for loop like how you've written it in the question.






            share|improve this answer















            What you're trying to do is indirect expansion, which Bash supports using !:



            if [ -z "${!i}" ] ; then



            If the first character of parameter is an exclamation point (!), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new parameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.




            In this case, "${!i}" expands to whatever the value of the variable whose name is stored in i, and -z will test that indirectly-accessed value.





            Alternatively, a nameref is a special type of variable that has this behaviour automatically. You make a nameref variable using declare -n name, and thereafter




            All references, assignments, and attribute modifications to name, except for those using or changing the -n attribute itself, are performed on the variable referenced by name’s value.




            So if you add



            declare -n i


            before your loop, it will mean that just



            for i in file_var pw_var
            do
            if [ -z "$i" ]
            then
            ...
            fi
            done


            will work as you wanted. Do note though that assignments to i (as opposed to its being set in a loop like this) will modify the target variable.





            Note also that there is no comma between items you're looping over in a Bash for loop like how you've written it in the question.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 4 hours ago

























            answered 4 hours ago









            Michael HomerMichael Homer

            50.8k8141177




            50.8k8141177













            • Thank you! That's exactly what I needed! Also thanks for the for loop tip :D

              – user323587
              4 hours ago



















            • Thank you! That's exactly what I needed! Also thanks for the for loop tip :D

              – user323587
              4 hours ago

















            Thank you! That's exactly what I needed! Also thanks for the for loop tip :D

            – user323587
            4 hours ago





            Thank you! That's exactly what I needed! Also thanks for the for loop tip :D

            – user323587
            4 hours ago













            0














            This code works, if file_var or pw_var are empty it will print that the specific variable is empty. You can tweak it to fit your usage.



            file_var=""
            pw_var=""

            for i in 'file_var' 'pw_var';do
            if [ -z ${!i} ]; then
            echo "$i is empty"
            fi
            done





            share|improve this answer








            New contributor




            Bob Dole is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.

























              0














              This code works, if file_var or pw_var are empty it will print that the specific variable is empty. You can tweak it to fit your usage.



              file_var=""
              pw_var=""

              for i in 'file_var' 'pw_var';do
              if [ -z ${!i} ]; then
              echo "$i is empty"
              fi
              done





              share|improve this answer








              New contributor




              Bob Dole is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
              Check out our Code of Conduct.























                0












                0








                0







                This code works, if file_var or pw_var are empty it will print that the specific variable is empty. You can tweak it to fit your usage.



                file_var=""
                pw_var=""

                for i in 'file_var' 'pw_var';do
                if [ -z ${!i} ]; then
                echo "$i is empty"
                fi
                done





                share|improve this answer








                New contributor




                Bob Dole is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.










                This code works, if file_var or pw_var are empty it will print that the specific variable is empty. You can tweak it to fit your usage.



                file_var=""
                pw_var=""

                for i in 'file_var' 'pw_var';do
                if [ -z ${!i} ]; then
                echo "$i is empty"
                fi
                done






                share|improve this answer








                New contributor




                Bob Dole is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                share|improve this answer



                share|improve this answer






                New contributor




                Bob Dole is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                answered 4 hours ago









                Bob DoleBob Dole

                661




                661




                New contributor




                Bob Dole is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.





                New contributor





                Bob Dole is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.






                Bob Dole is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Unix & Linux Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f512008%2fdynamic-substitution-of-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

                    “%fieldName is a required field.”, in Magento2 REST API Call for GET Method Type The Next...

                    How to change City field to a dropdown in Checkout step Magento 2Magento 2 : How to change UI field(s)...

                    夢乃愛華...