" $Namefile* "이 이 결과를 제공하는 이유는 무엇입니까?

" $Namefile* "이 이 결과를 제공하는 이유는 무엇입니까?

제 코드에는 이런 부분이 있습니다.

Namefile=$1
for n in $Namefile*
do
echo $n
done

이 부분의 결과는 다음과 같습니다.

$ sh example.sh hw1
hw1_evening_sun.txt
hw1_morning_sun.txt
hw1_out_si_wire.txt
hw1_script.sh
hw1_script2.sh
hw1_script3.sh
hw1_sun1.txt
hw1_sun2.txt

이름이 "hw1"로 시작하는 파일이 있는데 이해가 안 돼요$Namefile*이 이러한 이름을 사용하는 이유내가 아는 한 * 호출 스크립트는 매개변수를 받습니다.

이 방법은 왜 이렇게 작동하는 걸까요? 누군가 이것의 논리를 설명할 수 있습니까?

답변1

$Namefile*이 왜 이러한 이름을 사용하는지 이해가 되지 않습니다. 내가 아는 한 * 호출 스크립트는 매개변수를 받습니다.

$Namefile은 전달한 값(아마도 "hw")으로 확장됩니다. 이는 $Namefile* 변수가 확장 후 "hw*"가 됨을 의미합니다.

*는 이 문자열이 파일 이름으로 해석되는 데 사용될 때 특별합니다. 매뉴얼 페이지의 "경로 이름 확장"을 참조하십시오.

... bash는 각 단어에서 *, ? 및 [ 문자를 검색합니다. 이러한 문자 중 하나가 발생하면 해당 단어는 패턴으로 처리되고 패턴과 일치하는 파일 이름의 알파벳순 목록으로 대체됩니다.

답변2

여기에서는 for 루프에서 대체를 수행하고 있습니다. 따라서 star는 $Namefile문자열 뒤의 모든 문자 와 일치합니다 ("hw1"인 것 같습니다). 스크립트에 제공된 모든 인수를 일치시키려면 내부 변수를 사용하십시오 $*. 스크립트에서 $1wh1(위치 매개변수 번호 1)을 변수 Namefile에 저장합니다. 따라서 *와 .를 나중에 사용하는 것은 $Namefile다른 의미를 갖습니다 $*. 자세한 내용은 여기를 참조하세요내부 변수(위치 매개변수 섹션)

답변3

-l이것은 단지 옵션 때문입니다 ls. 이 경우에는 다음 $Namefile*으로 확장됩니다 hw1_evening_sun.txt ..snip.. hw1_sun2.txt.

ls -l $Namefile*

실제로는

ls -l hw1_evening_sun.txt ..snip.. hw1_sun2.txt

더 자세히 알아보려면 다음을 실행하세요 man ls.

...  
   -l     use a long listing format  
...

*nix에 오신 것을 환영합니다.

답변4

이는 do 루프가 다음과 같기 때문입니다. -l기대 에 부응하는 결과를 얻으려면 다음을 수행해야 합니다.그 부분백틱 안의 스크립트는 다음과 같습니다.


TMP 파일

Namefile=$1
for n in $Namefile*
do
echo $n
done

특정 부분을 실행하려면,

ls -l `./tmp.sh "d"`

-bash-3.2$ ls -l `./again d`
-rw-r--r-- 1 me me 0 Jun  3 05:16 dat
-rw-r--r-- 1 me me 0 Jun  3 05:16 dis

관련 정보