【问题标题】:How to do the expansion of variable in shell script? [duplicate]如何在shell脚本中进行变量的扩展? [复制]
【发布时间】:2015-06-18 14:52:54
【问题描述】:

我在数据库中有一个列,其中包含以下数据:

sql_proc|test_sql.sql|/home/Desktop/myfile.txt|$IMP_FILES/myFolder|convert

我已将其提取到一个变量中,并使用cut 命令和"|" 作为分隔符并将每个字段保存在不同的变量中。现在让我们考虑VAR4 持有第四个字段,即$IMP_FILES/myFolder$IMP_FILES 是一个值为/home/OffFiles/Module 的环境变量。

如何使用VAR4 来获取/home/OffFiles/Module/myFolder

【问题讨论】:

  • @JohnSmith 不,那不一样。 op需要path=`bash -c "echo '$var4'"`path=`eval echo $var4`
  • 环境变量名称是固定的还是变化的——它总是$IMP_FILES 还是其他行中的$HOME$UMBRELLA 等。
  • @JohnSmith 谢谢,那个帖子有帮助。并感谢大家的帮助,我决定使用 eval 它对我很有用。
  • @HuStmpHrrr bash -c "echo '$var4'" 不会扩展 $IMP_FILES 你需要在 $var4 周围加上双引号,这使得它和 eval 一样不安全。

标签: linux bash shell unix ksh


【解决方案1】:

使用bash -c

newvar="$(bash -c "echo $var")"

使用eval

newvar="$(eval "echo $var")"

例子:

#!/bin/bash
var='$PATH'
echo "$var" #This will show that $var contains the string $PATH literally

#Using bash -c
newvar="$(bash -c "echo "$var"")"
echo "$newvar"

#using eval
newvar="$(eval "echo "$var"")"
echo "$newvar"

它会打印两次环境变量路径。

【讨论】:

    【解决方案2】:

    不安全的解决方案是使用eval:

    eval echo "$VAR4"
    

    不过,不要这样做,想象一下VAR4='|rm -rf /' 时会发生什么!

    您可以使用关联数组代替环境变量。

    #!/bin/bash
    declare -A dict
    dict[IMP_FILES]=/home/OffFiles/Module
    # ...
    
    VAR4='$IMP_FILES/myFolder'
    while [[ $VAR4 =~ \$([_A-Z]+) ]] ; do
        key=${BASH_REMATCH[1]}
        VAR4=${VAR4/\$$key/${dict[$key]}}
    done
    echo "$VAR4"
    

    请注意,解决方案是递归的,即如果字典包含值中的键,它可以无限增长字符串。我会放弃 shell 并转向 Perl,它可以更轻松地处理类似的问题。

    【讨论】:

    • 使用 bash 本身听起来很安全。 bash -c "echo '|echo abc'" 诚实地打印文本。
    • @HuStmpHrrr:好的,试试VAR4=\'\|rm\ -rf\ /\'
    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多