首页 > 解决方案 > 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())

标签: bash

解决方案


您应该使用数组而不是字符串:

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 。


推荐阅读