ОБНОВЛЕНИЕ : В своем оригинальном решении я ошибочно предположил, что `END 'должен оставить начальный дефис, и я только что заметил, что это не так. Теперь я обновил свое решение, и новая версия стала немного проще:
Нет необходимости создавать дочерний процесс здесь. По сути, вы можете сделать
END=${STR#*-}
шаблон глобуса после #
, удаляющий все до первого -
. Это по-прежнему оставляет проблему открытой: если STR
не содержит переноса, вы получите исходную строку, а не пустую строку.
Поскольку вы отметили свой вопрос как bash и shell , я предложу решения для обоих.
В bash вы можете просто сделать
if [[ $STR == *-* ]]
then
END="${STR#*-}"
else
END=
fi
, поскольку [[
не является внешняя команда, для этого также не требуется подпроцесс.
В оболочке POSIX я бы сделал
END="${STR#*-}" # Remove up to (including) hyphen
if [ "$END" = "$STR" ]
then
# We did not have a hyphen
END=
fi
Это порождает один подпроцесс ([
), так что это дороже, чем версия bash.