分页: 1 / 1

有关shell中变量的问题

发表于 : 2011-07-25 15:54
chengmoYS
写了一个小脚本,为什么sum的值最后还是0呀。
使用sh -x a.sh发现sum在循环中其实一直有变化,感觉跟c里那个什么传参相似。

这里有什么解决方法不。

[root@localhost Desktop]# cat a.sh
#!/bin/sh

sum=0

sed '/root/d' /etc/passwd | awk -F\: '{print $3}' | while read i
do
sum=`expr $sum + $i`
done

echo $sum
[root@localhost Desktop]# sh a.sh
0

Re: 有关shell中变量的问题

发表于 : 2011-07-25 16:22
Gooney
sum=`expr $sum + $i | bc`

Re: 有关shell中变量的问题

发表于 : 2011-07-25 16:34
chengmoYS
Gooney 写了:sum=`expr $sum + $i | bc`
expr $sum + $i跟expr $sum + $i | bc没区别。
你没看清楚我的问题。谢谢。

Re: 有关shell中变量的问题

发表于 : 2011-07-25 17:51
Gooney
chengmoYS 写了:
Gooney 写了:sum=`expr $sum + $i | bc`
expr $sum + $i跟expr $sum + $i | bc没区别。
你没看清楚我的问题。谢谢。
sorry,没看清楚。
我试了一下,确实是楼主所说那样,很困惑。
搜索到这个:
http://bbs.chinaunix.net/thread-1727231-2-1.html

看12楼那位的说法,觉得应该有道理。
这个是bash和ksh之间的区别。
bash中需要用 while read line; do ... done <input_file.
而ksh中,直接 cat xxx | while read line; do ... done. 就可以了

另外,ksh 中用起来很方便的地方还有, echo "1 2 3 4" | read a b c d; echo "$a $b $c $d"
而bash就不行了。

Re: 有关shell中变量的问题

发表于 : 2011-07-25 18:02
Gooney
chengmoYS 写了:
Gooney 写了:sum=`expr $sum + $i | bc`
expr $sum + $i跟expr $sum + $i | bc没区别。
你没看清楚我的问题。谢谢。
抱歉没看清。
这个问题确实有,我搜索了一下,有人说这是bash和ksh的区别,试了试,楼主的脚本在ksh下可以得到你预想的结果。
前面发过一个贴,竟然还说要审核,新人不好混啊

Re: 有关shell中变量的问题

发表于 : 2011-07-26 9:05
chengmoYS
谢谢。楼上的。

也谢谢你们。

呵呵。

新手难混,你也不要走捷径。慢慢来,别急。本来就是学习知识的,急不来的。

Re: 有关shell中变量的问题

发表于 : 2011-07-27 18:46
fnan
kose1@kose1-desktop:~$ sed '/root/d' /etc/passwd | awk -F\: '{print $3}' |( while read i; do sum=`expr $sum + $i`; done;echo $sum)
68392

Re: 有关shell中变量的问题

发表于 : 2011-07-27 18:51
fnan
这个是bash和ksh之间的区别。
bash中需要用 while read line; do ... done <input_file.
而ksh中,直接 cat xxx | while read line; do ... done. 就可以了

另外,ksh 中用起来很方便的地方还有, echo "1 2 3 4" | read a b c d; echo "$a $b $c $d"
而bash就不行了。
kose1@kose1-desktop:~$ echo "1 2 3 4" | (read a b c d; echo "$a $b $c $d")
1 2 3 4

Re: 有关shell中变量的问题

发表于 : 2011-07-29 2:42
tinym87
7楼的回答正解啊!
貌似将while循环这一部分放到()内就没有问题,()内的代码是作为一个独立进程来运行的。

自己弄的一个笨方法也可以用:

代码: 全选

#!/bin/sh

sum=0

sed '/root/d' /etc/passwd | awk -F\: '{print $3}' >>tmp_ex_1.txt
while read i
do
	sum=`expr $sum + $i`
done <tmp_ex_1.txt
rm -f tmp_ex_1.txt

echo $sum
不过还是:

代码: 全选

sed /root/d | awk -F: '{ print $3 }' | (while read i;do sum=`expr $i + $sum`;done;echo $sum)
经典啊。

Re: 有关shell中变量的问题

发表于 : 2011-07-29 7:04
fnan
这种问题最好用awk:
kose5@kose5-Aspire-4552:~$ awk -F: '{if ($0 !~ /root/) sum+=$3} END{print sum}' /etc/passwd
68165
追踪进程层次可以用$BASH_SUBSHELL 变量。

Re: 有关shell中变量的问题

发表于 : 2011-07-29 11:32
tusooa

代码: 全选

while read line; ... ; done <<< "$(sed '/root/d' /etc/passwd | awk -F\: '{print $3}')"