Shell脚本问题:父脚本循环调用a.sh仅执行一次问题咨询
问题原因与修复方案
问题根因
- 通配符被双引号包裹导致未展开:你在for循环的遍历范围里把
../hostchng/*写在了双引号内,Shell不会对双引号内部的*通配符做展开,最终整个循环只会拿到../hostchng/*这一个字符串值,因此循环仅执行1次。 - 若你使用
source执行a.sh的场景下,a.sh如果存在exit语句,也会直接终止父脚本run.sh的运行,导致循环只执行一次。
修复后的代码
修改后run.sh内容
#!/bin/bash echo "$$" # 去掉通配符外的双引号,让Shell正常展开匹配到的所有文件 for fname in ../hostchng/* do echo "$fname" # 如果不需要复用a.sh里的变量、函数,建议直接执行而非source,避免父子脚本互相影响 bash ./a.sh "$fname" done
a.sh内容(可保留不变,建议加上执行权限)
给a.sh加执行权限的命令:chmod +x a.sh
echo "test $1 $$"
补充说明
遍历文件名时建议给变量加上双引号,比如"$fname",避免文件名包含空格、特殊字符时执行出错。
内容的提问来源于stack exchange,提问作者wei zhang
相关产品推荐
相关产品推荐

