对于一个简单的程序,我在bashshell中遇到了expr语法错误
这是我的密码。 我得到了一堆expr语法错误。 我正在使用bashshell。对于一个简单的程序,我在bashshell中遇到了expr语法错误,bash,expr,Bash,Expr,这是我的密码。 我得到了一堆expr语法错误。 我正在使用bashshell。 谢谢 您的错误是由作业中=周围的空格引起的,以下替换应该可以工作(我更喜欢$()而不是使用反勾号,因为它们更容易嵌套): 例如,s=0(带空格)不会将变量s设置为零,而是尝试使用两个参数运行命令s,=和0 但是,实际上并不需要调用外部expr1来执行数学运算并将输出捕获到变量。这是因为bash本身可以在不使用输出捕获的情况下很好地实现这一点(请参见bash手册页中的算术求值): 你会注意到我做了一些其他的小改动,我相
谢谢 您的错误是由作业中
=
周围的空格引起的,以下替换应该可以工作(我更喜欢$()
而不是使用反勾号,因为它们更容易嵌套):
例如,s=0
(带空格)不会将变量s
设置为零,而是尝试使用两个参数运行命令s
,=
和0
但是,实际上并不需要调用外部expr
1来执行数学运算并将输出捕获到变量。这是因为bash
本身可以在不使用输出捕获的情况下很好地实现这一点(请参见bash
手册页中的算术求值
):
你会注意到我做了一些其他的小改动,我相信这些改动可以提高可读性,但是如果你愿意,你可以恢复到原来的代码,只使用((expression))
方法,而不是expr
1如果您不介意调用外部可执行文件,那么在
bash
中不需要循环,您可以使用更隐蔽的方法:
#!/bin/bash
clear
read -p "Enter a number: " number
((sum = 0))
while [[ $number -gt 0 ]]; do
((sum += number % 10))
((number /= 10))
done
echo "Sum of digits is $sum"
#/bin/bash
清楚的
阅读-p“输入数字:”数字
echo“数字总和为$(grep-o.您的错误是由赋值中=
周围的空格引起的,以下替换应该可以工作(我更喜欢$()
而不是使用反勾号,因为它们更容易嵌套):
例如,s=0
(带空格)不会将变量s
设置为零,而是尝试使用两个参数运行命令s
,=
和0
但是,实际上没有必要调用外部expr
1来进行数学运算并将输出捕获到变量。这是因为bash
本身可以在不使用输出捕获的情况下很好地实现这一点(请参见bash
手册页中的算术求值
):
你会注意到我做了一些其他的小改动,我相信这些改动可以提高可读性,但是如果你愿意,你可以恢复到原来的代码,只使用((expression))
方法,而不是expr
1如果您不介意调用外部可执行文件,那么在bash
中不需要循环,您可以使用更隐蔽的方法:
#!/bin/bash
clear
read -p "Enter a number: " number
((sum = 0))
while [[ $number -gt 0 ]]; do
((sum += number % 10))
((number /= 10))
done
echo "Sum of digits is $sum"
!/bin/bash
清楚的
阅读-p“输入数字:”数字
echo“数字的总和是$(grep-o.看看搞笑的。((总和=$(echo$number | sed-e's/&+/g'-e's/$/0/))
也可以这样做,但是@paxdiablo的性能要好得多。expr
的唯一用例是POSIX shell中的正则表达式匹配;它可以执行的任何运算都可以在shell中用$(…)
完成,bash
有自己的(高级)正则表达式匹配内置项。看看有趣的。((sum=$(echo$number | sed-e's/&+//g'-e's/$/0/))
也可以这样做,但是@paxdiablo的性能要好得多。expr
的唯一用例是POSIX shell中的正则表达式匹配;它可以执行的任何运算都可以在shell中用$(…)
完成,bash
有自己的(高级)内置正则表达式匹配。())
是let
命令,其工作原理与expr非常不同,最好与内置的$(())进行比较
bash附带的算术命令。let
允许您分配变量值,但不返回该值,因此不能与echo一起使用或分配给变量,这与expr和$(())不同
两者都返回/打印value@User112638726,因为这里所有的表达式都是赋值表达式,在这种情况下实际上没有任何区别。OP可以检查他们是否需要做更复杂的事情,但我认为我不需要在这里讨论。你的回答措辞让它听起来像let
是对expr
的类似替换,正如我在上面解释的那样,它不是。我认为包含$(())会很有用
因为它在算术方面的性能与expr完全相同。@User112638726,我更改了措辞,我不想引入特定情况下不需要的概念。希望更新能解决您的问题。如果不是,没有任何东西阻止您写另一个答案来解决这个问题。我会投票赞成ce它仍然很有用。好的,谢谢,我可能会这样做:)只是有时候对你来说很明显的事情对语言新手来说可能不是。不过我很感激:)(())
是let
命令,它的工作原理与expr非常不同,与内置的$(())相比更好
bash附带的算术命令let
允许您分配变量值,但不返回该值,因此不能与echo一起使用或分配给变量,而expr和$(())
都返回/打印value@User112638726,因为这里的所有表达式都是赋值表达式,所以在这种情况下实际上没有任何区别。OP可以检查他们是否需要做更复杂的事情,但我认为我不需要在这里讨论。你的回答措辞让它听起来像是let
是expr
的一个类似替代品,正如我上面解释的那样,它不是。我认为包含$(())
会很有用,因为它在算术方面的执行与expr完全相同。@User112638726,我更改了措辞,我不想引入特定情况下不需要的概念。
#!/bin/bash
clear
read -p "Enter a number: " number
((sum = 0))
while [[ $number -gt 0 ]]; do
((sum += number % 10))
((number /= 10))
done
echo "Sum of digits is $sum"
#!/bin/bash
clear
read -p "Enter a number: " number
echo "Sum of digits is $(grep -o . <<<$number | paste -sd+ | bc)"