Linux 如何拆分字符串以在for循环中导航?

Linux 如何拆分字符串以在for循环中导航?,linux,bash,shell,Linux,Bash,Shell,我不太熟悉bash脚本。我想用正确的格式回显每一行角色路径=…,但是这个for循环不允许我这样做。它基本上是一次性打印,而不是逐行打印。但有趣的是,当我运行vault list database/roles命令时,我可以逐行查看所有角色 我如何解决这个问题 代码: 输出: role path=Keys ---- Role-1 Role-2 Role-3 Role-4 Role-5 注意:我需要保持循环中的所有内容,因为我稍后将运行此命令:vault delete database/roles/

我不太熟悉bash脚本。我想用正确的格式回显每一行
角色路径=…
,但是这个for循环不允许我这样做。它基本上是一次性打印,而不是逐行打印。但有趣的是,当我运行
vault list database/roles
命令时,我可以逐行查看所有角色

我如何解决这个问题

代码:

输出:

role path=Keys
----
Role-1
Role-2
Role-3
Role-4
Role-5
注意:我需要保持循环中的所有内容,因为我稍后将运行此命令:
vault delete database/roles/${path}

更新:vault列表数据库/角色的输出

Keys ---- Role-1 Role-2 Role-3 Role-4 Role-5

谢谢

假设来自
vault列表数据库/角色的输出如下所示:

Keys
----
Role-1
Role-2
Role-3
Role-4
Role-5
OP提到“将其保存在数组中”,但OP当前代码中没有任何数组的迹象;此时,我将假定其目的是将
vault
命令的输出存储在一个数组中

将角色(aka
vault
output)存储在数组中的一个方法是:

mapfile -t roles < <(vault list database/roles | tail +3)
从这里,OP可以像这样在数组中循环:

$ typeset -p roles
declare -a roles=([0]="Role-1" [1]="Role-2" [2]="Role-3" [3]="Role-4" [4]="Role-5")
for ((i=0; i<"${#roles[@]}"; i++))
do
    echo "${i} : ${roles[${i}]}"
done

# or

for i in "${!roles[@]}"
do
    echo "${i} : ${roles[${i}]}"
done

这回答了你的问题吗?可能是
vault
打印到stderr。请尝试
$(vault…2>&1)
。但这很奇怪,
role path=Keys
中的
Keys
来自哪里?在这种情况下,
vault列表数据库/角色| sed的/^/role path=/
似乎是一个更简单的解决方案。顺便说一句,从它现在的行为方式来看,我怀疑你改变了
IFS
,这通常是个坏主意(至少之后会恢复正常)。@KamilCuk
保险库列表输出的前两行…
键\n----\n
,但
回音上没有引号,获取此输出没有任何意义。@KamilCuk它打印到stderr的任何内容都将在
role path=
for ((i=0; i<"${#roles[@]}"; i++))
do
    echo "${i} : ${roles[${i}]}"
done

# or

for i in "${!roles[@]}"
do
    echo "${i} : ${roles[${i}]}"
done
0 : Role-1
1 : Role-2
2 : Role-3
3 : Role-4
4 : Role-5