数字から最初の数字を抽出する方法(bashスクリプトの変数)? [コピー]

数字から最初の数字を抽出する方法(bashスクリプトの変数)? [コピー]

ユーザー入力から来るnumbers=$@変数を想定します。$@ユーザー入力と最初の数字を取得して別の変数に保存したいと./script.sh 901.32.02思います。9どうすればいいですか?私に言った

  for n in `seq 1 $count`
    do var=${numbers[0]}
  done

echo $varただし、代わりに入力内容全体を印刷するだけです9

答え1

Bashでは、次を使用して最初の文字を抽出できます。パラメータ拡張:

${parameter:offset:length}

例:

$ var=901.32.02
$ first_char="${var:0:1}"
$ echo "${first_char}"
9

答え2

numbers='901.32.02'
firstdigit="${numbers:0:1}"

printf 'The first digit is "%s"\n' "$firstdigit"

上記の結果は

The first digit is "9"

${numbers:0:1}パラメータ拡張は、bash文字列の先頭(オフセット0)から始まり、長さ1の部分文字列を提供します。これはbash特定のパラメータ置換です(他の一部のシェルにはありますがPOSIX標準にはありません)。

POSIXシェルでは、次のこともできます。

firstdigit=$( printf "%s\n" "$numbers" | cut -c 1 )

cutこれは最初の文字のみを返すために使用されます。

または標準パラメータ拡張を使用して

firstdigit="${numbers%${numbers#?}}"

これは最初に${numbers#?}最初の数字で文字列を作成するために使用されます。削除済み$numbersその後、使用の終わりから文字列を削除します${numbers%suffix}suffix最初の拡張の結果はどこにありますか?)。


上記の最初の文字$numbersは実際には数字です。そうでない場合は、最初に値の先頭から数字以外の数字を削除する必要があります。

numbers=$( printf '%s\n' "$numbers" | sed 's/^[^0-9]*//' )

または、

numbers="${numbers#${numbers%%[0-9]*}}"

${numbers[0]}各文字が別々の要素の場合に機能します。大量に numbers(最初の文字が数字の場合)配列ではないので、numbersと同じです$numbers

答え3

次の方法も使用できます。

cat script.sh

   #!/bin/bash
echo $1 | awk '{print substr($1,1,1)}'



 sh script.sh 90

Where 90 is the user input

出力は9

答え4

数値のみを検出し、他の文字タイプを検出しない場合は、単純な正規表現を使用する必要があります。

[[ ${numbers} =~ ^([[:digit:]]) ]] && var=${BASH_REMATCH[1]}

$ varに数字があるか空です(宣言されていません)。

関連情報