Shell-Script

如何在 POSIX shell 腳本中檢查變數是否為整數(避免空格問題)?

  • April 25, 2022

我的 POSIXis_integer ()函式很長一段時間都是這樣的:

#!/bin/sh
is_integer ()
{
   [ "$1" -eq "$1" ] 2> /dev/null
}

然而,今天,我發現它壞了。如果數字周圍有一些空格,它也會令人驚訝地評估為true,我不知道如何解決這個問題。


正確(預期)行為的範例:

is_integer 123評估為true

不正確(意外)行為的範例:

is_integer ' 123'也計算為truefalse,但它顯然包含一個前導空格,因此在這種情況下,預計該函式將計算為。


請僅提供符合 POSIX 的建議。謝謝你。

#!/bin/sh
is_integer ()
{
   case "${1#[+-]}" in
       (*[!0123456789]*) return 1 ;;
       ('')              return 1 ;;
       (*)               return 0 ;;
   esac
}

僅使用 POSIX 內置函式。從規範中不清楚是否+1應該是整數,如果不是,+則從case行中刪除。

它的工作原理如下。${1#[+-]}刪除可選的前導符號。如果你留下的東西包含一個非數字,那麼它就不是一個整數,同樣如果你什麼都沒有。如果它不是整數,那麼它就是整數。

編輯:將 ^ 更改為 ! 否定字元類 - 感謝@LinuxSecurityFreak

引用自:https://unix.stackexchange.com/questions/598036