내 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"
대체 만으로도 "$@"
충분합니다.)