can bash show one array item id and value using `declare -p`?












1















$ str="a'"b"
$ declare -p str
declare -- str="a'"b" # see " was escaped, possibly other chars will too
$ astr=("$str" "c")
$ declare -p astr
declare -ax astr='([0]="a'''"b" [1]="c")'


so, is there some way to do something like declare -p astr[0] and retrieve something like this: declare -- astr[0]="a'"b" ?



I could use sed or something else, but I would like to know if bash allow accessing astr[n] thru declare -p in some way I couldn't guess yet?










share|improve this question



























    1















    $ str="a'"b"
    $ declare -p str
    declare -- str="a'"b" # see " was escaped, possibly other chars will too
    $ astr=("$str" "c")
    $ declare -p astr
    declare -ax astr='([0]="a'''"b" [1]="c")'


    so, is there some way to do something like declare -p astr[0] and retrieve something like this: declare -- astr[0]="a'"b" ?



    I could use sed or something else, but I would like to know if bash allow accessing astr[n] thru declare -p in some way I couldn't guess yet?










    share|improve this question

























      1












      1








      1








      $ str="a'"b"
      $ declare -p str
      declare -- str="a'"b" # see " was escaped, possibly other chars will too
      $ astr=("$str" "c")
      $ declare -p astr
      declare -ax astr='([0]="a'''"b" [1]="c")'


      so, is there some way to do something like declare -p astr[0] and retrieve something like this: declare -- astr[0]="a'"b" ?



      I could use sed or something else, but I would like to know if bash allow accessing astr[n] thru declare -p in some way I couldn't guess yet?










      share|improve this question














      $ str="a'"b"
      $ declare -p str
      declare -- str="a'"b" # see " was escaped, possibly other chars will too
      $ astr=("$str" "c")
      $ declare -p astr
      declare -ax astr='([0]="a'''"b" [1]="c")'


      so, is there some way to do something like declare -p astr[0] and retrieve something like this: declare -- astr[0]="a'"b" ?



      I could use sed or something else, but I would like to know if bash allow accessing astr[n] thru declare -p in some way I couldn't guess yet?







      bash array






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 5 hours ago









      Aquarius PowerAquarius Power

      1,67232036




      1,67232036






















          2 Answers
          2






          active

          oldest

          votes


















          3














          If you are just looking for a way of displaying the data with escaped special characters, then the %q format string of printf in bash would do that for you:



          printf '%qn' "${astr[0]}"


          To replicate the declare -p-like output that you suggest:



          printf 'declare -- astr[0]="%q"n' "${astr[0]}"


          This is from the bash manual, regarding the %q format string of printf:




          %q



          causes printf to output the corresponding argument in a format that can be reused
          as shell input.







          share|improve this answer


























          • it is a lot simpler than using sed and does the same thing I was looking for, thx!

            – Aquarius Power
            5 hours ago



















          0














          With bash v4.4 you can use the @A parameter expansion operator to get similar results, but not effectively for a single array element:




          A




          The expansion is a string in the form of an assignment statement or declare command that, if evaluated, will recreate parameter with its attributes and value.





          $ str="a'"b"
          $ astr=("$str" "c")
          $ echo ${astr[0]@A}
          declare -a astr='a'''"b'
          $ echo ${astr[@]@A}
          declare -a astr=([0]="a'"b" [1]="c")


          Or similar to the %q printf format you can use the @Q operator:



          $ echo ${astr[0]@Q}
          'a'''"b'
          $ echo "declare -- astr[0]=${astr[0]@Q}"
          declare -- astr[0]='a'''"b'





          share|improve this answer





















          • 1





            a new feature, interesting! mine is v4.3.48, I am almost installing 18.04 (16.04 here), I will check then :)

            – Aquarius Power
            4 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
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f494175%2fcan-bash-show-one-array-item-id-and-value-using-declare-p%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









          3














          If you are just looking for a way of displaying the data with escaped special characters, then the %q format string of printf in bash would do that for you:



          printf '%qn' "${astr[0]}"


          To replicate the declare -p-like output that you suggest:



          printf 'declare -- astr[0]="%q"n' "${astr[0]}"


          This is from the bash manual, regarding the %q format string of printf:




          %q



          causes printf to output the corresponding argument in a format that can be reused
          as shell input.







          share|improve this answer


























          • it is a lot simpler than using sed and does the same thing I was looking for, thx!

            – Aquarius Power
            5 hours ago
















          3














          If you are just looking for a way of displaying the data with escaped special characters, then the %q format string of printf in bash would do that for you:



          printf '%qn' "${astr[0]}"


          To replicate the declare -p-like output that you suggest:



          printf 'declare -- astr[0]="%q"n' "${astr[0]}"


          This is from the bash manual, regarding the %q format string of printf:




          %q



          causes printf to output the corresponding argument in a format that can be reused
          as shell input.







          share|improve this answer


























          • it is a lot simpler than using sed and does the same thing I was looking for, thx!

            – Aquarius Power
            5 hours ago














          3












          3








          3







          If you are just looking for a way of displaying the data with escaped special characters, then the %q format string of printf in bash would do that for you:



          printf '%qn' "${astr[0]}"


          To replicate the declare -p-like output that you suggest:



          printf 'declare -- astr[0]="%q"n' "${astr[0]}"


          This is from the bash manual, regarding the %q format string of printf:




          %q



          causes printf to output the corresponding argument in a format that can be reused
          as shell input.







          share|improve this answer















          If you are just looking for a way of displaying the data with escaped special characters, then the %q format string of printf in bash would do that for you:



          printf '%qn' "${astr[0]}"


          To replicate the declare -p-like output that you suggest:



          printf 'declare -- astr[0]="%q"n' "${astr[0]}"


          This is from the bash manual, regarding the %q format string of printf:




          %q



          causes printf to output the corresponding argument in a format that can be reused
          as shell input.








          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 5 hours ago

























          answered 5 hours ago









          KusalanandaKusalananda

          124k16232382




          124k16232382













          • it is a lot simpler than using sed and does the same thing I was looking for, thx!

            – Aquarius Power
            5 hours ago



















          • it is a lot simpler than using sed and does the same thing I was looking for, thx!

            – Aquarius Power
            5 hours ago

















          it is a lot simpler than using sed and does the same thing I was looking for, thx!

          – Aquarius Power
          5 hours ago





          it is a lot simpler than using sed and does the same thing I was looking for, thx!

          – Aquarius Power
          5 hours ago













          0














          With bash v4.4 you can use the @A parameter expansion operator to get similar results, but not effectively for a single array element:




          A




          The expansion is a string in the form of an assignment statement or declare command that, if evaluated, will recreate parameter with its attributes and value.





          $ str="a'"b"
          $ astr=("$str" "c")
          $ echo ${astr[0]@A}
          declare -a astr='a'''"b'
          $ echo ${astr[@]@A}
          declare -a astr=([0]="a'"b" [1]="c")


          Or similar to the %q printf format you can use the @Q operator:



          $ echo ${astr[0]@Q}
          'a'''"b'
          $ echo "declare -- astr[0]=${astr[0]@Q}"
          declare -- astr[0]='a'''"b'





          share|improve this answer





















          • 1





            a new feature, interesting! mine is v4.3.48, I am almost installing 18.04 (16.04 here), I will check then :)

            – Aquarius Power
            4 hours ago
















          0














          With bash v4.4 you can use the @A parameter expansion operator to get similar results, but not effectively for a single array element:




          A




          The expansion is a string in the form of an assignment statement or declare command that, if evaluated, will recreate parameter with its attributes and value.





          $ str="a'"b"
          $ astr=("$str" "c")
          $ echo ${astr[0]@A}
          declare -a astr='a'''"b'
          $ echo ${astr[@]@A}
          declare -a astr=([0]="a'"b" [1]="c")


          Or similar to the %q printf format you can use the @Q operator:



          $ echo ${astr[0]@Q}
          'a'''"b'
          $ echo "declare -- astr[0]=${astr[0]@Q}"
          declare -- astr[0]='a'''"b'





          share|improve this answer





















          • 1





            a new feature, interesting! mine is v4.3.48, I am almost installing 18.04 (16.04 here), I will check then :)

            – Aquarius Power
            4 hours ago














          0












          0








          0







          With bash v4.4 you can use the @A parameter expansion operator to get similar results, but not effectively for a single array element:




          A




          The expansion is a string in the form of an assignment statement or declare command that, if evaluated, will recreate parameter with its attributes and value.





          $ str="a'"b"
          $ astr=("$str" "c")
          $ echo ${astr[0]@A}
          declare -a astr='a'''"b'
          $ echo ${astr[@]@A}
          declare -a astr=([0]="a'"b" [1]="c")


          Or similar to the %q printf format you can use the @Q operator:



          $ echo ${astr[0]@Q}
          'a'''"b'
          $ echo "declare -- astr[0]=${astr[0]@Q}"
          declare -- astr[0]='a'''"b'





          share|improve this answer















          With bash v4.4 you can use the @A parameter expansion operator to get similar results, but not effectively for a single array element:




          A




          The expansion is a string in the form of an assignment statement or declare command that, if evaluated, will recreate parameter with its attributes and value.





          $ str="a'"b"
          $ astr=("$str" "c")
          $ echo ${astr[0]@A}
          declare -a astr='a'''"b'
          $ echo ${astr[@]@A}
          declare -a astr=([0]="a'"b" [1]="c")


          Or similar to the %q printf format you can use the @Q operator:



          $ echo ${astr[0]@Q}
          'a'''"b'
          $ echo "declare -- astr[0]=${astr[0]@Q}"
          declare -- astr[0]='a'''"b'






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 4 hours ago

























          answered 5 hours ago









          Jesse_bJesse_b

          12k23064




          12k23064








          • 1





            a new feature, interesting! mine is v4.3.48, I am almost installing 18.04 (16.04 here), I will check then :)

            – Aquarius Power
            4 hours ago














          • 1





            a new feature, interesting! mine is v4.3.48, I am almost installing 18.04 (16.04 here), I will check then :)

            – Aquarius Power
            4 hours ago








          1




          1





          a new feature, interesting! mine is v4.3.48, I am almost installing 18.04 (16.04 here), I will check then :)

          – Aquarius Power
          4 hours ago





          a new feature, interesting! mine is v4.3.48, I am almost installing 18.04 (16.04 here), I will check then :)

          – Aquarius Power
          4 hours ago


















          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%2f494175%2fcan-bash-show-one-array-item-id-and-value-using-declare-p%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

          Morgemoulin

          Scott Moir

          Souastre