You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

直接运行正常的Bash命令放入sh文件报错或不生效怎么解决?

问题原因与解决方案

两个报错的根因

  • 第一个<符号语法报错:你调用sh执行脚本时,使用的是POSIX标准的shell(多数Linux发行版默认sh指向dash),不支持Bash特有的进程替换(<())、数组操作等语法。你直接在终端执行正常是因为默认交互式shell为Bash。
  • 第二个管道写法无实际执行效果:管道连接的所有命令都运行在独立子shell中,你在while循环中给dbarray数组赋值的操作仅在子shell生效,循环结束回到父shell后dbarray为空,for循环无内容可遍历,所以直接执行完毕。

&&拼接写法合理性说明

你的写法完全合理,&&会保证前一个命令执行成功(返回码为0)才会执行下一个命令,完全符合你要求的“前一个执行完成再执行后一个”的逻辑。

修正后可直接运行的脚本

首先注意你原命令中-pMYPASSWD,多了一个多余的逗号,会导致数据库密码验证失败,修正后的完整脚本如下:

#!/bin/bash
# 声明存储url的数组
declare -a dbarray

# 从MySQL读取结果存入数组
while read -r 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)

# 遍历数组调用wget访问
for dbname in "${dbarray[@]}"; do
    wget --no-check-certificate "$dbname" -O /dev/null > /dev/null 2>&1
done

# 销毁数组变量
unset dbarray

优化说明:新增read -r避免url中的转义字符被错误处理;用"${dbarray[@]}"遍历数组避免url含空格等特殊字符时的拆分错误;所有变量加双引号兼容特殊字符场景。

执行方式

不要使用sh myfile.sh调用,选择以下两种方式之一即可:

  1. 给脚本加执行权限后直接运行:
chmod +x myfile.sh && ./myfile.sh
  1. 显式调用Bash执行脚本:
bash myfile.sh

内容的提问来源于stack exchange,提问作者svcd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:51:01