web-dev-qa-db-ja.com

数値(bashスクリプトの変数)から最初の数字を抽出するにはどうすればよいですか?

変数numbers=$@ どこ $@はユーザー入力からのものです。ユーザーが./script.sh 901.32.02と最初の桁を取得したい9を別の変数に格納します。これどうやってするの?するように言われた

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

しかし、もし私がecho $varだけではなく9

5
Rashad

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

${parameter:offset:length}

例:

$ var=901.32.02
$ first_char="${var:0:1}"
$ echo "${first_char}"
9
9
nxnev
numbers='901.32.02'
firstdigit="${numbers:0:1}"

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

上記の結果は

The first digit is "9"

bash${numbers:0:1}パラメータ展開により、文字列の先頭から0の長さ(オフセット0)の部分文字列が得られます。これは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]}は、各文字がarraynumbersの個別の要素である場合(および最初の文字が数字の場合)機能します。 numbersは配列ではないため、$numbersと同じです。

4
Kusalananda

以下の方法も使用できます

cat script.sh

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



 sh script.sh 90

Where 90 is the user input

出力は9

3

同僚と

echo '901.32.02' | colrm 2
2
ctac_

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

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

$ varは数字であるか空です(宣言されていない場合でも)。

0
Marco