make
довольно надежно доступен. Если вы распространяете свой проект с makefile
, пользователи будут иметь простую справку о том, как выполнять задачи так же, как и вы. makefile
может использоваться не только для компиляции.
Возьмем, к примеру, проект, который не требует компиляции. Я помню, как работал над проектом Python, в котором была команда make для очистки всех файлов .pyc
, команда make для запуска тестов, команда для загрузки копии статических данных с сервера разработки и т. д.
Тогда вы, вероятно, захотите сделать что-то подобное:
c_arr=$(echo $(grep -i "${alias}\." $output_file))
Потому что, как упомянул Билл Джетцер, в регулярном выражении нужно избегать точки.
Если вы уверены, что все с точкой верно, вы можете даже сделать:
c_arr=$(echo $(grep -i \. $output_file))
.
— это оператор регулярного выражения, который соответствует любому одиночному символу.
Вот вам бы:
readarray -t c_arr < <(LC_ALL=C grep -iPo "\b\Q$alias\E\.\w+")
(предполагая, что $alias
не содержит \E
и ваш grep
поддерживает -P
(, он уже поддерживает -o
, который является расширением GNU, поэтому, вероятно, он также будет поддерживать -P
)).
В частности, отвечая на вопрос «Как удалить элементы, не содержащие определенного символа, из массива Bash». По структуре он очень похож на ответ Стефана Шазеласа. Если у вас есть массив и вы хотите его сократить, вы можете сделать это, как показано ниже:
$ list=(cab.row_id cab.name cabxa cabxa cab.x_sys_name)
$ printf "%s\n" ${list[@]}
cab.row_id
cab.name
cabxa
cabxa
cab.x_sys_name
$ # vvvv THIS ANSWERS THE QUESTION vvvv
$ IFS=$'\n' readarray -t list < <(printf "%s\n" ${list[@]} | grep '\.')
$ # ^^^^ THIS ANSWERS THE QUESTION ^^^^
$ printf "%s\n" ${list[@]}
cab.row_id
cab.name
cab.x_sys_name
Это предполагает, что ни один элемент не содержит \n
, поэтому его можно использовать в качестве разделителя.
Немного по касательной :Вы можете использовать unset
для удаления определенных элементов из массива, и это заставит Bash пропустить этот элемент при переборе элементов, но это не заставит все последующие элементы сместить значение индекса массива.:
$ list=(idx0 idx1 idx2 idx3 idx4)
$ printf "%s\n" ${list[@]}
idx0
idx1
idx2
idx3
idx4
$ unset list[2]
$ printf "%s\n" ${list[@]}
idx0
idx1
idx3
idx4
$ for x in ${list[@]}; do echo $x; done
idx0
idx1
idx3
idx4
$ for i in $(seq 0 4); do echo "$i: ${list[$i]}"; done
0: idx0
1: idx1
2:
3: idx3
4: idx4