Shell 脚本 Bash

Shell 脚本 Bash

我在 shell 脚本中有这个循环,但似乎我不完全理解它的作用:

特别是 gawk -v

for ((k=$1; $k<3 + 3 ; k=$k + $3))
do
echo $k | gawk -v s=4 '{print $1*s}'
done

假设我们的参数是 2 10 4

答案1

我只能想象这是一个家庭作业问题。

让我们来分解一下。首先,您有一个循环,该循环从 开始$1,递增,$3并在 停止6。因此,如果您传入2 10 4,则循环将从 开始2,并递增4。它会立即停止,因为2 + 4 = 6

所以下面只是打印2.随论据2 10 4

for ((k=$1; $k<3 + 3 ; k=$k + $3))
do
    echo $k
done

每次循环时,您都使用 处理输出gawk -v s=4 '{print $1*s}'。这是一个非常小的“awk”程序。它设置一个变量s=4。然后打印$1*s(即:它计算2 * 4并仅打印8.

答案2

awk位仅打印当前值$k(这是从输入读取的代码$1中)乘以 4(这是在命令行上设置的变量的值)。awkawks

这样做会更短

printf '%d\n' "$(( 4*k ))"

循环从第一个参数到第三个参数的步骤 5。第二个参数没有任何区别。

因此,整个事情可以简化为

seq "$(( 4*$1 ))" "$(( 4*$3 ))" 20

GNU 的三个参数seq是“开始,增量, 和结尾”。这是为了输出,并且输出始终是循环变量当前值的四倍。循环从 开始$1,因此输出从该值的四倍开始。循环增加$3,因此我们增加四倍。循环$k最多以 5 结束(比 少 1 3+3),因此输出在 结束4*5

或者,如果您想将该seq调用作为bash循环进行:

for (( k = 4*$1; k <= 20; k += 4*$3 )); do
    printf '%d\n' "$k"
done

而且,如你所见,

for (( k = $1; k <= 5; k += $3 )); do
    printf '%d\n' "$(( 4*k ))"
done

离那不远了。

相关内容