我正在创建一个脚本,要求用户输入一条消息,然后他们想要显示该消息多少次。
这是我到目前为止所拥有的。
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}
由于这是 shell 执行某些操作的顺序问题,因此没有解决方法。您根本不能在大括号扩展中以这种方式使用变量。你必须找到一种不同的方法来做到这一点。例如,使用seq
:
for i in $(seq 1 "$REPEAT"); do
echo "${MESSAGE}"
done
或者:
for((i=0;i<=$REPEAT;i++)); do
echo "${MESSAGE}"
done