カウンターを使用するwhileループは、ユーザーが入力した整数を利用します。

カウンターを使用するwhileループは、ユーザーが入力した整数を利用します。

私はスクリプトを書いていますが、ある時点でユーザー入力を受け取り、次のようにカウンタを整数値として使用したいと思います。

read -p "How many bytes would you like you replace :> " $numOfBytes
echo "$numOfBytes bytes to replace"
while [ $counter -le $numOfBytes ]
do
    echo "testing counter value = $counter"
    let $counter++
done

私が理解したのは、numOfBytes変数を文字列として扱うため、現在は機能しません。

文字列をintに変換するにはどうすればよいですか?これは可能ですか?他のオプションがありますか?

答え1

整数を読み、1から対応する整数までループを実行して、繰り返しごとに数字を印刷しようとしています。

#!/bin/bash

read -p 'number please: ' num

for (( i = 1; i <= num; ++i )); do
    printf 'counter is at %d\n' "$i"
done 

$値を読み取るときは使用されません。$var変数の値を取得しましたが、知っておくべきvarことread名前その値ではなく、読み取る変数の名前。

またはwhileループを使用してください。

#!/bin/bash

read -p 'number please: ' num

i=0
while (( ++i <= num )); do
    printf 'counter is at %d\n' "$i"
done

inは算術コンテキスト(( ... ))です。bashこの場合、変数を追加する必要はなく、$変数の値は整数として解釈されます。

または/bin/sh

#!/bin/sh

printf 'number please: ' >&2
read num

i=1
while [ "$i" -le "$num" ]; do
    printf 'counter is at %d\n' "$i"
    i=$(( i + 1 ))
done

-le(「小さいか等しい」)テストは両方とも機能するはずです。リーダー変数拡張(このコードでは)。たとえば、引用符で囲まれていない場合、[ $i -le $num ]2つの変数のいずれかにシェルワイルドカード文字またはスペースが含まれていると、予期しない結果やエラーが発生する可能性があります。また、参照はIFS変数に数値が含まれている場合に数値を保護します。

関連質問:

答え2

特定の問題を解決するには:

文字列をintに変換するにはどうすればよいですか?

私の答えはいいえです。シェル変数はすべて文字列ですが、使用される状況に応じて整数または文字列として扱うことができます。コマンド-le演算子[(コマンドとも呼ばれる)の場合、test変数は整数として扱われます。

# integer comparison
$ var=25; test "$var" -le "$HOME"
bash: test: /home/username: integer expression expected
$ test "$var" -le 30 && echo Lower
Lower
# string comparison
$ test $var = 24 && echo 'same string' || echo 'different string'
different string
$ test $var = 25 && echo 'same string' || echo 'different string'
same string

スクリプトはcounter変数を初期化してin$とから削除する必要があります。numOfBytesread$let

#!/bin/bash

read -p "How many bytes would you like you replace :> " numOfBytes
echo "$numOfBytes bytes to replace"
counter=0
while [ "$counter" -le "$numOfBytes" ]
do
    echo "testing counter value = $counter"
    let counter++
done

仕組みは次のとおりです。

$ ./counter.sh 
How many bytes would you like you replace :> 5
5 bytes to replace
testing counter value = 0
testing counter value = 1
testing counter value = 2
testing counter value = 3
testing counter value = 4
testing counter value = 5

let/bashキーワードはkshスクリプトの移植性を低下させます。算術拡張を使用することをお勧めしますcounter=$((counter+1))POSIX シェル言語標準(セクション2.6.4)。

また見なさい:https://askubuntu.com/a/939299/295286


〜のようにストームドラゴンシェル変数がそのコンテキストに従って処理されるという事実は、ユーザーの入力を削除する必要があることを意味します。 1つの可能なアプローチは、移植numOfBytes可能な宣言をcase統合することです。この回答、入力が実際に数値であることを確認する役割を果たします。

答え3

Bashには実際に割り当て可能なタイプはありません。変数は宣言された型です。したがって、変数をとして宣言するとabc文字列になります。と宣言されると138intです。 Bashは実際には素数を処理しないので、変数を宣言すると138.0文字列として扱われます。

0したがって、からまで繰り返すことができないため、ユーザー入力に注意する必要がありますabc。以下は、ループでエラーチェックを実行してバイトを増やす例です。

#!/bin/bash

# Handle non-numeric input
read -p "How many bytes would you like you replace :> " numOfBytes
while [[ ! "$numOfBytes" =~ ^[0-9]+$ ]]; do
    echo
    echo "Please enter whole numbers only:"
    read -p "How many bytes would you like you replace :> " numOfBytes
done

echo "$numOfBytes bytes to replace $numOfBytes"
for i  in $(seq $numOfBytes) ; do
    echo "i has been incremented to $i."
done
exit 0

関連情報