You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本中如何打印stat -s生成的各变量实际值而非字面量

问题原因

你当前的写法有两个核心问题:

  1. s_vars数组里存储的是st_dev=0这类完整的字符串字面量,不是st_dev这种纯变量名
  2. 你没有使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:27:03