Assigning value to a variable only if argv specified in TCL












0














I am new to the TCL scripting .I have a script called "Sample.tcl". In the Sample.tcl I have a variable called $name. How can I assign a value to the variable if there exist a specific argv i.e.



Sample.tcl -step xyz 


Only if I specify -step then $name should be xyz.










share|improve this question




















  • 1




    Have you tried anything yet? You are on the right track with argv. Have you tried using set in the script?
    – Jerry
    Nov 20 '18 at 9:41
















0














I am new to the TCL scripting .I have a script called "Sample.tcl". In the Sample.tcl I have a variable called $name. How can I assign a value to the variable if there exist a specific argv i.e.



Sample.tcl -step xyz 


Only if I specify -step then $name should be xyz.










share|improve this question




















  • 1




    Have you tried anything yet? You are on the right track with argv. Have you tried using set in the script?
    – Jerry
    Nov 20 '18 at 9:41














0












0








0







I am new to the TCL scripting .I have a script called "Sample.tcl". In the Sample.tcl I have a variable called $name. How can I assign a value to the variable if there exist a specific argv i.e.



Sample.tcl -step xyz 


Only if I specify -step then $name should be xyz.










share|improve this question















I am new to the TCL scripting .I have a script called "Sample.tcl". In the Sample.tcl I have a variable called $name. How can I assign a value to the variable if there exist a specific argv i.e.



Sample.tcl -step xyz 


Only if I specify -step then $name should be xyz.







tcl






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 20 '18 at 9:53









Donal Fellows

101k15112172




101k15112172










asked Nov 20 '18 at 9:27









varun kumar

1




1








  • 1




    Have you tried anything yet? You are on the right track with argv. Have you tried using set in the script?
    – Jerry
    Nov 20 '18 at 9:41














  • 1




    Have you tried anything yet? You are on the right track with argv. Have you tried using set in the script?
    – Jerry
    Nov 20 '18 at 9:41








1




1




Have you tried anything yet? You are on the right track with argv. Have you tried using set in the script?
– Jerry
Nov 20 '18 at 9:41




Have you tried anything yet? You are on the right track with argv. Have you tried using set in the script?
– Jerry
Nov 20 '18 at 9:41












2 Answers
2






active

oldest

votes


















0














I'm not sure what $name might be in this context (it's a really unusual name for a variable, and using variable variable names is typically a bad idea) but under the guess that you're trying to set step to xyz in this case, you can put this in your script:



apply {{} {
# For each pair of values in the arguments (after the script name)
global argv
foreach {key value} $argv {
# Safety-check: if the key starts with a hyphen...
if {[string match -* $key]} {
# ... strip the leading hyphen(s)
set varname [string trimleft $key "-"]
# ... bind that global var name to a local name
upvar 1 $varname var
# ... and set the variable to the value we've got.
set var $value
}
}
}}


It's done in an apply so that we don't pollute the global namespace with all our working variables (key, value, varname and var) and because we don't really need to make a procedure for something we're only going to do once.



This isn't a safe piece of code, not by any means, but it is a useful and flexible way to get something working.





In general, parsing command line arguments can take quite a bit of thought to get perfectly right and there's various packages to help out, but that's only really important when writing code for other people to run. When it's just for yourself, you can be a lot sloppier and get the job done in a few minutes.






share|improve this answer





























    0














    Using the cmdline package from tcllib you could write:



    #!/usr/bin/env tclsh

    package require cmdline

    set options {
    {step.arg "" "Set the step value"}
    }

    try {
    array set params [cmdline::getoptions argv $options]
    } on error e {
    puts stderr $e
    exit 1
    }

    if {$params(step) ne ""} {
    set name $params(step)
    }

    if {[info exists name]} {
    puts "name = $name"
    } else {
    puts "name is not set"
    }





    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',
      autoActivateHeartbeat: false,
      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%2f53389887%2fassigning-value-to-a-variable-only-if-argv-specified-in-tcl%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









      0














      I'm not sure what $name might be in this context (it's a really unusual name for a variable, and using variable variable names is typically a bad idea) but under the guess that you're trying to set step to xyz in this case, you can put this in your script:



      apply {{} {
      # For each pair of values in the arguments (after the script name)
      global argv
      foreach {key value} $argv {
      # Safety-check: if the key starts with a hyphen...
      if {[string match -* $key]} {
      # ... strip the leading hyphen(s)
      set varname [string trimleft $key "-"]
      # ... bind that global var name to a local name
      upvar 1 $varname var
      # ... and set the variable to the value we've got.
      set var $value
      }
      }
      }}


      It's done in an apply so that we don't pollute the global namespace with all our working variables (key, value, varname and var) and because we don't really need to make a procedure for something we're only going to do once.



      This isn't a safe piece of code, not by any means, but it is a useful and flexible way to get something working.





      In general, parsing command line arguments can take quite a bit of thought to get perfectly right and there's various packages to help out, but that's only really important when writing code for other people to run. When it's just for yourself, you can be a lot sloppier and get the job done in a few minutes.






      share|improve this answer


























        0














        I'm not sure what $name might be in this context (it's a really unusual name for a variable, and using variable variable names is typically a bad idea) but under the guess that you're trying to set step to xyz in this case, you can put this in your script:



        apply {{} {
        # For each pair of values in the arguments (after the script name)
        global argv
        foreach {key value} $argv {
        # Safety-check: if the key starts with a hyphen...
        if {[string match -* $key]} {
        # ... strip the leading hyphen(s)
        set varname [string trimleft $key "-"]
        # ... bind that global var name to a local name
        upvar 1 $varname var
        # ... and set the variable to the value we've got.
        set var $value
        }
        }
        }}


        It's done in an apply so that we don't pollute the global namespace with all our working variables (key, value, varname and var) and because we don't really need to make a procedure for something we're only going to do once.



        This isn't a safe piece of code, not by any means, but it is a useful and flexible way to get something working.





        In general, parsing command line arguments can take quite a bit of thought to get perfectly right and there's various packages to help out, but that's only really important when writing code for other people to run. When it's just for yourself, you can be a lot sloppier and get the job done in a few minutes.






        share|improve this answer
























          0












          0








          0






          I'm not sure what $name might be in this context (it's a really unusual name for a variable, and using variable variable names is typically a bad idea) but under the guess that you're trying to set step to xyz in this case, you can put this in your script:



          apply {{} {
          # For each pair of values in the arguments (after the script name)
          global argv
          foreach {key value} $argv {
          # Safety-check: if the key starts with a hyphen...
          if {[string match -* $key]} {
          # ... strip the leading hyphen(s)
          set varname [string trimleft $key "-"]
          # ... bind that global var name to a local name
          upvar 1 $varname var
          # ... and set the variable to the value we've got.
          set var $value
          }
          }
          }}


          It's done in an apply so that we don't pollute the global namespace with all our working variables (key, value, varname and var) and because we don't really need to make a procedure for something we're only going to do once.



          This isn't a safe piece of code, not by any means, but it is a useful and flexible way to get something working.





          In general, parsing command line arguments can take quite a bit of thought to get perfectly right and there's various packages to help out, but that's only really important when writing code for other people to run. When it's just for yourself, you can be a lot sloppier and get the job done in a few minutes.






          share|improve this answer












          I'm not sure what $name might be in this context (it's a really unusual name for a variable, and using variable variable names is typically a bad idea) but under the guess that you're trying to set step to xyz in this case, you can put this in your script:



          apply {{} {
          # For each pair of values in the arguments (after the script name)
          global argv
          foreach {key value} $argv {
          # Safety-check: if the key starts with a hyphen...
          if {[string match -* $key]} {
          # ... strip the leading hyphen(s)
          set varname [string trimleft $key "-"]
          # ... bind that global var name to a local name
          upvar 1 $varname var
          # ... and set the variable to the value we've got.
          set var $value
          }
          }
          }}


          It's done in an apply so that we don't pollute the global namespace with all our working variables (key, value, varname and var) and because we don't really need to make a procedure for something we're only going to do once.



          This isn't a safe piece of code, not by any means, but it is a useful and flexible way to get something working.





          In general, parsing command line arguments can take quite a bit of thought to get perfectly right and there's various packages to help out, but that's only really important when writing code for other people to run. When it's just for yourself, you can be a lot sloppier and get the job done in a few minutes.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 20 '18 at 10:05









          Donal Fellows

          101k15112172




          101k15112172

























              0














              Using the cmdline package from tcllib you could write:



              #!/usr/bin/env tclsh

              package require cmdline

              set options {
              {step.arg "" "Set the step value"}
              }

              try {
              array set params [cmdline::getoptions argv $options]
              } on error e {
              puts stderr $e
              exit 1
              }

              if {$params(step) ne ""} {
              set name $params(step)
              }

              if {[info exists name]} {
              puts "name = $name"
              } else {
              puts "name is not set"
              }





              share|improve this answer


























                0














                Using the cmdline package from tcllib you could write:



                #!/usr/bin/env tclsh

                package require cmdline

                set options {
                {step.arg "" "Set the step value"}
                }

                try {
                array set params [cmdline::getoptions argv $options]
                } on error e {
                puts stderr $e
                exit 1
                }

                if {$params(step) ne ""} {
                set name $params(step)
                }

                if {[info exists name]} {
                puts "name = $name"
                } else {
                puts "name is not set"
                }





                share|improve this answer
























                  0












                  0








                  0






                  Using the cmdline package from tcllib you could write:



                  #!/usr/bin/env tclsh

                  package require cmdline

                  set options {
                  {step.arg "" "Set the step value"}
                  }

                  try {
                  array set params [cmdline::getoptions argv $options]
                  } on error e {
                  puts stderr $e
                  exit 1
                  }

                  if {$params(step) ne ""} {
                  set name $params(step)
                  }

                  if {[info exists name]} {
                  puts "name = $name"
                  } else {
                  puts "name is not set"
                  }





                  share|improve this answer












                  Using the cmdline package from tcllib you could write:



                  #!/usr/bin/env tclsh

                  package require cmdline

                  set options {
                  {step.arg "" "Set the step value"}
                  }

                  try {
                  array set params [cmdline::getoptions argv $options]
                  } on error e {
                  puts stderr $e
                  exit 1
                  }

                  if {$params(step) ne ""} {
                  set name $params(step)
                  }

                  if {[info exists name]} {
                  puts "name = $name"
                  } else {
                  puts "name is not set"
                  }






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 20 '18 at 14:05









                  glenn jackman

                  165k26143234




                  165k26143234






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • 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.





                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                      Please pay close attention to the following guidance:


                      • 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%2fstackoverflow.com%2fquestions%2f53389887%2fassigning-value-to-a-variable-only-if-argv-specified-in-tcl%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

                      "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

                      If I really need a card on my start hand, how many mulligans make sense? [duplicate]

                      Alcedinidae