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

Why doesn't UInt have a toDouble()?

Correct punctuation for showing a character's confusion

Can an undergraduate be advised by a professor who is very far away?

Pokemon Turn Based battle (Python)

The difference between dialogue marks

How to charge AirPods to keep battery healthy?

Is Cinnamon a desktop environment or a window manager? (Or both?)

How can I define good in a religion that claims no moral authority?

Why couldn't they take pictures of a closer black hole?

Can we generate random numbers using irrational numbers like π and e?

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

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

Does adding complexity mean a more secure cipher?

Is it okay to consider publishing in my first year of PhD?

If my opponent casts Ultimate Price on my Phantasmal Bear, can I save it by casting Snap or Curfew?

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

What is preventing me from simply constructing a hash that's lower than the current target?

What does もの mean in this sentence?

Falsification in Math vs Science

Button changing its text & action. Good or terrible?

What do these terms in Caesar's Gallic Wars mean?

Getting crown tickets for Statue of Liberty

How to translate "being like"?

Why isn't the circumferential light around the M87 black hole's event horizon symmetric?



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;
}







0















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





























    0















    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

























      0












      0








      0








      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

      542




      542






















          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

                    Why do type traits not work with types in namespace scope?What are POD types in C++?Why can templates only be...

                    Will tsunami waves travel forever if there was no land?Why do tsunami waves begin with the water flowing away...

                    Should I use Docker or LXD?How to cache (more) data on SSD/RAM to avoid spin up?Unable to get Windows File...