No puede probar comandos completos dentro de los corchetes test
del shell. Desea eliminar esos corchetes por completo, lo que hará que simplemente pruebe el código de salida de los comandos.
#!/bin/bash
PREVIOUS_COMMIT=e099d95d52b8fca99e47fd7cee5f782287178b27
SERVICE=service-web-prj1
if ! git diff "$PREVIOUS_COMMIT" HEAD --name-only | grep -qs "$SERVICE" || ! git diff "$PREVIOUS_COMMIT" HEAD --name-only | grep -qs 'service-web'
then
echo "Didn't pass first"
exit 0
fi
echo passed first with "$SERVICE"
if ( ! echo "$SERVICE" | grep -q "^service-web" )
then
echo "Didn't pass second"
exit 0
fi
echo passed second with "$SERVICE"
л.с.; ДР:
Есть несколько способов обойти это, я думаю, что самый чистый для вашего примера случай:
for i in {1..5};do sed -i "s/abc/$(seq -s ' ' 1 $i)/g" test; done
То есть :мы просим seq
использовать один единственный пробел для разделения каждого числа.
Пояснение:
Причина, по которой вы получили эти ошибки, заключается в том, что вывод из:
seq 1 5
не является:
1 2 3 4 5
а скорее:
1
2
3
4
5
А поскольку вы заключили$(seq 1 $i)
Подстановку команд в двойные -кавычки, обычное Разбиение слов не выполняется, следовательно, все символы новой строки (, кроме последней )выходные данные утилиты seq
остаются без изменений.
Поэтому фактическая sed
команда стала:
sed -i "s/abc/1
2
3
4
5
/g" test
который не принят, потому что, что касается sed
, вы предоставили его с командой s/abc/1
, т. е. без требуемого финального /
.
echo $(seq 1 5)
печатает 1 2 3 4 5
, потому что $(seq 1 5)
не находится в двойных -кавычках, поэтому разделение слов происходит в соответствии с поведением оболочки по умолчанию.
Мы действительно можем исправить ваш пример, как и в:
for i in {1..5};do sed -i "s/abc/$(echo $(seq 1 $i))/g" test; done
, то есть путем замены команды (исходнойseq 1 $i
)внутри другой замены команды (на echo
на ).
Это работает даже в двойных -кавычках, потому что $(echo...)
Подстановка команд выполняется в подоболочке , которая не в «Я -есть -] внутри -состояния -двойная -кавычка", поэтому разделение слов на выходе изseq
будет выполнено там .
Вы можете направить вывод во временный файл, а затем переместить временный файл поверх исходного. Кроме того, вы могли иметь в виду работать с одной строкой за раз, и в этом случае вам следует отказаться отg
:
for i in {1..5}; do
sed -e "s/abc/$(seq 1 $i)/" test > test.tmp
mv test.tmp test
done