因此,我想创建一个脚本,从网站检查某事。我有一个包含不同网站的文本文件,我想同时检查所有网站。为此,我在一个调用函数的变量中逐步创建了一个命令,该函数将检查每个网站。这是我的代码:
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
如您所见,如果我从脚本中调用函数,一切正常,但是如果我从变量中调用函数,则无法正常工作。我知道为什么会发生这种情况(就像我从终端运行该命令一样),但是当我从变量执行命令时,我不知道如何使它从脚本运行函数。有人知道我该怎么做吗?
预先感谢
答案 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
来将扩展结果解析为语法;除非格外小心,否则将导致严重的安全漏洞。