私はスクリプトを書いていますが、ある時点でユーザー入力を受け取り、次のようにカウンタを整数値として使用したいと思います。
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$
とから削除する必要があります。numOfBytes
read
$
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
文字列になります。と宣言されると138
intです。 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