Другой вариант в Bash, если вы не возражаете против одного простого eval
, вы можете сделать это с паройprintf
:
# example data
password=secretvalue
chars_to_show=3
# the real thing
eval "printf '*%.0s' {1..$((${#password} - chars_to_show))}"
printf '%s\n' "${password: -chars_to_show}"
Но будьте осторожны:
${#password}
меньше, чем${chars_to_show}
eval
может быть очень опасным с ненадежным входом :здесь его можно считать безопасным, потому что его ввод поступает только из безопасных источников, т.е. длина ${password}
и значение${chars_to_show}
Если вы хотите, чтобы все ваши тесты завершились, а затем вернули окончательный общий код состояния, вы должны запрограммировать его именно так. Вот один из способов
#!/bin/bash
#
ss=0
lint./module1/src/main/java || ((ss++))
lint./module2/src/main/java || ((ss++))
lint./module3/src/main/java || ((ss++))
exit $ss
В том виде, в котором он написан, происходит сбой с кодом выхода, соответствующим количеству неудачных тестов. Вы по-прежнему можете проверить истинность/ложь (ноль/не -ноль ), но если вам требуется, чтобы код завершался точно 1
в случае, если какой-либо один или несколько тестов потерпели неудачу, измените ((ss++))
на ss=1
.
Это немного хак, но вы можете использовать xargs
для этой цели. По умолчанию он выполняет все команды и завершается со статусом 123, если какая-либо из них не удалась.
Здесь мы запускаем три команды, все из которых терпят неудачу, но все выполняются:
echo '
echo 1 && exit 1
echo 2 && exit 1
echo 3 && exit 1
' | xargs -d "\n" -L1 -I{} bash -c {}
Это завершает работу со статусом выхода 123 (GNU xargs ), но выводит следующее, показывая, что все три команды были выполнены:
1
2
3
Аналогичный набор команд, все из которых успешно завершаются со статусом 0:
echo '
echo 1 && exit 0
echo 2 && exit 0
echo 3 && exit 0
' | xargs -L1 -I{} bash -c {}
Здесь статус выхода равен 0, как и следовало ожидать.