Bash

如何按空格拆分字元串,其中包含引用的值

  • July 9, 2021

以下面的 bash 範例為例(我應該提到我的真實輸出來自vboxmanage list vms

TEST='"ubuntu server" foo bar'
echo $TEST
"ubuntu server" foo bar

如何將三個值分開(在循環或單獨的變數中)?我發現的每個解決方案都依賴於空格分隔符,並且會破壞第一個值。

您可以遍歷 VirtualBox 機器的名稱:

vboxmanage list -l vms | sed -n 's/^Name:[[:blank:]]*//p' |
while IFS= read -r vm_name; do
  printf 'There is one VM called "%s"\n' "$vm_name"
done

這會列出使用長格式的機器並解析出名稱。然後在 shell 循環中讀取名稱,並為每個名稱列印一條短消息。

您還可以將名稱讀入數組:

readarray -t vm_names < <(vboxmanage list -l vms | sed -n 's/^Name:[[:blank:]]*//p')
printf 'There is one VM called "%s"\n' "${vm_names[@]}"

在這裡,名稱列表是紅色的數組vm_names。你可以像這樣循環這個數組:

for vm_name in "${vm_names[@]}"; do
  # Use "$vm_name" here
done

要同時使用 UUID:

vboxmanage list -l vms |
sed -n \
   -e '/^Name:[[:blank:]]*/{ s///; h; }' \
   -e '/^UUID:[[:blank:]]*/{ s///; G; y/\n/@/; p; }' |
while IFS=@ read -r vm_uuid vm_name; do
   printf 'VM "%s" has UUID "%s"\n' "$vm_name" "$vm_uuid"
done

引用自:https://unix.stackexchange.com/questions/657636