大家好。我正在嘗試了解這是否可行。我一直在#!/bin/sh模式下(用 bash 解釋)撰寫腳本一段時間,但我正在學習 bash-isms 并且正在使用#!/bin/bash. 我正在使用shellcheck并checkbashisms幫助我,我想知道我希望完成的事情是否很容易。我stat -s在一個填充變數的腳本中使用,我試圖遍歷它們以列印到螢屏。下面是最少量的代碼,它演示了我的要求。
我無法完全找到之前提出的類似問題。我有一種感覺,陣列可能是實作我希望的方式,但我想我會問這個。
!/bin/bash
T_FILE=/var/log/fsck_hfs.log
s_vars=( st_dev=0\
st_ino=0\
st_mode=0\
st_nlink=0\
st_uid=0\
st_gid=0\
st_rdev=0\
st_size=0\
st_atime=0\
st_mtime=0\
st_ctime=0\
st_birthtime=0\
st_blksize=0\
st_blocks=0\
st_flags=0 )
eval "$(stat -s "$T_FILE")"
printf "\n\n%d\n\n" "$st_size"
for var in "${s_vars[@]}"; do
printf "%s\n" "$var"
done
由于您中經驗豐富的人可能會立即注意到我for使用 bash-ism 的回圈將在 s_var 中列印文字,我希望它們列印值。我想我完全以錯誤的方式解決這個問題,所以任何指標都將不勝感激。我已經嘗試%s將該for回圈中的格式說明符更改為 a%d但它正確地指出invalid number.
這是我的代碼的示例運行:
king:photosync hank$ ./stat.sh
3614
st_dev=0
st_ino=0
st_mode=0
st_nlink=0
st_uid=0
st_gid=0
st_rdev=0
st_size=0
st_atime=0
st_mtime=0
st_ctime=0
st_birthtime=0
st_blksize=0
st_blocks=0
st_flags=0
king:photosync hank$
uj5u.com熱心網友回復:
像這樣:
#!/bin/bash
t_file=/var/log/fsck_hfs.log
s_vars=(
# Remove =0
# remove slashes
# Just list the names
# you can safely put newlines and comments in array declaration
st_blksize
st_blocks
st_flags
# etc...
)
eval "$(stat -s "$t_file")"
for var in "${s_vars[@]}"; do
printf "%s=%s\n" "$var" "${!var}"
# ^^^^^^^ - bash indirect expansion
done
例如,您可以從命令的輸出中提取變數串列,假設輸出很好,每行一行var=val,例如:
tmp=$(stat -s "$t_file")
s_vars=( $(sed 's/=.*//' <<<"$tmp") ) # I know, shellcheck
eval "$tmp"
for i in "${s_vars[@]}"; do
....
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323972.html
標籤:猛击
上一篇:在shell腳本中使用字串的條件`if`陳述句以不同的方式配置兩臺計算機(Ubuntu/Gnome與Debian/XCFE)
