Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于一个简单的程序,我在bashshell中遇到了expr语法错误_Bash_Expr - Fatal编程技术网

对于一个简单的程序,我在bashshell中遇到了expr语法错误

对于一个简单的程序,我在bashshell中遇到了expr语法错误,bash,expr,Bash,Expr,这是我的密码。 我得到了一堆expr语法错误。 我正在使用bashshell。 谢谢 您的错误是由作业中=周围的空格引起的,以下替换应该可以工作(我更喜欢$()而不是使用反勾号,因为它们更容易嵌套): 例如,s=0(带空格)不会将变量s设置为零,而是尝试使用两个参数运行命令s,=和0 但是,实际上并不需要调用外部expr1来执行数学运算并将输出捕获到变量。这是因为bash本身可以在不使用输出捕获的情况下很好地实现这一点(请参见bash手册页中的算术求值): 你会注意到我做了一些其他的小改动,我相

这是我的密码。 我得到了一堆expr语法错误。 我正在使用bashshell。
谢谢

您的错误是由作业中
=
周围的空格引起的,以下替换应该可以工作(我更喜欢
$()
而不是使用反勾号,因为它们更容易嵌套):

例如,
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)"