명령 인수에 매개변수 사용

명령 인수에 매개변수 사용

find이름에 다음이 포함된 파일을 검색하는 명령을 실행합니다 perl.

find /tmp -name '*perl*'
/tmp/perl.pl
/tmp/run-perl-stage.pl

그러나 변수에 Perl 이름을 설정 PARAMETER하고 find명령을 다시 실행하면 결과가 나오지 않습니다! run find 명령을 사용하는 방법은 무엇입니까 $PARAMETER?

PARAMETER=perl
find /tmp -name '*$PARAMETER*'                 

어떤 결과도 얻지 못했습니다.

find /tmp -name '*\$PARAMETER*'

어떤 결과도 얻지 못했습니다.

답변1

작은따옴표가 아닌 큰따옴표를 사용해야 합니다.

작은따옴표 안의 '…'각 문자는 문자 그대로 해석됩니다. 특별하게 처리되는 유일한 문자는 리터럴 문자열을 종료하는 작은따옴표 문자입니다.

큰따옴표 내에서 "…"다음 문자는 특별하게 처리됩니다.

  • "(큰따옴표) 인용된 문자열을 종료합니다.
  • $(USD) 확장. 변수 대체나 명령 대체 또는 산술 표현식( "$PARAMETER", "${PARAMETER}", "${PARAMETER%/*}", 등) "$(somecommand)"을 시작할 수 있습니다.$((x+2))
  • `(백틱)이 확장됩니다. 이는 중첩된 명령에 특수 문자가 있을 때 사용하기 어려운 또 다른 형태의 명령 대체입니다. `foo`이와 유사 $(foo)하지만 복잡한 상황에서 올바르게 사용하기가 더 어렵습니다.
  • 대화형 셸에서는 !기록 확장이 트리거될 수 있습니다.
  • \(백슬래시)는 다음 문자를 인용하지만 해당 문자가 이 목록에 있는 문자 중 하나인 경우에만 해당됩니다. 다른 문자의 경우 백슬래시가 예약되어 있습니다. 예를 들어 "foo\$\bar"와 동일합니다 'foo$\bar'. 예외적으로 백슬래시 개행 시퀀스는 무시됩니다. 백슬래시는 다음 개행 문자를 차지합니다.

그 결과 작은따옴표로 묶인 문자열 내에 작은따옴표가 있을 수 없습니다. 이 문제를 해결하려면 부분을 함께 묶을 수 있습니다. 사이에 작은따옴표로 묶인 두 개의 문자열 (작은따옴표로 확장됨)을 사용하여 세 부분으로 표시되는 echo 'Here'\''s a string with a single quote'매개변수를 전달합니다 .echo\'

변수 대체를 원하므로 큰따옴표를 사용하십시오.

find /tmp -name "*$PARAMETER*"

그런데 "$PARAMETER"와 에는 차이가 있습니다 $PARAMETER. 쉘은 큰따옴표를 사용하여 값을 찾고 PARAMETER문자열을 명령줄로 확장합니다. 따옴표가 없으면 값은 PARAMETER공백으로 구분된 와일드카드 패턴 목록으로 해석됩니다. 이는 거의 바람직하지 않으므로 변수 및 명령 대체에는 항상 큰따옴표를 사용하십시오.

답변2

첫째, Bash에서 대문자 변수를 사용하지 마십시오. 기존 시스템 변수와 충돌할 수 있습니다.

둘째, 귀하의 질문에 대해 이렇게 할 수 있습니다(큰 따옴표가 아닌 작은 따옴표를 원하는 경우).

param='*perl*'
find /tmp/ -name $param

관련 정보