【问题标题】:bash 4.2 / 4.3: Different behavior in C-style loopbash 4.2 / 4.3:C 风格循环中的不同行为
【发布时间】:2015-06-10 15:26:35
【问题描述】:

bash 4.2 在 C 风格的 for 循环中显示假定的正确行为:

me@server:/some/dir# TIMES=30; for (( n=0; n<$(shuf -i ${TIMES}-$(expr ${TIMES} + 20) -n 1); n++ )); do echo $n; done
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
me@server:/some/dir# bash --version
GNU bash, Version 4.2.25(1)-release (x86_64-pc-linux-gnu)
(...)
me@server:/some/dir#

bash 4.3下同样抛出错误:

me@server:/some/dir# TIMES=30; for (( n=0; n<$(shuf -i ${TIMES}-$(expr ${TIMES} + 20) -n 1); n++ )); do echo $n; done
-bash: syntax error near unexpected token `newline'
me@server:/some/dir# bash --version
GNU bash, Version 4.3.30(1)-release (x86_64-pc-linux-gnu)
(...)

但在${TIMES}${TIMES}+20 之间找到随机数的部分有效:

me@server:/some/dir# shuf -i 20-50 -n 1
26
me@server:/some/dir#

直接插入数字而不是$()-subshel​​l'ing 也是如此:

me@server:/some/dir# TIMES=30; for (( n=0; n<26; n++ )); do echo $n; done
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
me@server:/some/dir#

这里发生了什么?有什么想法为什么子shell 在bash 4.3 下没有正确执行?

【问题讨论】:

  • 我不会,但在中间放弃无用的expr 电话也可以。 n&lt;$(shuf -i ${TIMES}-$((${TIMES} + 20)) -n 1

标签: bash loops version


【解决方案1】:

如果将$(expr 替换为$((,它就会开始工作:

TIMES=30
for (( n=0; n < $(shuf -i $TIMES-$((TIMES + 20)) -n 1); n++ )) ; do
    echo $n
done

【讨论】:

  • 谢谢。现在,出于好奇:当非单行示例完成工作时,为什么 expr 构造突然不再工作了?
猜你喜欢
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多