我有一個來自 bash 的值陣列,我只想檢查其中是否有數字。它可以在開頭或結尾包含-, 數字和空格,因為 bash 將其評估為 sting。
由于每個數字都, 在末尾表示,因此我將其添加(,)到正則運算式中。
基本上我想檢查元素是否是數字。
的$val樣子這些。
[ [ -0.13450142741203308, -0.3073260486125946, -0.15199440717697144, -0.06535257399082184, 0.02075939252972603, 0.03708624839782715, 0.04876817390322685 ] ,[ 0.10357733070850372, 0.048686813563108444, -0.1413831114768982, -0.11497996747493744, -0.08910851925611496, -0.04536910727620125, 0.06921301782131195, 0.02547631226480007 ] ]
這是我的代碼,它查看每個值并評估每個值。然而,它似乎沒有抓住這些案例。
re='^[[:space:]][ -]?[0-9] ([.][0-9] )?(,)[[:space:]]$'
for j in ${val[*]}
do
if ! [[ "$j" =~ $re ]] ; then
echo "Error: Not a number: $j"
fi
done
它還需要忽略 throw[或]or 的情況],。
任何想法如何糾正這個?謝謝您的幫助。
uj5u.com熱心網友回復:
它很可能$val以字串的形式出現在您身上。
如果您不需要將每個數字驗證為完全合法的數字,您可以使用 shell 邏輯來過濾那些明顯不是數字的東西:
val='[ [ -0.13450142741203308, -0.3073260486125946, -0.15199440717697144, -0.06535257399082184, 0.02075939252972603, 0.03708624839782715, 0.04876817390322685 ] ,[ 0.10357733070850372, 0.048686813563108444, -0.1413831114768982, -0.11497996747493744, -0.08910851925611496, -0.04536910727620125, 0.06921301782131195, 0.02547631226480007 ] ]'
for e in $val; do # PURPOSELY no quote to break on spaces
e="${e/,}"
case $e in
''|*[!0-9.\-]*) printf "'%s' is bad\n" "$e" ;;
*) printf "'%s' is good\n" "$e" ;;
esac
done
印刷:
'[' is bad
'[' is bad
'-0.13450142741203308' is good
'-0.3073260486125946' is good
'-0.15199440717697144' is good
'-0.06535257399082184' is good
'0.02075939252972603' is good
'0.03708624839782715' is good
'0.04876817390322685' is good
']' is bad
'[' is bad
'0.10357733070850372' is good
'0.048686813563108444' is good
'-0.1413831114768982' is good
'-0.11497996747493744' is good
'-0.08910851925611496' is good
'-0.04536910727620125' is good
'0.06921301782131195' is good
'0.02547631226480007' is good
']' is bad
']' is bad
這是超快的,但會在格式錯誤的“數字”上失敗,例如 123-456
如果您確實需要過濾掉格式錯誤的數字,您可以使用awk:
echo "$val" | awk -v RS="[^0-9. -] " '($0 0==$0)'
# all legit numbers from the string...
uj5u.com熱心網友回復:
如果您$val使用給定的字串填充,則它不是陣列,而是字串。使用它不加引號會對它應用單詞拆分,將它拆分為空格分隔的單詞。空格不是單詞的一部分,并且一些單詞(每個括號中的最后一個)不以逗號結尾:
#! /bin/bash
val='[ [ -0.13450142741203308, -0.3073260486125946, -0.15199440717697144, -0.06535257399082184, 0.02075939252972603, 0.03708624839782715, 0.04876817390322685 ] ,[ 0.10357733070850372, 0.048686813563108444, -0.1413831114768982, -0.11497996747493744, -0.08910851925611496, -0.04536910727620125, 0.06921301782131195, 0.02547631226480007 ] ]'
re='^[ -]?[0-9] ([.][0-9] )?,?$'
for j in $val ; do
if ! [[ $j =~ $re ]] ; then
echo "Error: Not a number: $j"
fi
done
要使用 bash 陣列,請使用圓括號宣告它并使用空格分隔元素:
#! /bin/bash
val=(-0.13450142741203308 -0.3073260486125946 -0.15199440717697144 -0.06535257399082184 0.02075939252972603 0.03708624839782715 0.04876817390322685 0.10357733070850372 0.048686813563108444 -0.1413831114768982 -0.11497996747493744 -0.08910851925611496 -0.04536910727620125 0.06921301782131195 0.02547631226480007)
re='^[ -]?[0-9] ([.][0-9] )?$'
for j in "${val[@]}" ; do
if ! [[ $j =~ $re ]] ; then
echo "Error: Not a number: $j"
fi
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/356296.html
