Unix Shell脚本在eggs目录创建文件后无法写入内容求助
问题诊断
- 工作路径逻辑错误
脚本执行cd eggs进入eggs目录后,后续遍历逻辑执行ls eggs,会尝试读取当前eggs目录下的eggs子目录,该子目录不存在导致ls无返回值,整个for遍历循环完全未执行,没有任何写入操作被触发,所以所有新建文件都是空的。 - 变量值未重置
while循环结束后,计数变量$file已经被累加到10,后续逻辑没有重置该变量的值,即使for循环能运行,也无法匹配0-9范围的随机数$RandomEgg,判断逻辑完全不符合预期。 - 循环变量未使用
for循环定义了遍历变量$files,但循环体中完全没有使用该变量,依然固定用值为10的$file拼接文件名,即使有写入操作也只会操作不存在的egg10文件,不会修改之前创建的egg0到egg9文件。 - 遍历写法不规范
使用for files in $(ls)的方式遍历文件,遇到文件名包含空格、特殊字符时会出现解析异常,属于不推荐的写法。
修复后可运行的代码
#!/bin/bash file=0 RandomEgg=$(( RANDOM % 10 )) # 直接拼接路径操作,不需要cd切换目录避免路径混乱 while [ $file -lt 10 ] do if [ "$file" -eq "$RandomEgg" ] then echo 'Found it!' > "eggs/egg$file" else echo 'Not Here!' > "eggs/egg$file" fi file=$(( file + 1 )) done
优化建议
- 不需要单独执行
touch创建空文件,echo重定向操作在目标文件不存在时会自动创建,减少冗余操作。 - 变量引用尽量包裹双引号,避免变量值包含特殊字符时出现解析错误。
- 优先使用路径拼接操作代替
cd切换工作目录,避免工作路径混乱引发的各类定位错误。 - 可以合并创建文件和写入内容的逻辑为一个循环,减少不必要的遍历操作,提升脚本运行效率。
内容的提问来源于stack exchange,提问作者Eroscameron
相关产品推荐
相关产品推荐

