[問題] 變數中有變數作判斷該如何作? (eval)

看板Linux作者 (霜降小P)時間8年前 (2017/08/25 18:38), 8年前編輯推噓3(3028)
留言31則, 4人參與, 最新討論串1/1
小弟在寫測試script時, 在使用eval上遇到了一些問題, 想請教: 因為Cmp${Num}_F代入的數值是小數, 所以又增加了bc來輔助, Code如下: 需求是判斷Cmp${Num}_F是否介於LOWER與UPPER之間, 但是在變數$Cmp${Num}_F放到if裡面的時候出了錯誤, 請問我該怎麼在if裡面使用這類型的變數? ##COMPARISON Amount=5 UPPER=1234.567 LOWER=12.3456 for ((Num=1 ; Num<Amount; Num++)) do eval Cmp${Num}_F=$(cat xxx.log |grep Cmp${Num}_F |awk 'print $2') done for (( Num=1 ; Num<$Amount ; Num++ )) do if [ `echo "`$Cmp${Num}_F` > $UPPER"|bc` -eq 1 ] || [ `echo "`$Cmp${Num}_F` < $LOWER"|bc` -eq 1 ]; then echo " Data in Range `eval echo '$'Cmp${Num}_F` Front: ($LOWER ~ $UPPER) " else echo " Data Not in Range" fi done -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.200.12.39 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1503657504.A.456.html

08/25 18:47, , 1F
變數用雙引號包起來 外層用單引號 ``改用$() 這樣試試?
08/25 18:47, 1F

08/25 20:04, , 2F
看不懂問題,用猜的. https://pastebin.com/5UHVFu7Z
08/25 20:04, 2F

08/25 20:15, , 3F
隨便看,但 > 在test []中應該要用-lt。然後是在單行多次用
08/25 20:15, 3F

08/25 20:15, , 4F
``時,一律用$()取代
08/25 20:15, 4F

08/25 23:21, , 5F
請問B大的意思是if [`echo "$(Cmp${Num}_F)"|bc` -eq 1]
08/25 23:21, 5F

08/25 23:22, , 6F
這樣嗎?
08/25 23:22, 6F

08/25 23:24, , 7F
這樣改的話會出現 Cmp1_F: command not found
08/25 23:24, 7F

08/25 23:24, , 8F
(standard_in) 1: syntax_error
08/25 23:24, 8F

08/25 23:26, , 9F
另外, OSD大的例子是變數$Num, 好像變成複合式變數用法上
08/25 23:26, 9F

08/25 23:27, , 10F
會變得不太一樣 , Cmp${Num}_F 是先前用eval宣告給值
08/25 23:27, 10F

08/25 23:47, , 11F
請問你加上 Cmp 和 _F 是做甚麼用途? 不懂你的問題..
08/25 23:47, 11F

08/25 23:50, , 12F
因為我希望變數是像 Cmp1_F Cmp2_F Cmp3_F....這樣下去的
08/25 23:50, 12F

08/25 23:52, , 13F
每一次迴圈Cmp${Num}_F變數代進來的小數值都會不同
08/25 23:52, 13F

08/25 23:53, , 14F
可是你沒 宣告 這些變數阿 : Cmp1_F Cmp2_F Cmp3_F
08/25 23:53, 14F

08/25 23:54, , 15F
其實實際上的變數是更煩人的 Cmp_raw${ID}_col${Num}_F
08/25 23:54, 15F

08/25 23:55, , 16F
哈...的確 因為我覺得那個宣告不是問題的重點XD
08/25 23:55, 16F

08/25 23:56, , 17F
我更改一下內文好了 等我一下
08/25 23:56, 17F
※ 編輯: apolog (111.249.33.106), 08/25/2017 23:59:57

08/25 23:56, , 18F
https://pastebin.com/ 在這邊放上程式碼,比較好解.
08/25 23:56, 18F
※ 編輯: apolog (111.249.33.106), 08/26/2017 00:03:20

08/26 00:05, , 19F
https://pastebin.com/X0EGcxPH 像這樣嗎? 第一次用
08/26 00:05, 19F

08/26 00:11, , 20F
xxx.log 呢? 如果log太多,自己簡化一下.
08/26 00:11, 20F

08/26 00:14, , 21F
https://pastebin.com/745Weu6K xxx.log 簡化大概長這樣
08/26 00:14, 21F
※ 編輯: apolog (111.249.33.106), 08/26/2017 00:16:34

08/26 00:22, , 22F
https://pastebin.com/ATYCtf8N 稍微修正一下eval
08/26 00:22, 22F

08/26 01:02, , 23F
參考看看這個答案 https://pastebin.com/EU4w0T8H
08/26 01:02, 23F

08/26 01:14, , 24F
樓上大大的方式可行喔! 不過這就代表if[]裡面不能使用這類
08/26 01:14, 24F

08/26 01:14, , 25F
型的疊加變數了 ~"~a 是嗎?
08/26 01:14, 25F

08/26 06:55, , 26F
if [ ... ] 裡面可以使用疊加變數,
08/26 06:55, 26F

08/26 06:55, , 27F
08/26 06:55, 27F

08/26 07:01, , 28F
完全不用eval版本, https://pastebin.com/YdPYphJ6
08/26 07:01, 28F

08/26 07:08, , 29F
很多大大都不建議用eval,
08/26 07:08, 29F

08/26 07:09, , 30F
參考最後的推文 https://goo.gl/e5B3jz
08/26 07:09, 30F

08/31 16:33, , 31F
沒想到O大後續還有提供正解! 已試過感謝 (跪拜
08/31 16:33, 31F
文章代碼(AID): #1Pd_uWHM (Linux)
文章代碼(AID): #1Pd_uWHM (Linux)