我在 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(这是在命令行上设置的变量的值)。awk
awk
s
这样做会更短
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
离那不远了。