How to list variables declared in script in bash?

后端 未结 14 922
走了就别回头了
走了就别回头了 2020-11-28 20:03

In my script in bash, there are lot of variables, and I have to make something to save them to file. My question is how to list all variables declared in my script and get l

相关标签:
14条回答
  • 2020-11-28 20:33

    From a security perspective, either @akostadinov's answer or @JuvenXu's answer is preferable to relying upon the unstructured output of the set command, due to the following potential security flaw:

    #!/bin/bash
    
    function doLogic()
    {
        local COMMAND="${1}"
        if ( set -o posix; set | grep -q '^PS1=' )
        then
            echo 'Script is interactive'
        else
            echo 'Script is NOT interactive'
        fi
    }
    
    doLogic 'hello'   # Script is NOT interactive
    doLogic $'\nPS1=' # Script is interactive
    

    The above function doLogic uses set to check for the presence of variable PS1 to determine if the script is interactive or not (never mind if this is the best way to accomplish that goal; this is just an example.)

    However, the output of set is unstructured, which means that any variable that contains a newline can totally contaminate the results.

    This, of course, is a potential security risk. Instead, use either Bash's support for indirect variable name expansion, or compgen -v.

    0 讨论(0)
  • 2020-11-28 20:34
    for i in _ {a..z} {A..Z}; do eval "echo \${!$i@}" ; done | xargs printf "%s\n"
    

    This must print all shell variables names. You can get a list before and after sourcing your file just like with "set" to diff which variables are new (as explained in the other answers). But keep in mind such filtering with diff can filter out some variables that you need but were present before sourcing your file.

    In your case, if you know your variables' names start with "VARIABLE", then you can source your script and do:

    for var in ${!VARIABLE@}; do
       printf "%s%q\n" "$var=" "${!var}"
    done
    

    UPDATE: For pure BASH solution (no external commands used):

    for i in _ {a..z} {A..Z}; do
       for var in `eval echo "\\${!$i@}"`; do
          echo $var
          # you can test if $var matches some criteria and put it in the file or ignore
       done 
    done
    
    0 讨论(0)
提交回复
热议问题