mik*_*759 4 command-line bash scripts
我很难让 for 循环以我创建的函数的参数形式接受用户输入。
#!/bin/bash
number1="$1" #Assume user input 5
loops="$2" #Assume user input 5
if [[ ${number1} && ${loops} =~ ^-?[0.00-9.99]+$ ]];then
for number2 in {1..${loops}}
do
Product=$(echo "${number1} * ${number2}" | bc -l)
echo "${number1} * ${number2} = ${Product}"
if test ${number2} -eq 7;then
{ echo "----------------------"; echo "${number2} is the best number."; echo "----------------------"; continue; }
elif test ${number2} -eq 11;then
{ echo "------------------------------"; echo "${number2} is pretty awesome as well."; echo "------------------------------"; continue; }
fi
done
else
{ echo "Please try again with a valid numerical entry."; exit 1; }
fi
Run Code Online (Sandbox Code Playgroud)
当用户为变量“loops”输入整数和为“number1”输入任何数字时,此脚本不会运行。在这种情况下,number1 = 5。它返回错误:
(standard_in) 1: 语法错误
5 * {1..5} =
/home/$USER/For_Loop_Multiplication.sh:第 9 行:测试:{1..5}:预期的整数表达式
/home/$USER/For_Loop_Multiplication.sh:第 11 行:测试:{1..5}:预期的整数表达式
如果我直接将循环数的结束边界直接输入到脚本中,如下所示,并且 number1 = 5,它运行良好:
#!/bin/bash
number1="$1" #Assume user input 5
if [[ ${number1} =~ ^-?[0.00-9.99]+$ ]];then
for number2 in {1..5}
do
Product=$(echo "${number1} * ${number2}" | bc -l)
echo "${number1} * ${number2} = ${Product}"
if test ${number2} -eq 7;then
{ echo "----------------------"; echo "${number2} is the best number."; echo "----------------------"; continue; }
elif test ${number2} -eq 11;then
{ echo "------------------------------"; echo "${number2} is pretty awesome as well."; echo "------------------------------"; continue; }
fi
done
else
{ echo "Please try again with a valid numerical entry."; exit 1; }
fi
Run Code Online (Sandbox Code Playgroud)
它返回结果:
5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25
基本上我认为正在发生的是脚本似乎将整个范围作为值 number2 放置,它被定义为 for 循环中的迭代器。由于变量“loops”的输入是一个整数,因此在向用户询问范围并将其放入循环中或在我编写脚本时将其设置为默认值之间应该没有区别。然而,显然有区别......任何解决这个问题的见解都值得赞赏。谢谢。
问题是这一行:
for number2 in {1..${loops}}
Run Code Online (Sandbox Code Playgroud)
这是一个优先顺序的问题。如中所述man bash
:
展开的顺序是:大括号展开;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和路径名扩展。
因此,大括号扩展发生在变量扩展之前。因此,当大括号展开时,$loops
尚未评估为5
。这意味着{1..$loops}
(您不需要第二个{}
)扩展为字符串,{1..5}
而不是从 1 到 5 的数字序列。如果您使用字符串而不是变量,则会发生同样的事情:
$ echo {1..5} ## works: prints a sequence
1 2 3 4 5
$ echo {1..foo} ## fails: prints a string with no expansion
{1..foo}
Run Code Online (Sandbox Code Playgroud)
作为解决方法,您可以使用seq
:
for number2 in $(seq 1 "$loops"); do ...
Run Code Online (Sandbox Code Playgroud)
或者,更好的是,正确的工作循环:
for((number2=0;number2<=$loops; number2++)); do ...
Run Code Online (Sandbox Code Playgroud)
注意:作为一般规则,您还应该始终引用您的变量。