以sudo用户运行调用外部脚本的Bash脚本问题求助
排查并修复你的Bash脚本问题
看你提供的脚本片段,里面有几个明显的语法和逻辑问题,我帮你逐一梳理并修复:
主要问题点分析
- 未完成的for循环:
for eachTable in "..."这是无效写法,你应该是想遍历之前拆分出的tableNamesArray数组,但语法写错了。 - 注释的sudo su块存在潜在风险:如果后续要启用这个块,
sudo su <<WRAPPER没有对应的闭合标记WRAPPER,而且sudo su会启动全新的shell,原脚本中的变量(比如databaseName、tableNamesArray)在子shell里无法直接访问。 - 缺少参数校验:脚本没检查用户是否传入了
databaseName和tableNames参数,若参数为空会导致后续逻辑直接出错。 - 数组遍历的边界问题:如果
tableNames为空,read命令会生成空数组,后续遍历无意义,需要提前做判断。
修复后的完整脚本
#!/bin/bash # 校验参数是否齐全 if [ $# -ne 2 ]; then echo "错误:请传入两个参数,格式为:$0 <数据库名> <表名列表(逗号分隔)>" exit 1 fi databaseName="${1}" tableNames="${2}" # 拆分表名为数组,兼容空输入场景 IFS=',' read -r -a tableNamesArray <<< "${tableNames}" # 若需要以sudo身份执行逻辑,建议直接用sudo调用命令而非切换shell # 示例:sudo bash -c 'echo "需要sudo执行的内容"' # 一定要切换用户的话,需显式传递变量: # sudo su -c "echo 'Tables inside ${databaseName} are ::: ${tableNamesArray[@]}'" echo "Tables inside ${databaseName} are ::: ${tableNamesArray[@]}" echo "-- SQL FILE --" > "${databaseName}_schema.hql" echo "$tableNames" echo "${tableNamesArray[@]}" # 正确遍历数组的写法 for eachTable in "${tableNamesArray[@]}" do echo "正在处理表:${eachTable}" # 在这里添加你的表处理逻辑,比如写入SQL到文件 echo "处理表 ${eachTable} 的SQL语句" >> "${databaseName}_schema.hql" done
关键修复说明
- 参数校验:添加
if [ $# -ne 2 ]判断,确保用户传入正确数量的参数,避免空值引发的异常。 - 数组遍历修正:把无效的
for eachTable in "..."改成for eachTable in "${tableNamesArray[@]}",实现对拆分后表名数组的正确遍历。 - sudo执行的正确姿势:不建议用
sudo su切换shell(会丢失当前变量),直接用sudo bash -c "命令"更稳妥;如果必须切换用户,要显式传递变量。 - 文件名安全:给文件名变量
${databaseName}_schema.hql加上双引号,避免databaseName包含空格或特殊字符时出现文件创建错误。 - 空输入兼容:即使
tableNames为空,read命令生成的空数组会被遍历逻辑自动跳过,不会触发报错。
你可以根据实际需求调整后续的表处理逻辑,比如生成对应SQL语句写入hql文件。
内容的提问来源于stack exchange,提问作者ChikuMiku
相关产品推荐
相关产品推荐

