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 Bash脚本:$x=$x+;2没有得到认可_Linux_Bash_Shell_Unix - Fatal编程技术网

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
从未被实验人员使用过。看来