【发布时间】:2021-08-06 14:28:27
【问题描述】:
所以我有一个 for 循环吐出我想要的信息(OpenStack 项目列表),我希望它为我创建目录。然而,有时,人们用空格来命名他们的项目,我需要考虑到这一点。这是我的命令的输出示例:
openstack project list
+----------------------------------+-----------------------------------------+
| ID | Name |
+----------------------------------+-----------------------------------------+
| 0c1abff4e920448ba86638bd0d78f7ca | testing_grounds |
| 0dc5bed65a6b4a168c7531b1b4972e95 | Michaud |
| 0eab4c57a6f34c01a0de65f433c1539c | Ansible Automation |
| 13d98b9d994c40029dcd2e9e4e38a26d | Sustaining Development |
| 2ec59a3a665946f4b9d5098d8562ebbb | Data Center Services |
| 379e46cbe60d420f977bf939ceed6961 | MF-DevStack |
| 63cecde0c0384e18a949247f03b8c490 | Kubernetes Labs |
| 677edd03e4ce439d884b017db19efd03 | mso-ems |
| 6865e32d9f8646b6aa449f440f1a1bb1 | Network Development |
| 6a239dc6ce9c4fdca4ba2ef38849fa3b | Data Engineering |
| 71ceb6e4c5f14f168ec18c069b636c02 | Data Center Operations Service Scanning |
| 785f0b62484549048e6772e058bb0eb6 | admin |
| 786b43df2b79470ea14da7468f9df1cc | service |
| 7ca98362cb98428e9ad94c880f3efcae | OpenStack-Example |
| 89498a55aa374fb4915c5a08b903fc23 | Petes-place |
| 92c3fabbddb54e1696cffa223655c5d9 | Image Factory |
| 9f342bd754e748e7a20bd383eab9f47d | Network Automation |
| bdcba2785f334af5a2379f79d77f1308 | Fault and Performance Management |
| cab8e3e810c24f29ace13ca3771cc41c | Microseg |
| cb41e6dea9744744a304c4ab77719062 | Development |
| ccf5970b1aa74f9ebb7a542b40110462 | Docker Enterprise |
| eb7d98031ec0407fb208b537a6888be5 | Application Architecture |
| f33c8dd6acfc467aa05215a5fe8e7798 | casa-de-pedro |
+----------------------------------+-----------------------------------------+
我的命令只允许我实际指定名称:
openstack project list -c Name -f value
看起来像这样:
testing_grounds
Michaud
Ansible Automation
Sustaining Development
Data Center Services
MF-DevStack
Kubernetes Labs
mso-ems
Network Development
Data Engineering
Data Center Operations Service Scanning
admin
service
OpenStack-Example
Petes-place
Image Factory
Network Automation
Fault and Performance Management
Microseg
Development
Docker Enterprise
Application Architecture
casa-de-pedro
所以我想制作一个脚本来收集每个项目的所有资源,并将资源存储在一个由项目名称标记的目录中。所以我考虑包装一个 for 循环来创建以项目名称命名的目录。我尝试了以下方法,但没有奏效:
for i in $(openstack project list -c Name -f value); do mkdir -p -- 'echo $i'; done
for i in $(openstack project list -c Name -f value); do mkdir -p -- "$i"; done
for i in $(openstack project list -c Name -f value); do mkdir -p -- $i; done
它们似乎都没有真正起作用,而不是将其封装在一个字符串中,它不起作用,而是仍然将名称分开,如Network Development 变为Network 和Development。我怎样才能让它工作,以便它可以解释项目名称中可能存在的任何空白。
【问题讨论】:
-
while IFS= read -r name; do echo mkdir -p "$name"; done < <(openstack project list -c Name -f value),如果您对输出感到满意,请移除回显。 -
我想我已经给了你关于 not
reading lines with for的链接以及如何正确地做到这一点,是吗? -
大声笑是的,你做到了,我现在真的开始讨厌 for 循环并且更喜欢这种方法。我之前确实尝试过,它可以使用这种方法,但我将输出存储为文本文件,项目因集群而异,所以我想让它动态而不是将其存储为文件,但我想我别无选择.
-
如果是文件则最后是
done < file.txt而不是Process Substitution。 -
< <(openstack project list -c Name -f value)注意它不适用于sh等。因为它是一个 bash 功能(可能是其他一些 shell)