shell - 在 shell 脚本中使用替换字符串作为命令
问题描述
给定下面列出的变量:
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
and执行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:替换错误
,这让我很困惑。
解决方案
尝试这个:
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
推荐阅读
- mysql - JPQL 未在服务器上运行
- angular - 构建 Angular 库时是否可以使用自定义 Webpack 配置?
- shell - 使用`sed`包装字符串
- php - Symfony Messenger 中没有配置处理程序
- android-webview - 动态图像无法加载,显示为 text/html MIME 类型,修复 webview?
- django - Django url 渲染
- flutter - 如果值等于其他值,则 Dart 删除项目表单列表
- vue.js - Vue scss 样式加载因 mocamapck 失败
- go - GoLang WebCrawling 删除空标签
- antd - Ant 设计输入验证仅接受字母和特殊字符,但不接受数字