代码之家  ›  专栏  ›  技术社区  ›  SailorCire

Bash:从具有变量替换的文件中读取字符串

  •  0
  • SailorCire  · 技术社区  · 11 月前

    我有一种奇怪的情况,我有一个命令存储在一个文件中,而该文件包含对变量的引用。

    我可以很好地读取该文件,但在使变量展开工作时遇到了问题。

    作为一个最低限度的工作示例,这里有一个文件,其中包含一个带有变量的命令作为示例:

    命令.in

    ls $DIR
    

    simple.sh

    #!/bin/bash
    
    MYVAR=$(<command.in)
    DIR="/tmp"
    
    $MYVAR
    

    预期结果

    我的预期结果是它将打印/tmp的内容

    我所尝试的

    我试过搬家 DIR 上面的作业 MYVAR 中的分配 simple.sh 我试着改变 $DIR 在里面 command.in ${DIR} $(DIR)

    2 回复  |  直到 11 月前
        1
  •  1
  •   Ljm Dullaart    11 月前

    $(<command.in) 确实取消了对变量的引用。如果你放一个 echo 在脚本中:

    #!/bin/bash
    DIR="/tmp"
    MYVAR=$(<command.in)
    echo $MYVAR
    $MYVAR
    

    其给出:

    bash simple.sh
    ls $DIR
    ls: cannot access '$DIR': No such file or directory
    

    当你这样做的时候 $MYVAR ,变量被展开一次。所以它产生 ls $DIR 这就是所执行的。具有 eval 您可以强制进行另一级别的变量扩展:

    #!/bin/bash
    DIR="/tmp"
    MYVAR=$(<command.in)
    echo "$MYVAR"
    eval "$MYVAR"
    
        2
  •  0
  •   Philippe    11 月前

    这是实现您期望的结果的一种方法(无需使用 eval ):

    MYVAR(){
        DIR="$DIR" envsubst '$DIR' <command.in
    }
    
    DIR="/tmp"
    
    $(MYVAR)
    
        3
  •  0
  •   chepner    11 月前

    只要改变 command.in

    ls "$1"
    

    然后像普通脚本一样执行它(因为现在 普通的参数化脚本)。

    #!/bin/bash
    
    DIR="/tmp"
    
    bash command.in "$DIR"