ユーザー入力に応じてOS Xを繰り返す

ユーザー入力に応じてOS Xを繰り返す

ユーザーにメッセージを入力するように求めてから、必要なだけメッセージを表示するスクリプトを作成しています。

これが私が今まで持っているものです。

message.sh

#!/bin/bash

echo -en "Enter a message to display: "
read -r MESSAGE

echo -en "How many times would like to repeat it? "
read -r REPEAT

for i in {1.."${REPEAT}"}; do
 echo "${MESSAGE}"
done

実際の出力

たとえば、私が入力した場合こんにちはメッセージと5繰り返し回数のみ表示されます。こんにちは一度だけ。

期待される出力

Hello
Hello
Hello
Hello
Hello

ユーザーの入力に応じてどのように繰り返すことができますか?

答え1

優先順位の問題です。サポート拡張評価今後変数は次のとおりです。

$ foo="10"
$ echo {1.."$foo"}
{1..10}

またはさらに詳しく説明すると、次のようになります。

$ set -x
$ echo {1.."$foo"}
+ echo '{1..10}'
{1..10}

これに関する文書は次のとおりですman bash

拡張順序は、中かっこ拡張、パラメータと変数拡張、算術拡張、コマンドの置換(左から右へ)です。

つまり、useを使用しようとしたときに{1..$foo}bashが最初にすることは、中括弧拡張を評価することです。この時点で、変数はその値に置き換えられておらず、単なるものです$foo。したがって、bashが見るものは次のとおりです{1..SOMESTRING}

$ echo {1..SOMESTRING}
{1..SOMESTRING}

これは、シェルが特定のタスクを実行する順序による問題であるため、回避策はありません。中括弧拡張では、このように変数を使用することはできません。別の方法を見つける必要があります。たとえば、次のようにしますseq

for i in $(seq 1 "$REPEAT"); do
    echo "${MESSAGE}"
done

または:

for((i=0;i<=$REPEAT;i++)); do 
    echo "${MESSAGE}"
done

関連情報