#bash
Вопрос:
Я использую этот bash cmd / var, чтобы получить последнюю ссылку для загрузки Android Studio для Linux:
URL=$(wget "http://developer.android.com/sdk/index.html" -O - | grep -o "https://redirector.gvt1.com/edgedl/android/studio/ide-zips/[0-9.]*/android-studio-[0-9.]*-linux.tar.gz")
Когда я повторяю var, я получаю это:
[root@fedora tmp]# echo $URL
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
[root@fedora tmp]#
Что я могу сделать, чтобы ссылка была только один раз в var , я попробовал с head
ней, cut
awake
но ничего не получилось.
Комментарии:
1. Вы получаете несколько ссылок, потому что регулярное выражение совпадает несколько раз (они находятся в одной строке, потому что вы не используете кавычки при выводе var). Предполагая, что первая ссылка всегда будет правильной, добавление
| head -n1
в ваш конвейер послеgrep
должно сделать свое дело. Довольно большое предположение, хотя
Ответ №1:
wget
возвращает более одной строки (и grep
является фильтром для каждой строки). Чтобы принять только первую строку, используйте « | head -1
» после grep
команды :
URL=$(wget --quiet "http://developer.android.com/sdk/index.html" -O - | grep -o "https://redirector.gvt1.com/edgedl/android/studio/ide-zips/[0-9.]*/android-studio-[0-9.]*-linux.tar.gz" | head -1)
Я добавил опцию «`—quiet» в команду wget для более удобочитаемого вывода в терминале.
Арно под GNU/Linux Fedora
Комментарии:
1. без
head
«можетgrep -om1
быть»?
Ответ №2:
Я подозреваю, что пробел, разделяющий два вхождения URL-адреса, кажется, ведет себя не так, как ожидалось, со всеми видами команд.
Поскольку я не могу объяснить, что происходит, я собирался предложить вам обходной путь после загрузки с wget
помощью ; просто проблема:
URL=${URL%?https*}
чтобы избавиться от второго URL-адреса и таинственного символа, разделяющего оба события.
Но когда я увидел ответ Арно Вальмари выше, я должен признать, что он нашел правильное объяснение и правильное решение. Кредиты ему.
Ответ №3:
ПРИМЕЧАНИЕ: Не ответ; просто расширяю некоторые другие комментарии …
Когда мы ссылаемся на переменную и не получаем ожидаемого результата, подумайте о том, чтобы посмотреть на команды, используемые для создания того, что присваивается переменной. В этом случае, если мы отложим URL=$(...)
задание и просто запустим wget|grep
в командной строке:
$ wget "http://developer.android.com/sdk/index.html" -O - 2>amp;1 | grep -o "https://redirector.gvt1.com/edgedl/android/studio/ide-zips/[0-9.]*/android-studio-[0-9.]*-linux.tar.gz
ПРИМЕЧАНИЕ: Я добавил 2>amp;1
, чтобы заставить несколько строк stderr перейти в stdout.
Это приводит к следующему:
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
Сохраните это в URL
переменной, и мы получим:
$ URL=$(wget ... | grep ...)
$ typeset -p URL
declare -- URL="https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz"
Обратите внимание, что переменная имеет встроенный возврат каретки (т. Е. Данные хранятся в виде 2 строк).
Итак, как это выглядит с echo
точки зрения:
$ echo $URL # no double quotes => prints everything on single line:
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
$ echo "$URL" # wrapped in double quotes and the embedded carriage return is maintained
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2020.3.1.22/android-studio-2020.3.1.22-linux.tar.gz
Другие уже рассмотрели, как ограничить/отфильтровать то, что хранится внутри URL
…