Скажем, у меня есть функция 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="$@"