Расширение скобок элементами массива

Пример Makefileдля моего очень маленького проекта:getPixelColor

Он делает именно то, что говорит его название, принимая два необязательных аргумента — координаты.

Мне особенно нравится, как там все становится зависимым.

COORDS ?= 0 0

CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
LDLIBS := -lX11
RM := rm -f

BIN := getPixelColor
SRC := $(BIN).cpp

$(BIN): $(SRC)
    $(CXX) $(CXXFLAGS) $(SRC) -o $(BIN) $(LDLIBS)

.PHONY: clean
clean:
    $(RM) $(BIN)

.PHONY: run
run: $(BIN)
   ./$(BIN) $(COORDS)

Как видите, он может делать все, что вам нужно, не вводя ничего лишнего:


Использование

Вы можете запустить это так:

  1. Очистить -старый бинарный файл:

    make clean
    
  2. Скомпилируйте новый бинарник:

    make
    
  3. Запустите исполняемый файл двумя способами:

    • координаты по умолчанию [0,0]

      make run     # equals COORDS='0 0'
      
    • любые заданные координаты

      COORDS='5 6' make run
      

Makefiles иногда могут быть чрезвычайно полезны. Чем больше проект, тем больше выгода. Но даже с этим мой самый маленький проект на C++, как вы можете видеть на примерах, избавляет вас от многих головных болей.

3
16.07.2020, 05:04
2 ответа

Можно использовать расширение параметра

.
$ arr=(a b c)

$ echo "${arr[@]/#/foo.}"
foo.a foo.b foo.c
4
18.03.2021, 23:19

Если вам не нужно использоватьbash:

rc/ es/akanga

(это поведение по умолчанию):

$ arr=(a b c)
$ echo foo.$arr
foo.a foo.b foo.c

zsh:

$ arr=(a b c)
$ echo foo.$^arr
foo.a foo.b foo.c

Или

$ set -o rcexpandparam
$ arr=(a b c)
$ echo foo.$arr
foo.a foo.b foo.c

(^включает rcexpandparamдля этого расширения, например =включает shwordsplitили~globsubst)

рыба

(также поведение по умолчанию)

$ set arr a b c
$ echo foo.$arr
foo.a foo.b foo.c

Все эти оболочки имеют лучший дизайн массива, чем сам bash (, скопированный из ksh )).

Обратите внимание, что раскрытие zshи fishработает аналогично раскрытию скобок. В rcотличается при использовании echo $arr.$arr, что дает:

a.a b.b c.c

а в fish/zsh -o rcexpandparamвыдает то же, что и echo {a,b,c}.{a,b,c}, то есть:

a.a a.b a.c b.a b.b b.c c.a c.b c.c
3
18.03.2021, 23:19

Теги

Похожие вопросы