请问一个 Bash 的 String Operator 的问题

2015-02-11 19:58:45 +08:00
 fvladlpa
做习题的时候遇到这个问题,script是

#filename is "highest"
filename=$1
filename=${filename:?"missing."}
howmany=$2
sort -nr $filename | head -${howmany:=10}
echo "$howmany books have been selected"

filename中的输入文件中myflie的内容是

#filename is myfile
5 Depeche Mode
2 Split Enz
3 Simple Minds
1 Vivaldi, Antonio

输入

./highest myfile 3

返回内容为

5 Depeche Mode
3 Simple Minds
2 Split Enz
3 books have been selected

我设想是如果输入的是

./highest myfile

返回内容应该是

5 Depeche Mode
3 Simple Minds
2 Split Enz
1 Vivaldi, Antonio
10 books have been selected

但是实际上返回的是

5 Depeche Mode
3 Simple Minds
2 Split Enz
1 Vivaldi, Antonio
books have been selected

也就是说 sort -nr $filename | head -${howmany:=10} 执行完之后 $howmany 依然是null而不是10。

求解各位BASH大神,这是怎么回事?
2154 次点击
所在节点    问与答
3 条回复
timonwong
2015-02-11 20:30:42 +08:00
pipe 那里是开了一个新的subshell (fork),因此${howmany}的变更不会影响到 parent
fvladlpa
2015-02-11 20:45:17 +08:00
@timonwong 你的意思是subshell和parent里面的${how many}实际上是两个变量。那么请问如果要实现我希望的功能script要怎么写,谢谢
timonwong
2015-02-11 20:55:23 +08:00
@fvladlpa
${howmany:=10} 单独写成一行(或者写成 howmany=${howmany:-10})
然后
sort -nr $filename | head -${howmany} 就成了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/170259

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX