変数numbers=$@
どこ $@
はユーザー入力からのものです。ユーザーが./script.sh 901.32.02
と最初の桁を取得したい9
を別の変数に格納します。これどうやってするの?するように言われた
for n in `seq 1 $count`
do var=${numbers[0]}
done
しかし、もし私がecho $var
だけではなく9
。
Bashでは、 パラメータ展開 を使用して最初の文字を抽出できます。
${parameter:offset:length}
例:
$ var=901.32.02
$ first_char="${var:0:1}"
$ echo "${first_char}"
9
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
と同じです。
以下の方法も使用できます
cat script.sh
#!/bin/bash
echo $1 | awk '{print substr($1,1,1)}'
sh script.sh 90
Where 90 is the user input
出力は9
同僚と
echo '901.32.02' | colrm 2
(他の文字タイプではなく)数字のみを検出したい場合は、単純な正規表現を使用する必要があります。
[[ ${numbers} =~ ^([[:digit:]]) ]] && var=${BASH_REMATCH[1]}
$ varは数字であるか空です(宣言されていない場合でも)。