How to allow only certain characters in a bash variable












2















I want to prompt the user to input a URL, but it can only contain A-Z, a-z, 0-9, &, ., /, =, _, -, :, and ?.



So, for example:



Enter URL:
$ http://youtube.com/watch?v=1234df_AQ-x
That URL is allowed.

Enter URL:
$ https://unix.stackexchange.com/$FAKEurl%🍺123
That URL is NOT allowed.


This is what I've come up with so far, but it doesn't seem to work correctly:



if [[ ! "${URL}" == *[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_/&?:.=]* ]]; then
echo "That URL is NOT allowed."
else
echo "That URL is allowed."
fi


Please note that the URLs I provided in the example are just examples. 
This script needs to work with all possible user input; it just can't contain characters other than the ones I specified earlier.



Using bash 3.2.57(1)-release under macOS High Sierra 10.13.6.










share|improve this question









New contributor




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

























    2















    I want to prompt the user to input a URL, but it can only contain A-Z, a-z, 0-9, &, ., /, =, _, -, :, and ?.



    So, for example:



    Enter URL:
    $ http://youtube.com/watch?v=1234df_AQ-x
    That URL is allowed.

    Enter URL:
    $ https://unix.stackexchange.com/$FAKEurl%🍺123
    That URL is NOT allowed.


    This is what I've come up with so far, but it doesn't seem to work correctly:



    if [[ ! "${URL}" == *[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_/&?:.=]* ]]; then
    echo "That URL is NOT allowed."
    else
    echo "That URL is allowed."
    fi


    Please note that the URLs I provided in the example are just examples. 
    This script needs to work with all possible user input; it just can't contain characters other than the ones I specified earlier.



    Using bash 3.2.57(1)-release under macOS High Sierra 10.13.6.










    share|improve this question









    New contributor




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























      2












      2








      2


      0






      I want to prompt the user to input a URL, but it can only contain A-Z, a-z, 0-9, &, ., /, =, _, -, :, and ?.



      So, for example:



      Enter URL:
      $ http://youtube.com/watch?v=1234df_AQ-x
      That URL is allowed.

      Enter URL:
      $ https://unix.stackexchange.com/$FAKEurl%🍺123
      That URL is NOT allowed.


      This is what I've come up with so far, but it doesn't seem to work correctly:



      if [[ ! "${URL}" == *[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_/&?:.=]* ]]; then
      echo "That URL is NOT allowed."
      else
      echo "That URL is allowed."
      fi


      Please note that the URLs I provided in the example are just examples. 
      This script needs to work with all possible user input; it just can't contain characters other than the ones I specified earlier.



      Using bash 3.2.57(1)-release under macOS High Sierra 10.13.6.










      share|improve this question









      New contributor




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












      I want to prompt the user to input a URL, but it can only contain A-Z, a-z, 0-9, &, ., /, =, _, -, :, and ?.



      So, for example:



      Enter URL:
      $ http://youtube.com/watch?v=1234df_AQ-x
      That URL is allowed.

      Enter URL:
      $ https://unix.stackexchange.com/$FAKEurl%🍺123
      That URL is NOT allowed.


      This is what I've come up with so far, but it doesn't seem to work correctly:



      if [[ ! "${URL}" == *[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_/&?:.=]* ]]; then
      echo "That URL is NOT allowed."
      else
      echo "That URL is allowed."
      fi


      Please note that the URLs I provided in the example are just examples. 
      This script needs to work with all possible user input; it just can't contain characters other than the ones I specified earlier.



      Using bash 3.2.57(1)-release under macOS High Sierra 10.13.6.







      bash text-processing osx variable






      share|improve this question









      New contributor




      leetbacoon 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 question









      New contributor




      leetbacoon 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 question




      share|improve this question








      edited 5 mins ago









      G-Man

      13.1k93465




      13.1k93465






      New contributor




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









      asked 3 hours ago









      leetbacoonleetbacoon

      112




      112




      New contributor




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





      New contributor





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






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






















          3 Answers
          3






          active

          oldest

          votes


















          1














          Another way is with a plain case statement:



          #!/bin/sh

          case $URL in
          (*[^A-Za-z0-9&./=_:?-]*) echo not allowed;;
          (*) echo allowed;;
          esac


          The basic idea is to invert the logic and ask if there are any characters in the argument that are not in the allowed range.






          share|improve this answer































            1














            Your attempt



            Your attempt might not work as expected because it considers all URLs as allowed that contain at least one of the allowed characters. Formally, you compare the URL with



            <anything><allowed_character><anything>


            If this does not match, you reject the URL.



            This might help



            If you replace your if ... else ... fi by



            if [[ "${URL}" =~ [^A-Za-z0-9&./=_-:?] ]]; then
            echo "That URL is NOT allowed."
            else
            echo "That URL is allowed."
            fi


            it might do what you want.



            Here, the binary operator =~ is used to find a match of the regular expression [^A-Za-z0-9&./=_-:?] within "${URL}". This operator does not require that the whole string "${URL}" matches the regular expression, any matching substring will do. Such a match is found for any character that is not allowed in the URL. The "not" comes from the leading caret (^) in the definition of the character set. Please note that there is no negating ! in the conditional expression any more.



            If "${URL}" contains a forbidden character, the regular expression matches and the compound command [[...]] evaluates to true (zero exit status).






            share|improve this answer


























            • Just tried this with https://www.youtube.com/watch?v=_! as a sample URL, but it says it's allowed...

              – leetbacoon
              2 hours ago











            • @leetbacoon: You are referring to the exclamation mark, right? Well, if I try that URL with !, it is not allowed. If I remove the trailing !, it is. So, here it works. Please check that you have removed your negating ! in front of the "${URL}" in the if condition. This would invert the logic.

              – Jürgen
              2 hours ago





















            0














            Your current logic is wrong, it returns true only when every character in the input URL exists outside the set of permitted characters.



            Try something along the lines of



            if [[ "${URL}"  = *[!A-Za-z0-9&./=_:?-]* ]]
            then
            echo "That URL is NOT allowed."
            else
            echo "That URL is allowed"
            fi


            This check, due to the negation (!) inside the character range, is intended to return true when the input URL contains one or more characters outside of the permitted set






            share|improve this answer























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


              }
              });






              leetbacoon is a new contributor. Be nice, and check out our Code of Conduct.










              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f498699%2fhow-to-allow-only-certain-characters-in-a-bash-variable%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              3 Answers
              3






              active

              oldest

              votes








              3 Answers
              3






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              1














              Another way is with a plain case statement:



              #!/bin/sh

              case $URL in
              (*[^A-Za-z0-9&./=_:?-]*) echo not allowed;;
              (*) echo allowed;;
              esac


              The basic idea is to invert the logic and ask if there are any characters in the argument that are not in the allowed range.






              share|improve this answer




























                1














                Another way is with a plain case statement:



                #!/bin/sh

                case $URL in
                (*[^A-Za-z0-9&./=_:?-]*) echo not allowed;;
                (*) echo allowed;;
                esac


                The basic idea is to invert the logic and ask if there are any characters in the argument that are not in the allowed range.






                share|improve this answer


























                  1












                  1








                  1







                  Another way is with a plain case statement:



                  #!/bin/sh

                  case $URL in
                  (*[^A-Za-z0-9&./=_:?-]*) echo not allowed;;
                  (*) echo allowed;;
                  esac


                  The basic idea is to invert the logic and ask if there are any characters in the argument that are not in the allowed range.






                  share|improve this answer













                  Another way is with a plain case statement:



                  #!/bin/sh

                  case $URL in
                  (*[^A-Za-z0-9&./=_:?-]*) echo not allowed;;
                  (*) echo allowed;;
                  esac


                  The basic idea is to invert the logic and ask if there are any characters in the argument that are not in the allowed range.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 1 hour ago









                  Jeff SchallerJeff Schaller

                  40.9k1056130




                  40.9k1056130

























                      1














                      Your attempt



                      Your attempt might not work as expected because it considers all URLs as allowed that contain at least one of the allowed characters. Formally, you compare the URL with



                      <anything><allowed_character><anything>


                      If this does not match, you reject the URL.



                      This might help



                      If you replace your if ... else ... fi by



                      if [[ "${URL}" =~ [^A-Za-z0-9&./=_-:?] ]]; then
                      echo "That URL is NOT allowed."
                      else
                      echo "That URL is allowed."
                      fi


                      it might do what you want.



                      Here, the binary operator =~ is used to find a match of the regular expression [^A-Za-z0-9&./=_-:?] within "${URL}". This operator does not require that the whole string "${URL}" matches the regular expression, any matching substring will do. Such a match is found for any character that is not allowed in the URL. The "not" comes from the leading caret (^) in the definition of the character set. Please note that there is no negating ! in the conditional expression any more.



                      If "${URL}" contains a forbidden character, the regular expression matches and the compound command [[...]] evaluates to true (zero exit status).






                      share|improve this answer


























                      • Just tried this with https://www.youtube.com/watch?v=_! as a sample URL, but it says it's allowed...

                        – leetbacoon
                        2 hours ago











                      • @leetbacoon: You are referring to the exclamation mark, right? Well, if I try that URL with !, it is not allowed. If I remove the trailing !, it is. So, here it works. Please check that you have removed your negating ! in front of the "${URL}" in the if condition. This would invert the logic.

                        – Jürgen
                        2 hours ago


















                      1














                      Your attempt



                      Your attempt might not work as expected because it considers all URLs as allowed that contain at least one of the allowed characters. Formally, you compare the URL with



                      <anything><allowed_character><anything>


                      If this does not match, you reject the URL.



                      This might help



                      If you replace your if ... else ... fi by



                      if [[ "${URL}" =~ [^A-Za-z0-9&./=_-:?] ]]; then
                      echo "That URL is NOT allowed."
                      else
                      echo "That URL is allowed."
                      fi


                      it might do what you want.



                      Here, the binary operator =~ is used to find a match of the regular expression [^A-Za-z0-9&./=_-:?] within "${URL}". This operator does not require that the whole string "${URL}" matches the regular expression, any matching substring will do. Such a match is found for any character that is not allowed in the URL. The "not" comes from the leading caret (^) in the definition of the character set. Please note that there is no negating ! in the conditional expression any more.



                      If "${URL}" contains a forbidden character, the regular expression matches and the compound command [[...]] evaluates to true (zero exit status).






                      share|improve this answer


























                      • Just tried this with https://www.youtube.com/watch?v=_! as a sample URL, but it says it's allowed...

                        – leetbacoon
                        2 hours ago











                      • @leetbacoon: You are referring to the exclamation mark, right? Well, if I try that URL with !, it is not allowed. If I remove the trailing !, it is. So, here it works. Please check that you have removed your negating ! in front of the "${URL}" in the if condition. This would invert the logic.

                        – Jürgen
                        2 hours ago
















                      1












                      1








                      1







                      Your attempt



                      Your attempt might not work as expected because it considers all URLs as allowed that contain at least one of the allowed characters. Formally, you compare the URL with



                      <anything><allowed_character><anything>


                      If this does not match, you reject the URL.



                      This might help



                      If you replace your if ... else ... fi by



                      if [[ "${URL}" =~ [^A-Za-z0-9&./=_-:?] ]]; then
                      echo "That URL is NOT allowed."
                      else
                      echo "That URL is allowed."
                      fi


                      it might do what you want.



                      Here, the binary operator =~ is used to find a match of the regular expression [^A-Za-z0-9&./=_-:?] within "${URL}". This operator does not require that the whole string "${URL}" matches the regular expression, any matching substring will do. Such a match is found for any character that is not allowed in the URL. The "not" comes from the leading caret (^) in the definition of the character set. Please note that there is no negating ! in the conditional expression any more.



                      If "${URL}" contains a forbidden character, the regular expression matches and the compound command [[...]] evaluates to true (zero exit status).






                      share|improve this answer















                      Your attempt



                      Your attempt might not work as expected because it considers all URLs as allowed that contain at least one of the allowed characters. Formally, you compare the URL with



                      <anything><allowed_character><anything>


                      If this does not match, you reject the URL.



                      This might help



                      If you replace your if ... else ... fi by



                      if [[ "${URL}" =~ [^A-Za-z0-9&./=_-:?] ]]; then
                      echo "That URL is NOT allowed."
                      else
                      echo "That URL is allowed."
                      fi


                      it might do what you want.



                      Here, the binary operator =~ is used to find a match of the regular expression [^A-Za-z0-9&./=_-:?] within "${URL}". This operator does not require that the whole string "${URL}" matches the regular expression, any matching substring will do. Such a match is found for any character that is not allowed in the URL. The "not" comes from the leading caret (^) in the definition of the character set. Please note that there is no negating ! in the conditional expression any more.



                      If "${URL}" contains a forbidden character, the regular expression matches and the compound command [[...]] evaluates to true (zero exit status).







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited 1 hour ago

























                      answered 3 hours ago









                      JürgenJürgen

                      1488




                      1488













                      • Just tried this with https://www.youtube.com/watch?v=_! as a sample URL, but it says it's allowed...

                        – leetbacoon
                        2 hours ago











                      • @leetbacoon: You are referring to the exclamation mark, right? Well, if I try that URL with !, it is not allowed. If I remove the trailing !, it is. So, here it works. Please check that you have removed your negating ! in front of the "${URL}" in the if condition. This would invert the logic.

                        – Jürgen
                        2 hours ago





















                      • Just tried this with https://www.youtube.com/watch?v=_! as a sample URL, but it says it's allowed...

                        – leetbacoon
                        2 hours ago











                      • @leetbacoon: You are referring to the exclamation mark, right? Well, if I try that URL with !, it is not allowed. If I remove the trailing !, it is. So, here it works. Please check that you have removed your negating ! in front of the "${URL}" in the if condition. This would invert the logic.

                        – Jürgen
                        2 hours ago



















                      Just tried this with https://www.youtube.com/watch?v=_! as a sample URL, but it says it's allowed...

                      – leetbacoon
                      2 hours ago





                      Just tried this with https://www.youtube.com/watch?v=_! as a sample URL, but it says it's allowed...

                      – leetbacoon
                      2 hours ago













                      @leetbacoon: You are referring to the exclamation mark, right? Well, if I try that URL with !, it is not allowed. If I remove the trailing !, it is. So, here it works. Please check that you have removed your negating ! in front of the "${URL}" in the if condition. This would invert the logic.

                      – Jürgen
                      2 hours ago







                      @leetbacoon: You are referring to the exclamation mark, right? Well, if I try that URL with !, it is not allowed. If I remove the trailing !, it is. So, here it works. Please check that you have removed your negating ! in front of the "${URL}" in the if condition. This would invert the logic.

                      – Jürgen
                      2 hours ago













                      0














                      Your current logic is wrong, it returns true only when every character in the input URL exists outside the set of permitted characters.



                      Try something along the lines of



                      if [[ "${URL}"  = *[!A-Za-z0-9&./=_:?-]* ]]
                      then
                      echo "That URL is NOT allowed."
                      else
                      echo "That URL is allowed"
                      fi


                      This check, due to the negation (!) inside the character range, is intended to return true when the input URL contains one or more characters outside of the permitted set






                      share|improve this answer




























                        0














                        Your current logic is wrong, it returns true only when every character in the input URL exists outside the set of permitted characters.



                        Try something along the lines of



                        if [[ "${URL}"  = *[!A-Za-z0-9&./=_:?-]* ]]
                        then
                        echo "That URL is NOT allowed."
                        else
                        echo "That URL is allowed"
                        fi


                        This check, due to the negation (!) inside the character range, is intended to return true when the input URL contains one or more characters outside of the permitted set






                        share|improve this answer


























                          0












                          0








                          0







                          Your current logic is wrong, it returns true only when every character in the input URL exists outside the set of permitted characters.



                          Try something along the lines of



                          if [[ "${URL}"  = *[!A-Za-z0-9&./=_:?-]* ]]
                          then
                          echo "That URL is NOT allowed."
                          else
                          echo "That URL is allowed"
                          fi


                          This check, due to the negation (!) inside the character range, is intended to return true when the input URL contains one or more characters outside of the permitted set






                          share|improve this answer













                          Your current logic is wrong, it returns true only when every character in the input URL exists outside the set of permitted characters.



                          Try something along the lines of



                          if [[ "${URL}"  = *[!A-Za-z0-9&./=_:?-]* ]]
                          then
                          echo "That URL is NOT allowed."
                          else
                          echo "That URL is allowed"
                          fi


                          This check, due to the negation (!) inside the character range, is intended to return true when the input URL contains one or more characters outside of the permitted set







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered 2 hours ago









                          iruvariruvar

                          11.8k62960




                          11.8k62960






















                              leetbacoon is a new contributor. Be nice, and check out our Code of Conduct.










                              draft saved

                              draft discarded


















                              leetbacoon is a new contributor. Be nice, and check out our Code of Conduct.













                              leetbacoon is a new contributor. Be nice, and check out our Code of Conduct.












                              leetbacoon is a new contributor. Be nice, and check out our Code of Conduct.
















                              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%2f498699%2fhow-to-allow-only-certain-characters-in-a-bash-variable%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

                              Loup dans la culture

                              How to solve the problem of ntp “Unable to contact time server” from KDE?

                              ASUS Zenbook UX433/UX333 — Configure Touchpad-embedded numpad on Linux