Bash脚本检测磁盘可用空间时$4未绑定变量报错如何解决
问题根因
- 变量赋值语法错误:Bash变量赋值时等号两侧不允许有空格,你写的
available_diskspace= 'xxx'属于非法写法,等于先给变量赋值空值,再尝试把后面的字符串作为命令执行。 - 命令输出捕获错误:要把命令执行结果赋值给变量,必须用
$()(推荐用法)或反引号包裹命令,你使用的单引号只会把内容识别为普通字符串,不会触发命令执行。 - 引号嵌套逻辑错误:你开启了
set -u检查未绑定变量,错误的转义写法导致Bash把awk语句里的$4识别为Bash自身的位置变量,而脚本执行时没有传入第4个位置参数,所以触发了$4: unbound variable报错。 - 路径变量未正确展开:单引号包裹的内容不会触发变量解析,你写的
df $DISK_ROOT放在单引号里时,$DISK_ROOT不会被替换为实际的磁盘路径。 - 额外注意:df默认输出的是1KB块的数量,如果你需要的是字节数,需要给df加
-B1参数指定块大小为1字节。
修正方案
把第34行替换为以下内容即可:
available_diskspace=$(df -B1 "$DISK_ROOT" | awk 'NR==2 {print $4}')
补充建议:while循环的判断条件里最好给变量加双引号,避免变量为空时的语法报错:
while [ "$available_diskspace" -gt 5000000 ]
你直接在终端执行命令可以成功,是因为直接写的df /mnt/nfs1 | awk 'NR==2 {print $4}'没有嵌套引号问题,也没有变量赋值的语法错误,所以可以正常返回结果。
内容的提问来源于stack exchange,提问作者Serdar Ebeng
相关产品推荐
相关产品推荐

