Shell-Script
用於 while 循環和模數的 shell 腳本中的正確類型轉換
我正在嘗試編寫一個腳本來獲得一個隨機的,甚至是十六進制數。我發現該
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 $$