gpt4 book ai didi

linux - 如何在 Linux 中循环打印数组值?

转载 作者:太空狗 更新时间:2023-10-29 11:49:11 26 4
gpt4 key购买 nike

所以我的 shell 脚本看起来像这样:

VAR=$(shuf -i 1-10 -n 3)
N=1
while [$N le 3 ]; do
NUM=$VAR | awk '{print$`echo $N`}'
#some commands that uses $NUM
N=$(($N+1))
done

但我认为 awk 在这里不起作用,因为

echo $VAR | awk '{print$`echo $N`}'

给我

awk: cmd. line:1: {print$`echo $N`}
awk: cmd. line:1: ^ invalid char '`' in expression
awk: cmd. line:1: {print$`echo $N`}
awk: cmd. line:1: ^ syntax error

所以我尝试了以下命令

 echo $VAR | awk '{print$$(echo $N)}'

这次我总是看到所有三个值,不管 $N 是什么

还有其他我可以尝试的命令吗?

最佳答案

存在多个语法问题和反模式!请在 ShellCheck 中检查您的脚本对于琐碎的语法问题。

  1. shell 中的变量不是用于存储多行项目。使用数组并对其进行循环。
  2. bash结构对空间敏感,[$N le 3 ] 中一个简单的遗漏空间需要写成[ $N le 3 ]
  3. 运行命令和将输出存储在变量中的语法是错误的。实际的命令替换语法是使用 var=$(..) , 其中$(..)包含要运行的命令。
  4. 您不能在 $(..)) 中运行命令替换(反引号或 awk。记住 awk 不是 shell。您不需要使用 awk 或用于遍历数组的任何第三方工具,只需使用 shell 内部结构即可。

shuf在新行中打印输出。使用工具mapfile/readarray将项目安全地存储到数组中,即

mapfile -t randomElements < <(shuf -i 1-10 -n 3)

<()bash 中的一个特殊构造称为进程替换,进程的输出(在您的情况下为 shuf)显示为要读取的临时文件。

我们现在使用循环来遍历元素,

for ((i=0; i<"${#randomElements[@]}"; i++)); do 
printf '%s\n' "${randomElements[i]}"
done

如果碰巧mapfile/readarray这应该在 bash 中可用4.3 及更高版本不存在,请使用 read命令

while IFS= read -r line; do arr+=("$line"); done < <(shuf -i 1-10 -n 3)

并照常使用打印逻辑。

关于linux - 如何在 Linux 中循环打印数组值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48274916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com