$@를 따옴표로 묶는 방법은 무엇입니까?

$@를 따옴표로 묶는 방법은 무엇입니까?

내 bash 스크립트는 다음과 같습니다.

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

파일은 다음 위치에 저장됩니다./usr/bin/findstr

이것을 실행하면 모든 것이 잘 작동합니다.

findstr hello

하지만 내가 이것을 실행하면 :

findstr hello world

hello만 검색합니다.

질문:$@단일 매개변수임을 이해하도록 따옴표를 추가하려면 어떻게 해야 합니까 ?

답변1

정규식(예: 인수 사이에 공백 문자를 연결)을 검색하려면 다음을 수행하세요.

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

"$*"위치 인수를 첫 번째 문자와 연결합니다(실제로는바이트제외하고 yash) $IFS.

다음을 실행하면 (공백의 의미가 혼란스러워 보이기 때문에) 다음을 참고하세요.

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

공백(또는 따옴표)은 통과되지 않으며 myscript단지 쉘 명령줄 구문의 일부일 뿐입니다. 이 3개의 쉘 명령줄에는 myscript"myscript", "hello" 및 "world"라는 동일한 3개의 매개변수가 수신됩니다.

매개변수로 전달된 정규식을 검색하려면 다음을 수행하세요.

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

답변2

스크립트를 호출할 때 매개변수를 인용하여 두 개의 개별 매개변수가 아니라 하나의 매개변수임을 나타내야 합니다. 스크립트에서는 를 사용해야 합니다 "$@".

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

전화는 (예를 들어)...

findstr "hello world"

(그러나 grep 모드는 하나의 인수만 취하므로 "$1"대체 만으로도 "$@"충분합니다.)

관련 정보