sh 文件中的语法错误,但命令在 bash 上工作

Syntax error in sh file but command working on bash

我是 bash 的新手所以这一定是个小问题(我希望如此)但找不到问题的根源。

我有一个名为“url”的 mysql 数据库 table,里面装满了 url。我想要的是获取所有列表并使用 wget 访问它们。仅此而已。

我有这个命令,直接在 bash 中启动有效:

while read dbname; do dbarray+=("$dbname"); done < <(mysql -u MYUSER -pMYPASSWD, -e 'select url from mydb.url where borrado="n" and status=200 and id_idioma = 1 order by id_url asc' -B -N -s --skip-column-names) && for dbname in `echo ${dbarray[*]}`; do wget --no-check-certificate $dbname -O /dev/null > /dev/null 2>&1; done && unset dbarray

但是如果我把它放到一个 sh 文件中并执行它会抛出一个错误(请注意第 3 行是命令):

line 3: Syntax error near unexpected token `<'

我试图避免 <() 管道方法使用“传统”管道,但同样,它可以直接在 bash 中作为命令执行,但不能在 .sh 文件中执行

 mysql -u MYUSER -pMYPASSWD -e 'select url from mydb.url where borrado="n" and status=200 and id_idioma = 1 order by id_url asc' -B -N -s --skip-column-names | while read dbname; do dbarray+=("$dbname"); done && for dbname in `echo ${dbarray[*]}`; do wget --no-check-certificate $dbname -O /dev/null > /dev/null 2>&1; done && unset dbarray

在这种情况下不会抛出错误,但它需要 1 秒才能完成并什么都不做,不会访问任何 link..

尝试执行 ./myfile.shsh myfile.sh,但没有成功..

你能帮我从一个 sh 文件让它工作,或者让我明白问题出在哪里吗?

请注意它有 3 个命令与 && 连接:1 获取所有 urls 并用它们创建一个 var,2 循环 var 和 wget 每次迭代,3 删除 var。 我认为这是正确的方法,但也许我错了。显然必须等到芬兰1做2,芬兰2做3,才是我想要的。按照您的观点,这是正确的近似值吗?

干杯

在管道中,正在子 shell 中设置变量。换句话说:

echo foo | while read a; do var="$a"; done
echo "$var"

将打印一个空行,因为 var 在 subshel​​l 退出时消失。解决这个问题的一种方法是:

echo foo | { 
    while read a; do var="$a"; done
    echo "$var"
}

或:

while read a; do var="$a"; done << EOF
$(echo foo)
EOF
echo "$var"

换句话说,你可以试试:

mysql ... \
| { 
       while read dbname; do dbarray+=("$dbname"); done
       for dbname in "${dbarray[@]}"; do 
           wget ... "$dbname" ...
       done; 
}

不再需要取消设置 dbarray,因为它会在块的末尾自动消失。使用 "${dbarray[@]}"$(echo ${dbarray[*]}) 更好 并且您当然希望 wget 调用中的 "$dbname" 周围有双引号。

请注意,这个数组似乎是不必要的。只需在 while/read 循环中直接执行 wget 而不是分配给数组。