bash - Bash 列表理解或映射
问题描述
假设我在 bash 中有一个字符串 -
NAMES="file1 file2 file3"
如何将其映射到以下字符串,然后将其用作命令的一部分?
MAPPED="-i file1.txt -i file2.txt -i file3.txt"
对于我的意思的一个例子,这是等效的python代码 -
names = "file1 file2 file3"
mapped = ' '.join("-i " + x + ".txt" for x in names.split())
解决方案
您应该使用数组而不是字符串:
names=(file1 file2 file3)
# Add suffix
names=("${names[@]/%/.txt}")
# Build new array with "-i" elements
for name in "${names[@]}"; do
mapped+=(-i "$name")
done
# Show result
declare -p mapped
导致此输出:
declare -a mapped=([0]="-i" [1]="file1.txt" [2]="-i" [3]="file2.txt" [4]="-i" [5]="file3.txt")
现在可以在这样的命令中使用它:
cmd "${mapped[@]}"
有关将命令放入字符串与数组的基本原理,请参阅BashFAQ/050 。
推荐阅读
- mysql - SELECT COUNT(*) 基于连接表条件
- c - 如何在使用 C 的 Linux 线程中修复“从套接字读取错误 - 文件描述符错误”?
- solr - 如何在 solr 上查看文本日志文件?
- angular - 在 Angular 2 向导中更改按钮的标签
- javascript - 如何在地图(html)坐标上设置图像或颜色?
- python - 如何使用 re.sub 将捕获组的内容替换为字符串?
- php - 乘法并输出和mysql php
- java - 如果字符串包含 Hamcrest containsInAnyOrder 匹配
- jquery - jQuery 与内联 CSS 冲突
- azure-logic-apps - 从 Azure 访问 On-Prem SQL Server,而无需在两者之间使用 On-Prem 数据网关