ユーザー入力から来る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に数字があるか空です(宣言されていません)。