Como colocar $ @ entre aspas?

1

Meu script bash é assim:

#!/bin/bash
grep -r --color=always $@ . | nolong

O arquivo é salvo em /usr/bin/findstr

Tudo está bem quando executo isso:

findstr hello

Mas quando eu executo isso:

findstr hello world

Ele procura apenas por hello.

Pergunta: Como posso colocar $@ entre aspas, para que ele entenda que é um único parâmetro?

    
por Artur Efimov 13.03.2015 / 13:08

2 respostas

6

Se você quiser procurar o regexp que é a concatenação dos argumentos com caracteres de espaço no meio, isso seria:

#! /bin/sh -
IFS=' ' # used for "$*"
grep -r --color=always -e "$*" . | nolong

"$*" une os parâmetros posicionais com o primeiro caractere (na verdade byte exceto com yash ) de $IFS .

Note (como você parece estar confuso com o significado de espaço) que, se você executar:

myscript hello world
myscript hello  world
myscript 'hello'   "world"

Os espaços (ou aspas) não são passados para myscript , eles são apenas parte da sintaxe de linha de comando do shell. Nessas 3 linhas de comando do shell, myscript recebe os mesmos 3 argumentos: "myscript", "hello" e "world".

Se você quiser procurar por qualquer um dos regexps passados como argumentos:

#! /bin/sh -
for i do
  set -- "$@" -e "$i"
  shift
done
[ "$#" -gt 0 ] && grep -r --color=always "$@" . | nolong
    
por 13.03.2015 / 13:58
0

Você precisa citar o argumento quando seu script é chamado para mostrar que é um argumento e não dois argumentos independentes. Dentro do seu script você tem que usar "$@" .

grep -r --color=always "$@" . | nolong

E a chamada é (por exemplo) ...

findstr "hello world"

(Mas note que o padrão grep usa apenas um argumento, então "$1" ao invés de "$@" teria bastado).

    
por 13.03.2015 / 13:14