Shell-Script

用於 while 循環和模數的 shell 腳本中的正確類型轉換

  • June 29, 2016

我正在嘗試編寫一個腳本來獲得一個隨機的,甚至是十六進制數。我發現該openssl命令有一個方便的選項來創建隨機十六進制數。不幸的是,我需要它是均勻的,我的腳本在某處有一個類型轉換錯誤。Bash 認為我新生成的十六進制數是一個字元串,所以當我嘗試將其修改為 2 時,腳本會失敗。這是我到目前為止所擁有的:

...
hexVal="$(openssl rand -hex 1)"
while [ `expr $hexVal % 2` -ne 0 ]
do
   hexVal="$(openssl rand -hex 1)"
done
...

我也嘗試了各種其他組合,但無濟於事。如果有人能告訴我我的語法有什麼問題,將不勝感激。

使用 bash

要以十六進制生成偶數隨機數:

$ printf '%x\n' $((2*$RANDOM))
d056

或者:

$ hexVal=$(printf '%x\n' $((2*$RANDOM)))
$ echo $hexVal
f58a

要將輸出限制為較小的數字,請使用模,%

$ printf '%x\n' $(( 2*$RANDOM % 256 ))
4a

使用 openssl

如果您真的想使用循環解決方案openssl

while hexVal="$(openssl rand -hex 1)"
do
   ((0x$hexVal % 2 == 0)) && break
done

0x表示後面的數字是十六進制的信號。

在 bash 中轉換數字的規則

來自man bash

以 0 開頭的常量被解釋為八進制數。 前導 0x 或 0X 表示十六進制。 否則,數字採用形式

$$ base# $$n,其中可選基數是 2 到 64 之間的十進制數,表示算術基數,n 是該基數中的數字。如果省略 base#,則使用基數 10。指定 n 時,大於 9 的數字按小寫字母、大寫字母、@ 和 _ 的順序表示。如果 base 小於或等於 36,則可以互換使用小寫和大寫字母來表示 10 到 35 之間的數字。$$ Emphasis added $$

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