在构造URL时使用bash函数的所有参数

时间:2019-05-17 16:38:18

标签: bash

说我有一个Bash功能所以,像这样

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

我从这样的shell调用

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 个答案:

答案 0 :(得分:3)

由于您的目标是将所有参数连接在一起成为一个字符串以作为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"
}

...通过在无法将其解析为shell命令的上下文中读取输入,即使对于诸如How can I safely pass the value assigned with var=$'$(rm -rf ~)\'$(rm -rf ~)\'' on a SSH command line?

之类的问题也很安全

答案 1 :(得分:0)

您可以使用 $ @ ,它是所有输入参数的数组。

在您的示例中,它将类似于:

public function store(Request $request, $user_id, $broker_id)
         {
             $get_item_id = $request->all();
             foreach($get_item_id as $data)
             {
             $store_item = $this->patient->store(array_merge($data, ['user_id' => $user_id], ['broker_id' => $broker_id ]));
             }
             return response()->json(['success' => true, 'data'=> ['items' => $get_item_id)]],200);

         }