【问题标题】:Execute command (function) from a variable in a script从脚本中的变量执行命令(函数)
【发布时间】:2019-04-26 22:51:59
【问题描述】:

所以,我想创建一个脚本,用于从网站检查某事。我有一个包含不同网站的文本文件,我想同时检查所有网站。为此,我在一个调用函数的变量中逐步创建一个命令,该函数将检查每个网站。这是我的代码:

checkWebsite(){
    WEBSITE="$2"
    echo "Parameter is $WEBSITE"
}

COUNTER=0;

input=websites.txt

myCommand=()
while IFS= read -r line
do
    if [[ "$line" != "#"* ]]; #ignoring comments if there are any
    then
        myCommand[COUNTER]="checkWebsite $line"
        COUNTER=$((COUNTER + 1))
        myCommand[COUNTER]=" & "
        COUNTER=$((COUNTER + 1))
    fi
done < "$input"

unset 'myCommand[${#myCommand[@]}-1]' #deleting the last " & "

echo "MY COMMAND: "
echo ${myCommand[@]}
echo " "

echo ${myCommand[0]}
checkWebsite ${myCommand[0]}
"${myCommand[0]}"

结果如下: results

如您所见,如果我从脚本中调用该函数一切正常,但如果我从变量中调用该函数,则它不起作用。我理解为什么会发生这种情况(就像我从终端运行该命令)但我不知道当我从变量执行命令时如何让它从脚本运行函数。有谁知道我怎样才能做到这一点?

提前致谢

【问题讨论】:

  • 把它放在一个变量中会使它变得比它必须的更难和更混乱。你有什么理由不直接运行它吗?
  • 问了很多次:bash command parameter substitution site:stackoverflow.com。您想要哪个作为您的副本?
  • 另见BashFAQ #50"${myCommand[0]}" 完全违背了使用数组的全部目的——仅取消第一个元素意味着它只是另一个字符串。
  • 顺便说一句,declare -p myCommandecho ${myCommand[@]} 让您更准确地了解数组的内容。 (就此而言,printf '%q\n' "${myCommand[@]}" 也是一种改进)。

标签: linux bash shell terminal sh


【解决方案1】:

不要在这里使用数组。它会带来很多麻烦,并且不会增加任何价值。相反,在循环中启动你的后台任务:

while IFS= read -r line; do
  [[ "$line" = "#"* ]] || checkWebsite "$line" &
done < "$input"

如果您真的想要一个数组,请从循环中填充它,然后——再次——在没有它的情况下单独启动项目。

websites=( )
while IFS= read -r line; do
  [[ "$line" = "#"* ]] || websites+=( "$line" )
done < "$input"

for site in "${websites[@]}"; do
  checkWebsite "$site" &
done

为什么其他方法不起作用? 因为&amp;在解析为语法时只充当命令分隔符,而参数扩展结果是数据,而不是语法

您需要使用eval 将您的展开结果解析为语法;除非非常小心,否则这将导致严重的安全漏洞。

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 2011-12-03
    • 2011-06-04
    • 2015-04-19
    • 2011-10-16
    • 1970-01-01
    • 2020-12-18
    • 2015-04-24
    相关资源
    最近更新 更多