在 shell 脚本中使用替换字符串作为命令
Use substituted string as a command in shell script
鉴于下面列出的变量:
echo ${userupper}_PYTHON
# YTU_PYTHON
echo $YTU_PYTHON
# /home/ytu/anaconda3/bin/python
echo $path
# foo.py
现在我想用 userupper
和 path
执行 /home/ytu/anaconda3/bin/python foo.py
。我试过 $(${userupper}_PYTHON) $path
但它以错误消息结束,包括:
YTU_PYTHON: not found
foo.py: not found
似乎 $(${userupper}_PYTHON)
只是 YTU_PYTHON
而不是预期的 $YTU_PYTHON
。我应该怎么做才能正确?
编辑:
建议的复制应该已经解决了我的问题。但是由于某些未知原因,它无法正常工作。
#!/usr/bin/env bash
for user in ytu
do
. /home/${user}/.profile
userupper=$(echo ${user} | awk '{print toupper([=12=])}')
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
上面的代码块returns:
YTU_PYTHON
ytu_clinic249_monthly_report.py
/home/ytu/anaconda3/bin/python
send_monthly_reports.sh: 14: send_monthly_reports.sh: Bad substitution
,搞得我很懵
试试这个:
command=${userupper}_PYTHON
echo ${!command} $path # ommit echo if you want to execute command
在你的情况下它回显:
/home/ytu/anaconda3/bin/python foo.py
如果您想编写 bash 脚本,link 可能会有用。简而言之,您不应该解析 ls
输出。
你还创建了不必要的新进程,两行都是一样的:
$(echo ${user} | awk '{print toupper([=12=])}')
${user^^} #paramenter expansion
鉴于下面列出的变量:
echo ${userupper}_PYTHON
# YTU_PYTHON
echo $YTU_PYTHON
# /home/ytu/anaconda3/bin/python
echo $path
# foo.py
现在我想用 userupper
和 path
执行 /home/ytu/anaconda3/bin/python foo.py
。我试过 $(${userupper}_PYTHON) $path
但它以错误消息结束,包括:
YTU_PYTHON: not found
foo.py: not found
似乎 $(${userupper}_PYTHON)
只是 YTU_PYTHON
而不是预期的 $YTU_PYTHON
。我应该怎么做才能正确?
编辑:
建议的复制应该已经解决了我的问题。但是由于某些未知原因,它无法正常工作。
#!/usr/bin/env bash
for user in ytu
do
. /home/${user}/.profile
userupper=$(echo ${user} | awk '{print toupper([=12=])}')
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
上面的代码块returns:
YTU_PYTHON
ytu_clinic249_monthly_report.py
/home/ytu/anaconda3/bin/python
send_monthly_reports.sh: 14: send_monthly_reports.sh: Bad substitution
,搞得我很懵
试试这个:
command=${userupper}_PYTHON
echo ${!command} $path # ommit echo if you want to execute command
在你的情况下它回显:
/home/ytu/anaconda3/bin/python foo.py
如果您想编写 bash 脚本,link 可能会有用。简而言之,您不应该解析 ls
输出。
你还创建了不必要的新进程,两行都是一样的:
$(echo ${user} | awk '{print toupper([=12=])}')
${user^^} #paramenter expansion