Linux Bash脚本:$x=$x+;2没有得到认可
执行下面的脚本时,出现以下错误:-Linux Bash脚本:$x=$x+;2没有得到认可,linux,bash,shell,unix,Linux,Bash,Shell,Unix,执行下面的脚本时,出现以下错误:- 脚本将在内部执行,并且每次都会打印下行。 “第9行:1=1+2:未找到命令”。为什么? 另外,如果我将$x=$x+2更改为x+$x+2,那么我也会得到以下错误 line 6: [: 1+2: integer expression expected 同样的脚本在这样执行时运行良好 #!/bin/bash echo "Script 1 - Linux Scripting Book" x=1 while [ $x -le 45 ] do ech
脚本将在内部执行,并且每次都会打印下行。 “第9行:1=1+2:未找到命令”。为什么? 另外,如果我将
$x=$x+2
更改为x+$x+2
,那么我也会得到以下错误
line 6: [: 1+2: integer expression expected
同样的脚本在这样执行时运行良好
#!/bin/bash
echo "Script 1 - Linux Scripting Book"
x=1
while [ $x -le 45 ]
do
echo x : $x
let x=x+2
done
echo "End Of Script 1"
exit 0
因为这不是设置变量的Bourne shell语法;它看起来更像Perl或PHP。
$
用于且不是变量名的一部分。赋值仅使用=
,并计算算术表达式(非常类似于)。另一种有效的语法是x=$((x+2))
。请注意,这些算术求值是bash特性;标准unix shell可能需要使用外部工具,如expr
因为这不是设置变量的伯恩shell语法;它看起来更像Perl或PHP。$
用于且不是变量名的一部分。赋值仅使用=
,并计算算术表达式(非常类似于)。另一种有效的语法是x=$((x+2))
。请注意,这些算术求值是bash特性;标准unix shell可能需要使用外部工具,如expr
您将得到第9行:未找到1=1+2:command
,因为1=1+2
是$x=$x+2
展开的内容
使用expr
或let
或(…)
进行整数计算,使用bc
进行浮点计算:
let x=x+2
((x=x+2)) #same as above
((x+=2)) #same
((x++)) #if adding just one
((++x)) #if adding just one
x=$((x+2))
x=`expr $x + 2` #space before and after +
x=$(echo $x+2|bc) #using bc
x=$(echo $x+2.1|bc) #bc also works with floating points (numbers with decimals)
您将得到
第9行:未找到1=1+2:command
,因为1=1+2
是$x=$x+2
展开的内容
使用expr
或let
或(…)
进行整数计算,使用bc
进行浮点计算:
let x=x+2
((x=x+2)) #same as above
((x+=2)) #same
((x++)) #if adding just one
((++x)) #if adding just one
x=$((x+2))
x=`expr $x + 2` #space before and after +
x=$(echo $x+2|bc) #using bc
x=$(echo $x+2.1|bc) #bc also works with floating points (numbers with decimals)
由于问题的这一部分尚未澄清,而且在评论中发表评论也不合适,因此我添加以下部分答案:
x=1; for i in 1 2 3 ; do x=$x+2; echo $x; done
1+2
1+2+2
1+2+2+2
附带说明:如果没有充分的理由,不要在脚本末尾使用出口0。脚本完成后,它会在没有您帮助的情况下自行退出。退出状态将是执行的最后一个命令的退出状态,在您的例子中是一个简单的回显,它几乎总是成功的。在极少数失败的情况下,您可能会无意中隐藏失败
如果你源代码的脚本,退出将抛出你的运行外壳
但您可以像这样重写while循环:
x=0
while (($((x)) < 9))
do
echo x : $x
x=$x+2
done
echo $((x))
x : 0
x : 0+2
x : 0+2+2
x : 0+2+2+2
x : 0+2+2+2+2
10
x=0
而($((x))<9))
做
回声x:$x
x=$x+2
完成
echo$((x))
x:0
x:0+2
x:0+2+2
x:0+2+2+2
x:0+2+2+2+2
10
由于问题的这一部分还没有澄清,也不适合发表评论,我添加了以下部分答案:
x=1; for i in 1 2 3 ; do x=$x+2; echo $x; done
1+2
1+2+2
1+2+2+2
附带说明:如果没有充分的理由,不要在脚本末尾使用出口0。脚本完成后,它会在没有您帮助的情况下自行退出。退出状态将是执行的最后一个命令的退出状态,在您的例子中是一个简单的回显,它几乎总是成功的。在极少数失败的情况下,您可能会无意中隐藏失败
如果你源代码的脚本,退出将抛出你的运行外壳
但您可以像这样重写while循环:
x=0
while (($((x)) < 9))
do
echo x : $x
x=$x+2
done
echo $((x))
x : 0
x : 0+2
x : 0+2+2
x : 0+2+2+2
x : 0+2+2+2+2
10
x=0
而($((x))<9))
做
回声x:$x
x=$x+2
完成
echo$((x))
x:0
x:0+2
x:0+2+2
x:0+2+2+2
x:0+2+2+2+2
10
请看一看:声明-ix=1;x=$x+2;echo$x
如果我将$x=$x+2替换为x=$x+2,那么我也会出错。如果删除退出0,是否担心脚本不会结束?你知道它做什么吗?关于+=
,请仔细阅读字符串
、整数
和数组
之间的区别!请看一看:declare-ix=1;x=$x+2;echo$x
如果我将$x=$x+2替换为x=$x+2,那么我也会出错。如果删除退出0,是否担心脚本不会结束?你知道它做什么吗?关于+=
,请仔细阅读字符串
、整数
和数组
之间的区别!它可以工作,只是不执行算术计算(因此会中断您的[]
测试)。可以为特定变量启用算术计算。奇怪的是,test
声称它需要一个表达式,但实际上只需要一个数字。请不要推荐seq
seq
是非标准且不惯用的。是coreutils的一部分,可能存在于GNU系统上,但不是POSIX的一部分,也不包含在其他一些unix变体中。删除了引用。它可以工作,只是不执行算术计算(因此会中断您的[]
测试)。可以为特定变量启用算术计算。奇怪的是,test
声称它需要一个表达式,但实际上只需要一个数字。请不要推荐seq
seq
是非标准且不惯用的。是coreutils的一部分,可能存在于GNU系统上,但不是POSIX的一部分,也不包含在其他一些unix变体中。删除了引用。关于x=$x+2的内容在手册中不是最容易找到的功能。它的作用与let
@YannVernier相同,但你会发现let
从未被实验人员使用过。看起来你还没有掌握bash脚本的习惯用法。你是说有经验,但是shell脚本编写人员并没有统一到这是一个清晰的习惯用法。就我个人而言,我宁愿看到脚本在let:not found
中失败,也不愿尝试将x=x+2
作为外部命令执行。建议使用复合命令而不是let,因此我想这将作为样式指南。主要原因是避免使用globbing.x=$x+2不是手册中最容易找到的功能。它的作用与let
@YannVernier相同,但你会发现let
从未被实验人员使用过。看来