bash 스크립트에 매개변수(= *가 있는 경로)를 전달하는 방법

bash 스크립트에 매개변수(= *가 있는 경로)를 전달하는 방법

여기 누구든지 *가 bash 쉘 스크립트에 전달되지 않는 이유를 말해 줄 수 있습니까?

내 스크립트는 top40이라고 불립니다.

 #!/bin/bash
 sudo du -shx $1 | sort -rh | head -n 40

실행하려고 하면 top40 /var/**가 무시됩니다. 그것은 비슷 top40 /var하지만 디렉토리의 처음 40개 크기를 보고 싶습니다.

스크립트 없이 이 작업을 프롬프트에 입력하면 제대로 작동합니다.

나는 이것에 대한 이유를 정말로 찾을 수 없다. 눈을 뜨게 해주셔서 감사합니다. 우분투 18.04 LTS를 사용합니다

답변1

이것이 기본 쉘이다.확장. 호출 쉘은 와일드카드 문자를 인식하므로 *실제로는너한테 설명해봐, /var/에 있는 모든 항목 목록을 스크립트에 전달합니다.

만약 너라면탈출하다와일드카드 또는인용하다호출 셸에서 확장되는 것을 방지하기 위한 와일드카드이며 예상한 대로 스크립트에 전달됩니다.

귀하의 의도를 올바르게 이해했다면 귀하가 원하는 것을 수행할 수 있는 두 가지 예가 있습니다.

  • /path/to/script.sh '/var/run/*'
    • 이 예에서는 작은따옴표로 묶인 문자열 내에 별표를 배치하여 셸 해석을 방지합니다. 이는 확장을 우회하고 있는 그대로 스크립트에 전달됩니다.
  • /path/to/script.sh /var/run/\*
    • 이 예는 단순히 쉘 확장에서 단일 별표 문자를 이스케이프합니다.

두 예제 모두 문자열이 /var/run/*있는 그대로 스크립트에 전달 되어 가 됩니다 $1.

관련 정보