次のbashの例を見てください(実際の出力はから来ていることに注意してくださいvboxmanage list vms
)。
TEST='"ubuntu server" foo bar'
echo $TEST
"ubuntu server" foo bar
(ループまたは別の変数から)3つの値をどのように分離できますか?私が見つけたすべての解決策はスペース区切りに依存し、最初の値を破壊します。
ベストアンサー1
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
長い形式を使用してシステムを一覧表示し、名前を解析します。その後、これらの名前はシェルループから読み取られ、各名前に対して短いメッセージが印刷されます。
名前を配列として読むこともできます。
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