Скажем, у меня есть строка в 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[@]}"
См. БашFAQ/050 относительно обоснования размещения команд в строках, а не в массивах.
Я не пишу 'ls' '-l'
, потому что знаю, что ls
и -l
можно смело оставлять без кавычек. То же самое здесь с -i
и file1
/file2
/file3
. Это то, к чему я клонил.
@johnkugelmann Их можно писать без кавычек, но только потому, что они не содержат специальных символов — самый безопасный способ — заключать их в кавычки. Однако религиозно сильного мнения нет.