Linux 变量在循环后丢失其值
我有一个脚本,它应该读取每行都有数字的文件,并显示最大的数字、最小的数字和总和。在循环过程中,变量会改变它们的值,但在它们返回主值之后,我无法修复它Linux 变量在循环后丢失其值,linux,bash,shell,Linux,Bash,Shell,我有一个脚本,它应该读取每行都有数字的文件,并显示最大的数字、最小的数字和总和。在循环过程中,变量会改变它们的值,但在它们返回主值之后,我无法修复它 #!/bin/bash if [ ! $# -eq 1 ]; then echo "Invalid number of arguments" elif [ ! -e $1 ]; then echo "File doesn't exist" elif [ ! -s $1 ]; then echo "File is empty
#!/bin/bash
if [ ! $# -eq 1 ]; then
echo "Invalid number of arguments"
elif [ ! -e $1 ]; then
echo "File doesn't exist"
elif [ ! -s $1 ]; then
echo "File is empty"
else
min=$(head -1 $1)
max=$(head -1 $1)
sum=0
(while read i; do
(( sum+=i ))
if [ $min -gt $i ]; then
min=$i
elif [ $max -lt $i ]; then
max=$i
fi
done
)<$1
fi
echo $min $max $sum
#/bin/bash
如果[!$#-eq 1];然后
回显“参数数无效”
elif[!-e$1];然后
echo“文件不存在”
elif[!-s$1];然后
echo“文件为空”
其他的
最低=$(总分-1$1)
最大值=$(总分-1$1)
总和=0
(当我读书时;做
((总和+=i))
如果[$min-gt$i];则
最小值=$i
elif[$max-lt$i];然后
max=$i
fi
完成
)
子shell没有做任何有用的事情,所以简单的解决方法是删除它
我在阅读I
时将循环顶行中的表达式更改为cat$1 |,并删除了括号,但没有任何帮助
管道与子shell有相同的问题:左侧和右侧在子进程中运行。在。。。问题是在Bash中,括号创建了一个新的子shell。
您正在子shell中创建变量,当子shell完成时,这些变量就会消失
$ i=foo; (i=bar; echo $i); echo $i
bar
foo
如果从循环中删除paren,它将起作用:
while read i; do
(( sum+=i ))
if [ $min -gt $i ]; then
min=$i
elif [ $max -lt $i ]; then
max=$i
fi
done < $1
阅读时;做
((总和+=i))
如果[$min-gt$i];然后
最小值=$i
elif[$max-lt$i];然后
max=$i
fi
已完成<$1
我在读取I时将循环顶行中的表达式更改为cat$1 |,并删除了括号,但没有help@dima2212:如果while循环位于管道的右侧,bash将在子进程中运行它,而变量更改在父进程中不可见。在……时执行。。。。。完成
$ i=foo; (i=bar; echo $i); echo $i
bar
foo
while read i; do
(( sum+=i ))
if [ $min -gt $i ]; then
min=$i
elif [ $max -lt $i ]; then
max=$i
fi
done < $1