Используйте все аргументы функции bash при создании URL - PullRequest
1 голос
/ 17 мая 2019

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

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

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

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

, что дает мне https://stackoverflow.com/search?q=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 ]

3 голосов
/ 17 мая 2019

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

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

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


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

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?

0 голосов
/ 17 мая 2019

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

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

    open https://stackoverflow.com/search?q="$@"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...