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

在shell脚本中使用替换字符串作为命令

  •  1
  • ytu  · 技术社区  · 7 年前

    给定下列变量:

    echo ${userupper}_PYTHON
    # YTU_PYTHON
    echo $YTU_PYTHON
    # /home/ytu/anaconda3/bin/python
    echo $path
    # foo.py
    

    现在我要执行 /home/ytu/anaconda3/bin/python foo.py userupper path . 我试过了 $(${userupper}_PYTHON) $path

    YTU\u PYTHON:未找到
    foo.py:未找到

    好像要花点时间 $(${userupper}_PYTHON) YTU_PYTHON 而不是预期的 $YTU_PYTHON . 我该怎么做才能使它正确呢?


    编辑:

    建议的复制应该解决了我的问题。但是由于一些未知的原因,它不起作用。

    #!/usr/bin/env bash
    
    for user in ytu
    do
      . /home/${user}/.profile
      userupper=$(echo ${user} | awk '{print toupper($0)}')
      userpython=${userupper}_PYTHON
      cd /home/${user}/H2-ML/crons
      for path in $(ls | grep ^${user}_.*_monthly_report.py$)
      do
        echo ${userpython}
        echo $path
        echo $YTU_PYTHON
        echo ${!userpython}
      done
    done
    

    上面的代码块返回:


    ytu\ U 249\ U月报.py
    /主页/ytu/anaconda3/bin/python
    发送月度报告。sh:14:发送月度报告。sh:替换错误

    ,这让我很困惑。

    1 回复  |  直到 7 年前
        1
  •  0
  •   prenc    7 年前

    试试这个:

    command=${userupper}_PYTHON
    echo ${!command} $path # ommit echo if you want to execute command
    

    /home/ytu/anaconda3/bin/python foo.py
    

    这里是 link ls 简单地说就是输出。

    $(echo ${user} | awk '{print toupper($0)}')
    ${user^^} #paramenter expansion