Bash script to detect empty message string. Getting: too many arguments












1















I have a bash script where I can pipe in output from another application into the below script. But I think I have an incorrect logic for testing if the message is empty or not. If its empty I want it to do nothing, but if it detects the word "error" in the string, it should run another function.



What am I doing wrong in my logic?



I'm getting too many arguments on the 3rd to the last line, most likely due to the message being empty.



message=$( cat )

if [ -n "${message// /}" ]; then
#execute if the the variable is not empty and contains non space characters
message="``` ${message} ```"
else
#execute if the variable is empty or contains only spaces
message=""
fi

sendX() {
.....
}

if [ -z "$message" ]; then
echo "Please pipe a message to me!"
else
sendX
fi

sendAlert() {
......
}

checkword="error"

echo $message

if [ $message =~ $checkword ]; then <---- Error: too many arguments
sendY
fi









share|improve this question























  • Possible duplicate of Why does my shell script choke on whitespace or other special characters?

    – A.B
    13 mins ago
















1















I have a bash script where I can pipe in output from another application into the below script. But I think I have an incorrect logic for testing if the message is empty or not. If its empty I want it to do nothing, but if it detects the word "error" in the string, it should run another function.



What am I doing wrong in my logic?



I'm getting too many arguments on the 3rd to the last line, most likely due to the message being empty.



message=$( cat )

if [ -n "${message// /}" ]; then
#execute if the the variable is not empty and contains non space characters
message="``` ${message} ```"
else
#execute if the variable is empty or contains only spaces
message=""
fi

sendX() {
.....
}

if [ -z "$message" ]; then
echo "Please pipe a message to me!"
else
sendX
fi

sendAlert() {
......
}

checkword="error"

echo $message

if [ $message =~ $checkword ]; then <---- Error: too many arguments
sendY
fi









share|improve this question























  • Possible duplicate of Why does my shell script choke on whitespace or other special characters?

    – A.B
    13 mins ago














1












1








1








I have a bash script where I can pipe in output from another application into the below script. But I think I have an incorrect logic for testing if the message is empty or not. If its empty I want it to do nothing, but if it detects the word "error" in the string, it should run another function.



What am I doing wrong in my logic?



I'm getting too many arguments on the 3rd to the last line, most likely due to the message being empty.



message=$( cat )

if [ -n "${message// /}" ]; then
#execute if the the variable is not empty and contains non space characters
message="``` ${message} ```"
else
#execute if the variable is empty or contains only spaces
message=""
fi

sendX() {
.....
}

if [ -z "$message" ]; then
echo "Please pipe a message to me!"
else
sendX
fi

sendAlert() {
......
}

checkword="error"

echo $message

if [ $message =~ $checkword ]; then <---- Error: too many arguments
sendY
fi









share|improve this question














I have a bash script where I can pipe in output from another application into the below script. But I think I have an incorrect logic for testing if the message is empty or not. If its empty I want it to do nothing, but if it detects the word "error" in the string, it should run another function.



What am I doing wrong in my logic?



I'm getting too many arguments on the 3rd to the last line, most likely due to the message being empty.



message=$( cat )

if [ -n "${message// /}" ]; then
#execute if the the variable is not empty and contains non space characters
message="``` ${message} ```"
else
#execute if the variable is empty or contains only spaces
message=""
fi

sendX() {
.....
}

if [ -z "$message" ]; then
echo "Please pipe a message to me!"
else
sendX
fi

sendAlert() {
......
}

checkword="error"

echo $message

if [ $message =~ $checkword ]; then <---- Error: too many arguments
sendY
fi






bash shell-script






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 2 hours ago









Patoshi パトシPatoshi パトシ

54241322




54241322













  • Possible duplicate of Why does my shell script choke on whitespace or other special characters?

    – A.B
    13 mins ago



















  • Possible duplicate of Why does my shell script choke on whitespace or other special characters?

    – A.B
    13 mins ago

















Possible duplicate of Why does my shell script choke on whitespace or other special characters?

– A.B
13 mins ago





Possible duplicate of Why does my shell script choke on whitespace or other special characters?

– A.B
13 mins ago










1 Answer
1






active

oldest

votes


















4














You're getting a "too many arguments" error since [ ... ] does not understand the =~ operator (used in bash for regular expression matching). Since [ ... ] does not understand the operator, it is treated as a string. You then have [ ... ] with three strings inside it, and they don't fulfil the semantic requirements for a proper test, which is why bash errors out at this point.



In bash, you would use =~ inside of [[ ... ]].



However, what I assume you'd like to do in that test is to see whether $message contains $checkword as a substring. This could also be done with



[[ "$message" == *"$checkword"* ]] && sendY


or with case ... esac:



case $message in
*"$checkword"*) sendY
esac


This way you don't have to worry about $checkword containing characters that may be special in regular expressions.



You also need to double quote $message in echo $message, or you may get unexpected output if $message contains filename globbing characters like *.



Related:




  • What is the difference between the Bash operators [[ vs [ vs ( vs ((?

  • When is double-quoting necessary?


  • Why is printf better than echo? (because it would be better to use printf '%sn' "$message" than echo "$message" for user-supplied data)


  • https://www.shellcheck.net/ (which would have picked up these issues and possibly others, like missing a proper #!-line)




You could also use this instead of the first operation in the script:



case $message in
*[! ]*) # contains non-space
message='``` '"$message"' ```' ;;
*) # contains nothing or only spaces
message=
esac


Using case ... esac in both places would make your script (at least the bits that you have shown) portable to any sh-like shell.






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


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f500510%2fbash-script-to-detect-empty-message-string-getting-too-many-arguments%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    4














    You're getting a "too many arguments" error since [ ... ] does not understand the =~ operator (used in bash for regular expression matching). Since [ ... ] does not understand the operator, it is treated as a string. You then have [ ... ] with three strings inside it, and they don't fulfil the semantic requirements for a proper test, which is why bash errors out at this point.



    In bash, you would use =~ inside of [[ ... ]].



    However, what I assume you'd like to do in that test is to see whether $message contains $checkword as a substring. This could also be done with



    [[ "$message" == *"$checkword"* ]] && sendY


    or with case ... esac:



    case $message in
    *"$checkword"*) sendY
    esac


    This way you don't have to worry about $checkword containing characters that may be special in regular expressions.



    You also need to double quote $message in echo $message, or you may get unexpected output if $message contains filename globbing characters like *.



    Related:




    • What is the difference between the Bash operators [[ vs [ vs ( vs ((?

    • When is double-quoting necessary?


    • Why is printf better than echo? (because it would be better to use printf '%sn' "$message" than echo "$message" for user-supplied data)


    • https://www.shellcheck.net/ (which would have picked up these issues and possibly others, like missing a proper #!-line)




    You could also use this instead of the first operation in the script:



    case $message in
    *[! ]*) # contains non-space
    message='``` '"$message"' ```' ;;
    *) # contains nothing or only spaces
    message=
    esac


    Using case ... esac in both places would make your script (at least the bits that you have shown) portable to any sh-like shell.






    share|improve this answer






























      4














      You're getting a "too many arguments" error since [ ... ] does not understand the =~ operator (used in bash for regular expression matching). Since [ ... ] does not understand the operator, it is treated as a string. You then have [ ... ] with three strings inside it, and they don't fulfil the semantic requirements for a proper test, which is why bash errors out at this point.



      In bash, you would use =~ inside of [[ ... ]].



      However, what I assume you'd like to do in that test is to see whether $message contains $checkword as a substring. This could also be done with



      [[ "$message" == *"$checkword"* ]] && sendY


      or with case ... esac:



      case $message in
      *"$checkword"*) sendY
      esac


      This way you don't have to worry about $checkword containing characters that may be special in regular expressions.



      You also need to double quote $message in echo $message, or you may get unexpected output if $message contains filename globbing characters like *.



      Related:




      • What is the difference between the Bash operators [[ vs [ vs ( vs ((?

      • When is double-quoting necessary?


      • Why is printf better than echo? (because it would be better to use printf '%sn' "$message" than echo "$message" for user-supplied data)


      • https://www.shellcheck.net/ (which would have picked up these issues and possibly others, like missing a proper #!-line)




      You could also use this instead of the first operation in the script:



      case $message in
      *[! ]*) # contains non-space
      message='``` '"$message"' ```' ;;
      *) # contains nothing or only spaces
      message=
      esac


      Using case ... esac in both places would make your script (at least the bits that you have shown) portable to any sh-like shell.






      share|improve this answer




























        4












        4








        4







        You're getting a "too many arguments" error since [ ... ] does not understand the =~ operator (used in bash for regular expression matching). Since [ ... ] does not understand the operator, it is treated as a string. You then have [ ... ] with three strings inside it, and they don't fulfil the semantic requirements for a proper test, which is why bash errors out at this point.



        In bash, you would use =~ inside of [[ ... ]].



        However, what I assume you'd like to do in that test is to see whether $message contains $checkword as a substring. This could also be done with



        [[ "$message" == *"$checkword"* ]] && sendY


        or with case ... esac:



        case $message in
        *"$checkword"*) sendY
        esac


        This way you don't have to worry about $checkword containing characters that may be special in regular expressions.



        You also need to double quote $message in echo $message, or you may get unexpected output if $message contains filename globbing characters like *.



        Related:




        • What is the difference between the Bash operators [[ vs [ vs ( vs ((?

        • When is double-quoting necessary?


        • Why is printf better than echo? (because it would be better to use printf '%sn' "$message" than echo "$message" for user-supplied data)


        • https://www.shellcheck.net/ (which would have picked up these issues and possibly others, like missing a proper #!-line)




        You could also use this instead of the first operation in the script:



        case $message in
        *[! ]*) # contains non-space
        message='``` '"$message"' ```' ;;
        *) # contains nothing or only spaces
        message=
        esac


        Using case ... esac in both places would make your script (at least the bits that you have shown) portable to any sh-like shell.






        share|improve this answer















        You're getting a "too many arguments" error since [ ... ] does not understand the =~ operator (used in bash for regular expression matching). Since [ ... ] does not understand the operator, it is treated as a string. You then have [ ... ] with three strings inside it, and they don't fulfil the semantic requirements for a proper test, which is why bash errors out at this point.



        In bash, you would use =~ inside of [[ ... ]].



        However, what I assume you'd like to do in that test is to see whether $message contains $checkword as a substring. This could also be done with



        [[ "$message" == *"$checkword"* ]] && sendY


        or with case ... esac:



        case $message in
        *"$checkword"*) sendY
        esac


        This way you don't have to worry about $checkword containing characters that may be special in regular expressions.



        You also need to double quote $message in echo $message, or you may get unexpected output if $message contains filename globbing characters like *.



        Related:




        • What is the difference between the Bash operators [[ vs [ vs ( vs ((?

        • When is double-quoting necessary?


        • Why is printf better than echo? (because it would be better to use printf '%sn' "$message" than echo "$message" for user-supplied data)


        • https://www.shellcheck.net/ (which would have picked up these issues and possibly others, like missing a proper #!-line)




        You could also use this instead of the first operation in the script:



        case $message in
        *[! ]*) # contains non-space
        message='``` '"$message"' ```' ;;
        *) # contains nothing or only spaces
        message=
        esac


        Using case ... esac in both places would make your script (at least the bits that you have shown) portable to any sh-like shell.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 1 hour ago

























        answered 2 hours ago









        KusalanandaKusalananda

        129k16246404




        129k16246404






























            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%2f500510%2fbash-script-to-detect-empty-message-string-getting-too-many-arguments%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

            Willebadessen

            Ida-Boy-Ed-Garten

            Residenzschloss Arolsen