Set variable conditionally on command line [duplicate]











up vote
3
down vote

favorite













This question already has an answer here:




  • How are parentheses interpreted at the command line?

    2 answers




I want to set a variable if my condition is true on my Ubuntu system.



This proves that my if-statement is correct:



$ (if [ 1 == 1 ]; then echo "hi there"; fi);
hi there


This proves that I can set variables:



$ a=1
$ echo $a
1


This shows that setting a variable in the if-statement DOES NOT work:



$ (if [ 1 == 1 ]; then a=2; fi);
$ echo $a
1


Any ideas why? All my google research indicates that it should work like this...










share|improve this question















marked as duplicate by RalfFriedl, Thomas, mosvy, Jeff Schaller, muru Nov 21 at 1:27


This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.



















    up vote
    3
    down vote

    favorite













    This question already has an answer here:




    • How are parentheses interpreted at the command line?

      2 answers




    I want to set a variable if my condition is true on my Ubuntu system.



    This proves that my if-statement is correct:



    $ (if [ 1 == 1 ]; then echo "hi there"; fi);
    hi there


    This proves that I can set variables:



    $ a=1
    $ echo $a
    1


    This shows that setting a variable in the if-statement DOES NOT work:



    $ (if [ 1 == 1 ]; then a=2; fi);
    $ echo $a
    1


    Any ideas why? All my google research indicates that it should work like this...










    share|improve this question















    marked as duplicate by RalfFriedl, Thomas, mosvy, Jeff Schaller, muru Nov 21 at 1:27


    This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

















      up vote
      3
      down vote

      favorite









      up vote
      3
      down vote

      favorite












      This question already has an answer here:




      • How are parentheses interpreted at the command line?

        2 answers




      I want to set a variable if my condition is true on my Ubuntu system.



      This proves that my if-statement is correct:



      $ (if [ 1 == 1 ]; then echo "hi there"; fi);
      hi there


      This proves that I can set variables:



      $ a=1
      $ echo $a
      1


      This shows that setting a variable in the if-statement DOES NOT work:



      $ (if [ 1 == 1 ]; then a=2; fi);
      $ echo $a
      1


      Any ideas why? All my google research indicates that it should work like this...










      share|improve this question
















      This question already has an answer here:




      • How are parentheses interpreted at the command line?

        2 answers




      I want to set a variable if my condition is true on my Ubuntu system.



      This proves that my if-statement is correct:



      $ (if [ 1 == 1 ]; then echo "hi there"; fi);
      hi there


      This proves that I can set variables:



      $ a=1
      $ echo $a
      1


      This shows that setting a variable in the if-statement DOES NOT work:



      $ (if [ 1 == 1 ]; then a=2; fi);
      $ echo $a
      1


      Any ideas why? All my google research indicates that it should work like this...





      This question already has an answer here:




      • How are parentheses interpreted at the command line?

        2 answers








      shell command-line






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 20 at 16:19









      Barmar

      6,8481122




      6,8481122










      asked Nov 20 at 13:33









      Ron

      1214




      1214




      marked as duplicate by RalfFriedl, Thomas, mosvy, Jeff Schaller, muru Nov 21 at 1:27


      This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.






      marked as duplicate by RalfFriedl, Thomas, mosvy, Jeff Schaller, muru Nov 21 at 1:27


      This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
























          3 Answers
          3






          active

          oldest

          votes

















          up vote
          10
          down vote



          accepted










          The (...) part of your command is your problem. The parentheses create a separate subshell. The subshell will inherit the environment from its parent shell, but variables set inside it will not retain their new values once the subshell exits. This also goes for any other changes to the environment inside the subshell, including changing directories, setting shell options etc.



          Therefore, remove the subshell:



          if [ 1 = 1 ]; then a=2; fi
          echo "$a"





          share|improve this answer






























            up vote
            5
            down vote













            This proves that setting a variable in a sub-shell has no lasting effect



            (if [ 1 == 1 ]; then a=2; fi);
            echo $a


            produces



            1


            same as



            (a=2)
            echo $a


            produces



            1


            Solution remove the parenthesis.



            if [ 1 == 1 ]; then a=2; fi;
            echo $a


            produces



            2


            or if you need a sub-shell



            (
            if [ 1 == 1 ]; then a=2; fi;
            echo $a
            )


            produces



            2





            share|improve this answer






























              up vote
              -2
              down vote













              It done by below method and it worked fine



              _example ~]# if [[ 1 == 1 ]]; then echo "praveen"; a=2; echo $a; fi| sed '1i================================n output'
              ================================
              output

              praveen
              2





              share|improve this answer



















              • 4




                Can you explain what the sed command is doing and why you are using it?
                – Kusalananda
                Nov 20 at 18:49






              • 1




                What does this add beyond Kusalananda's very similar, earlier answer and ctrl-alt-delor's earlier answer ?
                – Jeff Schaller
                Nov 20 at 22:37


















              3 Answers
              3






              active

              oldest

              votes








              3 Answers
              3






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes








              up vote
              10
              down vote



              accepted










              The (...) part of your command is your problem. The parentheses create a separate subshell. The subshell will inherit the environment from its parent shell, but variables set inside it will not retain their new values once the subshell exits. This also goes for any other changes to the environment inside the subshell, including changing directories, setting shell options etc.



              Therefore, remove the subshell:



              if [ 1 = 1 ]; then a=2; fi
              echo "$a"





              share|improve this answer



























                up vote
                10
                down vote



                accepted










                The (...) part of your command is your problem. The parentheses create a separate subshell. The subshell will inherit the environment from its parent shell, but variables set inside it will not retain their new values once the subshell exits. This also goes for any other changes to the environment inside the subshell, including changing directories, setting shell options etc.



                Therefore, remove the subshell:



                if [ 1 = 1 ]; then a=2; fi
                echo "$a"





                share|improve this answer

























                  up vote
                  10
                  down vote



                  accepted







                  up vote
                  10
                  down vote



                  accepted






                  The (...) part of your command is your problem. The parentheses create a separate subshell. The subshell will inherit the environment from its parent shell, but variables set inside it will not retain their new values once the subshell exits. This also goes for any other changes to the environment inside the subshell, including changing directories, setting shell options etc.



                  Therefore, remove the subshell:



                  if [ 1 = 1 ]; then a=2; fi
                  echo "$a"





                  share|improve this answer














                  The (...) part of your command is your problem. The parentheses create a separate subshell. The subshell will inherit the environment from its parent shell, but variables set inside it will not retain their new values once the subshell exits. This also goes for any other changes to the environment inside the subshell, including changing directories, setting shell options etc.



                  Therefore, remove the subshell:



                  if [ 1 = 1 ]; then a=2; fi
                  echo "$a"






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 20 at 18:50

























                  answered Nov 20 at 13:44









                  Kusalananda

                  119k16223364




                  119k16223364
























                      up vote
                      5
                      down vote













                      This proves that setting a variable in a sub-shell has no lasting effect



                      (if [ 1 == 1 ]; then a=2; fi);
                      echo $a


                      produces



                      1


                      same as



                      (a=2)
                      echo $a


                      produces



                      1


                      Solution remove the parenthesis.



                      if [ 1 == 1 ]; then a=2; fi;
                      echo $a


                      produces



                      2


                      or if you need a sub-shell



                      (
                      if [ 1 == 1 ]; then a=2; fi;
                      echo $a
                      )


                      produces



                      2





                      share|improve this answer



























                        up vote
                        5
                        down vote













                        This proves that setting a variable in a sub-shell has no lasting effect



                        (if [ 1 == 1 ]; then a=2; fi);
                        echo $a


                        produces



                        1


                        same as



                        (a=2)
                        echo $a


                        produces



                        1


                        Solution remove the parenthesis.



                        if [ 1 == 1 ]; then a=2; fi;
                        echo $a


                        produces



                        2


                        or if you need a sub-shell



                        (
                        if [ 1 == 1 ]; then a=2; fi;
                        echo $a
                        )


                        produces



                        2





                        share|improve this answer

























                          up vote
                          5
                          down vote










                          up vote
                          5
                          down vote









                          This proves that setting a variable in a sub-shell has no lasting effect



                          (if [ 1 == 1 ]; then a=2; fi);
                          echo $a


                          produces



                          1


                          same as



                          (a=2)
                          echo $a


                          produces



                          1


                          Solution remove the parenthesis.



                          if [ 1 == 1 ]; then a=2; fi;
                          echo $a


                          produces



                          2


                          or if you need a sub-shell



                          (
                          if [ 1 == 1 ]; then a=2; fi;
                          echo $a
                          )


                          produces



                          2





                          share|improve this answer














                          This proves that setting a variable in a sub-shell has no lasting effect



                          (if [ 1 == 1 ]; then a=2; fi);
                          echo $a


                          produces



                          1


                          same as



                          (a=2)
                          echo $a


                          produces



                          1


                          Solution remove the parenthesis.



                          if [ 1 == 1 ]; then a=2; fi;
                          echo $a


                          produces



                          2


                          or if you need a sub-shell



                          (
                          if [ 1 == 1 ]; then a=2; fi;
                          echo $a
                          )


                          produces



                          2






                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited Nov 20 at 14:12









                          Zanna

                          2,5161023




                          2,5161023










                          answered Nov 20 at 13:42









                          ctrl-alt-delor

                          10.4k41955




                          10.4k41955






















                              up vote
                              -2
                              down vote













                              It done by below method and it worked fine



                              _example ~]# if [[ 1 == 1 ]]; then echo "praveen"; a=2; echo $a; fi| sed '1i================================n output'
                              ================================
                              output

                              praveen
                              2





                              share|improve this answer



















                              • 4




                                Can you explain what the sed command is doing and why you are using it?
                                – Kusalananda
                                Nov 20 at 18:49






                              • 1




                                What does this add beyond Kusalananda's very similar, earlier answer and ctrl-alt-delor's earlier answer ?
                                – Jeff Schaller
                                Nov 20 at 22:37















                              up vote
                              -2
                              down vote













                              It done by below method and it worked fine



                              _example ~]# if [[ 1 == 1 ]]; then echo "praveen"; a=2; echo $a; fi| sed '1i================================n output'
                              ================================
                              output

                              praveen
                              2





                              share|improve this answer



















                              • 4




                                Can you explain what the sed command is doing and why you are using it?
                                – Kusalananda
                                Nov 20 at 18:49






                              • 1




                                What does this add beyond Kusalananda's very similar, earlier answer and ctrl-alt-delor's earlier answer ?
                                – Jeff Schaller
                                Nov 20 at 22:37













                              up vote
                              -2
                              down vote










                              up vote
                              -2
                              down vote









                              It done by below method and it worked fine



                              _example ~]# if [[ 1 == 1 ]]; then echo "praveen"; a=2; echo $a; fi| sed '1i================================n output'
                              ================================
                              output

                              praveen
                              2





                              share|improve this answer














                              It done by below method and it worked fine



                              _example ~]# if [[ 1 == 1 ]]; then echo "praveen"; a=2; echo $a; fi| sed '1i================================n output'
                              ================================
                              output

                              praveen
                              2






                              share|improve this answer














                              share|improve this answer



                              share|improve this answer








                              edited Nov 20 at 22:54









                              ilkkachu

                              54.3k782147




                              54.3k782147










                              answered Nov 20 at 18:19









                              Praveen Kumar BS

                              1,162138




                              1,162138








                              • 4




                                Can you explain what the sed command is doing and why you are using it?
                                – Kusalananda
                                Nov 20 at 18:49






                              • 1




                                What does this add beyond Kusalananda's very similar, earlier answer and ctrl-alt-delor's earlier answer ?
                                – Jeff Schaller
                                Nov 20 at 22:37














                              • 4




                                Can you explain what the sed command is doing and why you are using it?
                                – Kusalananda
                                Nov 20 at 18:49






                              • 1




                                What does this add beyond Kusalananda's very similar, earlier answer and ctrl-alt-delor's earlier answer ?
                                – Jeff Schaller
                                Nov 20 at 22:37








                              4




                              4




                              Can you explain what the sed command is doing and why you are using it?
                              – Kusalananda
                              Nov 20 at 18:49




                              Can you explain what the sed command is doing and why you are using it?
                              – Kusalananda
                              Nov 20 at 18:49




                              1




                              1




                              What does this add beyond Kusalananda's very similar, earlier answer and ctrl-alt-delor's earlier answer ?
                              – Jeff Schaller
                              Nov 20 at 22:37




                              What does this add beyond Kusalananda's very similar, earlier answer and ctrl-alt-delor's earlier answer ?
                              – Jeff Schaller
                              Nov 20 at 22:37



                              Popular posts from this blog

                              Aardman Animations

                              Are they similar matrix

                              “minimization” problem in Euclidean space related to orthonormal basis