首页 > 解决方案 > 在 shell 脚本中使用替换字符串作为命令

问题描述

给定下面列出的变量:

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

现在我想/home/ytu/anaconda3/bin/python foo.pyuserupperand执行path。我尝试过$(${userupper}_PYTHON) $path,但最终出现错误消息,包括:

YTU_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_PYTHON
ytu_clinic249_monthly_report.py
/home/ytu/anaconda3/bin/python
send_monthly_reports.sh:14:send_monthly_reports.sh:替换错误

,这让我很困惑。

标签: shellcommand-substitution

解决方案


尝试这个:

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

在你的情况下,它回响:

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

如果您想编写 bash 脚本,这里是可能有用的链接。简而言之,您不应该解析ls输出。

您还创建了不必要的新进程,两行都一样:

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

推荐阅读