Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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
Linux shell中的整数加法_Linux_Bash_Shell - Fatal编程技术网

Linux shell中的整数加法

Linux shell中的整数加法,linux,bash,shell,Linux,Bash,Shell,这是我的简单shell代码。我希望结果为2。Shell将所有内容都视为字符串。 我怎样才能做到这一点 num=1 num=$(( $num + 1 )) 编辑: 完整代码:如果我想从1打印到10,这有什么错 #! /bin/bash num=1 until test $num -eq 10 do num=$(( $num + 1 )) echo $num done 在bash中,无需执行任何特殊操作: aix@aix:~$ num=1 aix@aix:~$ num=$((

这是我的简单shell代码。我希望结果为2。Shell将所有内容都视为字符串。 我怎样才能做到这一点

num=1
num=$(( $num + 1 ))
编辑:

完整代码:如果我想从1打印到10,这有什么错

#! /bin/bash

num=1
until test $num -eq 10
do
    num=$(( $num + 1 ))
    echo $num
done

bash
中,无需执行任何特殊操作:

aix@aix:~$ num=1
aix@aix:~$ num=$(( $num + 1 ))
aix@aix:~$ echo $num
2
为我工作

$ num=1
$ num=$(( $num + 1 ))
$ echo $num
2
你得到了什么输出

阅读有关bash算术的更多信息@

编辑 要在bash中执行10次操作,可以使用(使用}

但是,您不能在
{}
之间使用变量。如果是这种情况,请使用
seq

您刚才做了:

$ num=1; num=$(( $num + 1 ));echo $num
2
注意:您不需要在
$(())
中引用变量。此外,您可以使用
$((num++)
试试这个

$ num=1; num=`expr $num + 1`; echo $num;
使用
((num++)
作为递增
num
的简写

$ num=1
$ ((num++))
$ echo $num
2

您可以使用以下内容:

num=1
num=`expr $num + 1`

它也适用于非bash shell,如ksh。

您没有指定要使用的shell,但我知道的最简洁的形式是这个(至少在bash中有效):

如果仅递增1并更改变量本身而不是打印/赋值,则:

((num++))
这是一个更好/更优雅的解决方案。请参阅dogbane的答案

如果在值上循环,我将使用以下形式:

for i in `seq 1 10`; do
   echo $i
done

@tonio;请不要提倡在不需要子shell(`…或$(…)结构时使用它们(为了尽量避免混淆,$(…)不是子shell结构)。即使数据量非常小,子shell也会对性能造成巨大的影响。对于使用外部程序来执行可以通过内置shel完成的操作的每个地方,情况也是如此

例如:

    num=1
    time while [[ $num -lt 10000 ]]; do
            num=$(( num+1 ))
    done
    echo $num
    num=1
    time while /bin/test $num -lt 10000; do
            num=$( /bin/expr $num + 1 )
    done
    echo $num
输出(在Linux上以ksh运行):

实0.04s 用户0.04s 系统0m0.01s 10000 真实0m20.32s 用户0m2.23s sys 0m2.92s 10000
…因此,运行时间系数为250,CPU时间系数为100。我承认我使用的示例是一个夸张的示例,明确要求绕过所有内置程序,但我认为关键是:创建新进程非常昂贵,尽可能避免,并了解shell以识别在何处创建新进程。

这可能适用于r你:

num=1; ((num++)); echo $num
2

for循环

for num in {1..10}; do echo $num; done
或者(至少在bash中)


用于((num=1;num更改
直到test num-eq 10
直到test$num-eq 10
!这都是关于$$!!首先,第一次回显num已经是2,所以将
num=1
更改为
num=0
,它应该打印所有的数字b/w 1和10,包括1和10+FredrikDeleting提供的更正,这对p不公平那些花时间回答你问题的人。我已经检查过它工作num=1;num=
expr$num+1
;echo$num;这不起作用。
$?
是最后一个命令的退出状态,它是0。对于循环,我更喜欢
{1..10}
,而不是在我的系统(Debian)中调用
seq
test和expr在/usr/bin中。路径问题是支持shell内置而不是外部可执行文件的另一个原因。即使是Linux部门也是如此分散(示例代码是在Slackware系统上编写的)。您可以使用
let
let num=num+1
let num++
忽略双括号“/usr/bin/test”和“/bin/test”将生成一个新的shell,“test”是大多数现代shell中的内置程序。任何测试不是内置程序的shell都可能生成一个子shell来运行“[”,因此这不是一个支持“[”而不是“test”的参数“@William;是的,但我在这里的目的是演示在扩展程序执行上构建是多么昂贵,就像tonio提出的解决方案一样(尽管这是一个功能上可行的解决方案),因此我将外部程序的使用发挥到了极致——另一方面,我使用shell内置提供了相同的解决方案。 real 0m0.04s user 0m0.04s sys 0m0.01s 10000 real 0m20.32s user 0m2.23s sys 0m2.92s 10000
num=1; ((num++)); echo $num
2
num=1; echo $((++num))
2
for num in {1..10}; do echo $num; done
for ((num=1; num<=10; num++)) { echo $num; }
for (( num=1,mun=10; num<=10; num++,mun--)) { echo $num $mun; }