目前正在使用bash程序根据arg line命令中的用户输入输出一串数字。
当我执行程序时,我收到错误
-c-0
在线查看让我相信错误是由不正确的语法引起的,但我似乎没有看到错误的语法是什么。删除line 3: [: missing `]'
修复了错误,但程序继续输出任何内容。
&&$var < 50
使用shellscript检查我编辑的代码:
#!/bin/bash
var=$1
if [ $var > 1&&$var < 50 ]; then
if [ $var%2 == 0 ]; then
$var = $var/2
echo $var ","
elif [ $var%2 == 1 ]; then
$var = 3 * $var + 1;
echo $var ","
fi
fi
我不再收到原始错误,但是,代码会循环一次,而不是每次都重新迭代并更新var的值。
我自己想出了最后一个问题的答案,现在代码编译并正确运行。谢谢所有帮助过的人。
答案 0 :(得分:2)
第3行是:
if [ $var > 1&&$var < 50 ]; then
&&
操作意味着该命令被解释为具有:
if [ $var > 1
后跟&&
和$var < 50 ];
- 这不是test
(又名[
)的正确语法。当调用[
时,最后一个参数必须是]
;这就是为什么你收到有关“遗失]
”的消息。此外,此上下文中的关系运算符是I / O重定向,而不是传递给[
命令的比较器。
间距在shell脚本中很重要;不要玩间距的可爱游戏,也不要冒险。
使用以下其中一项:
if [ "$var" -gt 1 ] && [ "$var" -lt 50 ]; then
或某些变体:
if [[ $var > 1 && $var < 50 ]]; then
请注意[[
的Bash手册说:
与
[[
一起使用时,<
和>
运算符使用当前区域设置按字典顺序排序。
这意味着他们正在进行字符串比较,而不是数字比较。这也意味着当您输入8
时,它不会通过测试(8
比较大于50
)。因此,即使使用-gt
,您也需要使用算术比较器-lt
和[[
:
if [[ $var -gt 1 && $var -lt 50 ]]; then
修好后,您有:
if [ "$var%2" == 0 ]; then
var=$var/2
echo "$var"
elif [ "$var%2" == 1 ]; then
var=(3*$var+1);
echo "$var"
fi
除了令人震惊的(缺少)缩进之外,您可以确信无论您键入什么,"$var%2"
将永远不会等于0,因为字符串末尾包含%2
。与elif
条件类似。您应该只使用else
或包含else echo "What is $var?"
子句。如果要进行算术运算,请调用算术评估:
if [ $(( $var % 2 )) == 0 ]; then
((var = $var / 2))
echo "$var"
else
((var = 3 * $var + 1))
echo "$var"
fi
在Bash中有许多替代方法来编写算法。
这是与Collatz Conjecture相关的代码。组装完整的脚本会给出:
#!/bin/bash
var=${1:?}
while [[ $var -gt 1 && $var -lt 50 ]]
do
if [ $(( $var % 2 )) == 0 ]; then
((var = $var / 2))
echo "$var"
else
((var = 3 * $var + 1))
echo "$var"
fi
done
示例输出:
$ bash xy23.sh 13
40
20
10
5
16
8
4
2
1
$
(当运行停在8时,我意识到字符串与数字比较问题正在咬我。)
答案 1 :(得分:0)
>
和<
表示“重定向标准输出”和“重定向标准输入”。使用“-gt”和“-lt”进行test / bash比较。
那里有很多关于此的指南。 Here's an example.
答案 2 :(得分:0)
在comparisons语句中,您可以使用
if [[ $var -gt 1 && $var -lt 50 ]]; then
或
if [ $var -gt 1 ] && [ $var -lt 50 ]; then
或者
if [ $var \> 1 ] && [ $var \< 50 ]; then
或者
if [[ $(( var > 1)) && $(( var < 50 )) ]]; then
或者
if [ $(( var > 1)) ] && [ $(( var < 50 )) ]; then
或者
if [[ (( var > 1)) && (( var < 50 )) ]]; then
对于简单陈述,如果您希望使用算术运算,则必须遵循arithmetic shell expansion规则
var=$(( var/2 ))
或者
(( var = var/2 ))
代码已修复:
#!/bin/bash
var=$1
if [[ $var -gt 1 && $var -lt 50 ]]; then
if !(( var%2 )); then
var=$(( var/2 ))
else
var=$(( 3 * var + 1 ))
fi
echo $var ","
fi