Indirect parameter substitution in shell script

后端 未结 4 646
庸人自扰
庸人自扰 2020-12-21 17:16

I\'m having a problem with a shell script (POSIX shell under HP-UX, FWIW). I have a function called print_arg into which I\'m passing the name of a parameter as $1. Given

4条回答
  •  佛祖请我去吃肉
    2020-12-21 17:47

    Even though the answer's already accepted, here's another method for those who need to preserve newlines and special characters like Escape ( \033 ): Storing the variable in base64.

    You need: bc, wc, echo, tail, tr, uuencode, uudecode

    Example

    #!/bin/sh
    
    
    #====== Definition =======#
    varA="a
    b
    c"
    # uuencode the variable
    varB="`echo "$varA" | uuencode -m -`"
    # Skip the first line of the uuencode output.
    varB="`NUM=\`(echo "$varB"|wc -l|tr -d "\n"; echo -1)|bc \`; echo "$varB" | tail -n $NUM)`"
    
    
    #====== Access =======#
    
    namevar1=varB
    namevar2=varA
    
    echo simple eval:
    eval "echo \$$namevar2"
    echo simple echo: 
    echo $varB
    echo precise echo: 
    echo "$varB"
    echo echo of base64
    eval "echo \$$namevar1"
    echo echo of base64 - with updated newlines
    eval "echo \$$namevar1 | tr ' ' '\n'"
    echo echo of un-based, using sh instead of eval (but could be made with eval, too)
    export $namevar1
    sh -c "(echo 'begin-base64 644 -'; echo \$$namevar1 | tr ' ' '\n' )|uudecode"
    

    Result

    simple eval:
    a b c
    simple echo:
    YQpiCmMK ====
    precise echo:
    YQpiCmMK
    ====
    echo of base64
    YQpiCmMK ====
    echo of base64 - with updated newlines
    YQpiCmMK
    ====
    echo of un-based, using sh instead of eval (but could be made with eval, too)
    a
    b
    c
    

    Alternative

    You also could use the set command and parse it's output; with that, you don't need to treat the variable in a special way before it's accessed.

提交回复
热议问题