Shell-Script
如何在 POSIX shell 腳本中檢查變數是否為整數(避免空格問題)?
我的 POSIX
is_integer ()
函式很長一段時間都是這樣的:#!/bin/sh is_integer () { [ "$1" -eq "$1" ] 2> /dev/null }
然而,今天,我發現它壞了。如果數字周圍有一些空格,它也會令人驚訝地評估為
true
,我不知道如何解決這個問題。正確(預期)行為的範例:
is_integer 123
評估為true
。不正確(意外)行為的範例:
is_integer ' 123'
也計算為true
false
,但它顯然包含一個前導空格,因此在這種情況下,預計該函式將計算為。請僅提供符合 POSIX 的建議。謝謝你。
#!/bin/sh is_integer () { case "${1#[+-]}" in (*[!0123456789]*) return 1 ;; ('') return 1 ;; (*) return 0 ;; esac }
僅使用 POSIX 內置函式。從規範中不清楚是否
+1
應該是整數,如果不是,+
則從case
行中刪除。它的工作原理如下。
${1#[+-]}
刪除可選的前導符號。如果你留下的東西包含一個非數字,那麼它就不是一個整數,同樣如果你什麼都沒有。如果它不是整數,那麼它就是整數。編輯:將 ^ 更改為 ! 否定字元類 - 感謝@LinuxSecurityFreak