Дано:
if [ '`echo "$url" | grep (\.tar\.gz|\.tar\.bz2|\.zip|\.rar|\.7z)$`' ] ; then
Само по себе, это не синтаксическая ошибка - любая синтаксическая ошибка, вероятно, рядом.
С другой стороны, это тоже не то, что вы хотите. Строка между квадратными скобками заключена в одинарные кавычки; это само по себе. Тест проверяет, является ли строка пустой (нет), и продолжает выполнение кода в предложении then
.
Вам нужно использовать что-то вроде:
if [ $(echo "$url" | grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' ) ] ; then
- Используйте '
$(...)
' вместо обратных тиков.
- Используйте '
grep -E
' для активации расширенных регулярных выражений.
- Фактор лидирующих '.' из расширений.
- Помните, что '
.tgz
' является допустимым (хотя и редким) расширением для сжатых tar-файлов.
И затем, как Деннис указывает в комментарии, вы можете заметить, что совсем не обязательно использовать тестовую команду или подстановку команд:
if echo "$url" | grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' >/dev/null ; then
Это проверяет состояние выхода конвейера, которое является состоянием выхода из grep
, которое будет 0 (успех), если один из суффиксов был распознан, и 1 (сбой), если ни один из них не был. И затем, если мы используем Bash, вы также можете избежать конвейера:
if grep -E '\.(tar\.gz|tar\.bz2|zip|rar|7z|tgz)$' <<< "$url" >/dev/null ; then
И мы также можем вообще избежать использования второго процесса, переписав код для использования оператора case
:
case "$url" in
(*.tar.gz|*.tar.bz2|*.zip|*.rar|*.7z|*.tgz|*.xz)
# Do what was in the 'then' clause
;;
(*) # Do what was in the 'else' clause
;;
esac
- Обратите внимание, что
.xz
также является схемой сжатия, с которой вы можете столкнуться.