如何在bash中使用mod运算符?

Eri*_*ric 146 bash arithmetic-expressions modulo

我正在尝试这样一条线:

for i in {1..600}; do wget http://example.com/search/link $i % 5; done;
Run Code Online (Sandbox Code Playgroud)

我想要输出的是:

wget http://example.com/search/link0
wget http://example.com/search/link1
wget http://example.com/search/link2
wget http://example.com/search/link3
wget http://example.com/search/link4
wget http://example.com/search/link0
Run Code Online (Sandbox Code Playgroud)

但我实际得到的只是:

    wget http://example.com/search/link
Run Code Online (Sandbox Code Playgroud)

Mar*_*air 208

请尝试以下方法:

 for i in {1..600}; do echo wget http://example.com/search/link$(($i % 5)); done
Run Code Online (Sandbox Code Playgroud)

$(( ))语法做一个算术评估的内容.

  • 不要忘记算术构造“$(())”会自动扩展变量,因此您不需要“$”和“i”。这个“$((i % 5))”将完美地工作。 (8认同)
  • 如果有人需要进行数学运算,请注意,“ bash”中的带有负数的模运算**仅返回余数**,而不是数学模结果。这意味着,虽然数学上-12 mod 10是8,但是bash会将其计算为-2。您可以使用简单的`echo $ {((-12%10))``(`-2`)进行测试,并将其与python3 python3 -c“ print(-12%10)”`(`8`)进行比较。 (3认同)

Chr*_*rle 38

for i in {1..600}
do
    n=$(($i%5))
    wget http://example.com/search/link$n
done
Run Code Online (Sandbox Code Playgroud)

  • 双括号内的 $ 符号是不必要的,因为 bash 会自动扩展它在那里找到的任何变量。 (4认同)

Hig*_* E. 28

你必须将你的数学表达式放在$(())中.

一内胆:

for i in {1..600}; do wget http://example.com/search/link$(($i % 5)); done;
Run Code Online (Sandbox Code Playgroud)

多行:

for i in {1..600}; do
    wget http://example.com/search/link$(($i % 5))
done
Run Code Online (Sandbox Code Playgroud)

  • 双括号内的 $ 符号是不必要的,因为 bash 会自动扩展它在那里找到的任何变量。 (2认同)

h__*_*h__ 12

这可能是偏离主题的.但对于for循环中的wget,你当然可以

curl -O http://example.com/search/link[1-600]
Run Code Online (Sandbox Code Playgroud)