Bash脚本中如何打印stat -s生成的各变量实际值而非字面量
问题原因
你当前的写法有两个核心问题:
s_vars数组里存储的是st_dev=0这类完整的字符串字面量,不是st_dev这种纯变量名- 你没有使用bash的间接变量引用语法来读取动态变量名对应的值,自然只能输出数组里的固定字符串。你把格式符改成
%d会报错,是因为传入格式化的参数是字符串而不是数字,报错属于正常现象。
修复方案
你可以直接使用bash专属的间接变量引用语法${!变量名}实现需求,修改后的代码如下:
#!/bin/bash T_FILE=/var/log/fsck_hfs.log # 数组仅存储变量名,不要带默认值后缀 s_vars=( st_dev st_ino st_mode st_nlink st_uid st_gid st_rdev st_size st_atime st_mtime st_ctime st_birthtime st_blksize st_blocks st_flags ) # 先给所有变量赋默认值0,替代你之前写在数组里的默认值 for var in "${s_vars[@]}"; do declare "$var=0" done # 执行stat赋值,会覆盖上面的默认值 eval "$(stat -s "$T_FILE")" printf "\n\n%d\n\n" "$st_size" # 循环用间接引用取值 for var in "${s_vars[@]}"; do printf "%s=%d\n" "$var" "${!var}" done
运行后就会输出每个属性的实际值,而不是固定的0。
如果你不需要保留默认值,可以直接删掉赋默认值的循环代码,逻辑更简洁。
内容的提问来源于stack exchange,提问作者LearningDaily
相关产品推荐
相关产品推荐

