Manipulating Multiple word string in bash array












0














I have got a simple script as follows.



names=("windows" "ubuntu" "raspbian" "debian" "kali linux")
echo "names array length: ${#names[@]}"

for n in ${names[@]}; do
echo $n
done


My intention and hope to get was:



names array length: 5
windows
ubuntu
raspbian
debian
kali linux


but instead the result i got was:



names array length: 5
windows
ubuntu
raspbian
debian
kali
linux


The array seems to have the correct number of entry but printout appears on 6 lines instead of 5. How can i have the desired output?










share|improve this question









New contributor




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

























    0














    I have got a simple script as follows.



    names=("windows" "ubuntu" "raspbian" "debian" "kali linux")
    echo "names array length: ${#names[@]}"

    for n in ${names[@]}; do
    echo $n
    done


    My intention and hope to get was:



    names array length: 5
    windows
    ubuntu
    raspbian
    debian
    kali linux


    but instead the result i got was:



    names array length: 5
    windows
    ubuntu
    raspbian
    debian
    kali
    linux


    The array seems to have the correct number of entry but printout appears on 6 lines instead of 5. How can i have the desired output?










    share|improve this question









    New contributor




    ElectricSaga 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







      I have got a simple script as follows.



      names=("windows" "ubuntu" "raspbian" "debian" "kali linux")
      echo "names array length: ${#names[@]}"

      for n in ${names[@]}; do
      echo $n
      done


      My intention and hope to get was:



      names array length: 5
      windows
      ubuntu
      raspbian
      debian
      kali linux


      but instead the result i got was:



      names array length: 5
      windows
      ubuntu
      raspbian
      debian
      kali
      linux


      The array seems to have the correct number of entry but printout appears on 6 lines instead of 5. How can i have the desired output?










      share|improve this question









      New contributor




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











      I have got a simple script as follows.



      names=("windows" "ubuntu" "raspbian" "debian" "kali linux")
      echo "names array length: ${#names[@]}"

      for n in ${names[@]}; do
      echo $n
      done


      My intention and hope to get was:



      names array length: 5
      windows
      ubuntu
      raspbian
      debian
      kali linux


      but instead the result i got was:



      names array length: 5
      windows
      ubuntu
      raspbian
      debian
      kali
      linux


      The array seems to have the correct number of entry but printout appears on 6 lines instead of 5. How can i have the desired output?







      bash array






      share|improve this question









      New contributor




      ElectricSaga 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




      ElectricSaga 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 8 hours ago









      Rui F Ribeiro

      39.1k1479130




      39.1k1479130






      New contributor




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









      asked 9 hours ago









      ElectricSaga

      32




      32




      New contributor




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





      New contributor





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






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






















          1 Answer
          1






          active

          oldest

          votes


















          4














          Double quoting the variable expansion ${names[@]} would make it expand to the elements of the array, individually quoted. Not quoting that variable expansion would make the shell split all elements on whitespaces (by default), and additionally perform filename globbing on all the generated words (not an issue with the words that you use). In your example, this would cause kali and linux to be treated as two separate words.



          Therefore, use



          for name in "${names[@]}"; do
          printf '%sn' "$name"
          done


          or, for this simple script,



          printf '%sn' "${names[@]}"


          (no loop required since printf will simply reuse its format string for each individual argument)



          Related:




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


          Also (why I always use printf for outputting variable strings):




          • Why is printf better than echo?






          share|improve this answer























          • Thank you for your thorough explaination.
            – ElectricSaga
            8 hours ago











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


          }
          });






          ElectricSaga 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%2f492297%2fmanipulating-multiple-word-string-in-bash-array%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














          Double quoting the variable expansion ${names[@]} would make it expand to the elements of the array, individually quoted. Not quoting that variable expansion would make the shell split all elements on whitespaces (by default), and additionally perform filename globbing on all the generated words (not an issue with the words that you use). In your example, this would cause kali and linux to be treated as two separate words.



          Therefore, use



          for name in "${names[@]}"; do
          printf '%sn' "$name"
          done


          or, for this simple script,



          printf '%sn' "${names[@]}"


          (no loop required since printf will simply reuse its format string for each individual argument)



          Related:




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


          Also (why I always use printf for outputting variable strings):




          • Why is printf better than echo?






          share|improve this answer























          • Thank you for your thorough explaination.
            – ElectricSaga
            8 hours ago
















          4














          Double quoting the variable expansion ${names[@]} would make it expand to the elements of the array, individually quoted. Not quoting that variable expansion would make the shell split all elements on whitespaces (by default), and additionally perform filename globbing on all the generated words (not an issue with the words that you use). In your example, this would cause kali and linux to be treated as two separate words.



          Therefore, use



          for name in "${names[@]}"; do
          printf '%sn' "$name"
          done


          or, for this simple script,



          printf '%sn' "${names[@]}"


          (no loop required since printf will simply reuse its format string for each individual argument)



          Related:




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


          Also (why I always use printf for outputting variable strings):




          • Why is printf better than echo?






          share|improve this answer























          • Thank you for your thorough explaination.
            – ElectricSaga
            8 hours ago














          4












          4








          4






          Double quoting the variable expansion ${names[@]} would make it expand to the elements of the array, individually quoted. Not quoting that variable expansion would make the shell split all elements on whitespaces (by default), and additionally perform filename globbing on all the generated words (not an issue with the words that you use). In your example, this would cause kali and linux to be treated as two separate words.



          Therefore, use



          for name in "${names[@]}"; do
          printf '%sn' "$name"
          done


          or, for this simple script,



          printf '%sn' "${names[@]}"


          (no loop required since printf will simply reuse its format string for each individual argument)



          Related:




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


          Also (why I always use printf for outputting variable strings):




          • Why is printf better than echo?






          share|improve this answer














          Double quoting the variable expansion ${names[@]} would make it expand to the elements of the array, individually quoted. Not quoting that variable expansion would make the shell split all elements on whitespaces (by default), and additionally perform filename globbing on all the generated words (not an issue with the words that you use). In your example, this would cause kali and linux to be treated as two separate words.



          Therefore, use



          for name in "${names[@]}"; do
          printf '%sn' "$name"
          done


          or, for this simple script,



          printf '%sn' "${names[@]}"


          (no loop required since printf will simply reuse its format string for each individual argument)



          Related:




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


          Also (why I always use printf for outputting variable strings):




          • Why is printf better than echo?







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 8 hours ago

























          answered 9 hours ago









          Kusalananda

          122k16230374




          122k16230374












          • Thank you for your thorough explaination.
            – ElectricSaga
            8 hours ago


















          • Thank you for your thorough explaination.
            – ElectricSaga
            8 hours ago
















          Thank you for your thorough explaination.
          – ElectricSaga
          8 hours ago




          Thank you for your thorough explaination.
          – ElectricSaga
          8 hours ago










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










          draft saved

          draft discarded


















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













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












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





          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%2funix.stackexchange.com%2fquestions%2f492297%2fmanipulating-multiple-word-string-in-bash-array%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

          宮崎県

          濃尾地震

          シテ島