Используйте все аргументы функции bash при создании URL

Скажем, у меня есть функция Bash, вот так

function so
{
    open https://stackoverflow.com/search?q=$1
}

Который я вызываю из оболочки, как это

jessescott@Jesses-MacBook-Pro:~$ so foo

Теперь, если я хочу искать

jessescott@Jesses-MacBook-Pro:~$ so foo bar

это не будет захватывать 'bar', потому что аргументы разделяются пробелами.

Я, конечно, могу добавить $2 к функции, но я хочу, чтобы n args можно было передавать.

Я также могу избежать $1 как это

function so
{
    open https://stackoverflow.com/search?q="$1"
}

что требует от меня идти

jessescott@Jesses-MacBook-Pro:~$ so 'foo bar'

... это работает, но не является оптимальным, потому что нужно помнить, чтобы избежать моих цитат.

Я упускаю очевидное другое решение в моей функции?

Всего 2 ответа


Поскольку ваша цель состоит в том, чтобы объединить все аргументы в одну строку для передачи в виде URL, "$*" является инструментом для задания:

so() { open https://stackoverflow.com/search?q="$*"; } 

При этом используется первая буква в IFS (по умолчанию пробел) для разделения всех аргументов.


Тем не менее, это не всегда безопасно, когда ваши вопросы могут содержать произвольный текст. Подумайте о том, чтобы принять ввод вместо stdin например:

so() {
  local title
  IFS= read -r -p 'Question title: ' title
  [[ $title ]] && open https://stackoverflow.com/search?q="$title"
}

... который, читая входные данные в контексте, где он не может быть проанализирован как команда оболочки, безопасен даже для таких вопросов, как, скажем, How can I safely pass the value assigned with var=$'$(rm -rf ~)'$(rm -rf ~)'' on a SSH command line?


Вы можете использовать $ @, который является массивом всех входных параметров.

В вашем примере это будет что-то вроде:

    open https://stackoverflow.com/search?q="$@"

Есть идеи?

10000