从脚本中的变量执行命令(功能)

时间:2018-11-24 19:35:41

标签: linux bash shell terminal sh

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

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

如您所见,如果我从脚本中调用函数,一切正常,但是如果我从变量中调用函数,则无法正常工作。我知道为什么会发生这种情况(就像我从终端运行该命令一样),但是当我从变量执行命令时,我不知道如何使它从脚本运行函数。有人知道我该怎么做吗?

预先感谢

1 个答案:

答案 0 :(得分:3)

请勿在此处使用数组。这会带来很多麻烦,并且没有任何价值。而是在循环中启动后台任务:

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

为什么其他方法不起作用? 因为&仅在解析为语法时用作命令分隔符,并且参数扩展结果是 data ,而不是语法

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

相关问题