Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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 变量在循环后丢失其值_Linux_Bash_Shell - Fatal编程技术网

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