제 코드에는 이런 부분이 있습니다.
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"인 것 같습니다). 스크립트에 제공된 모든 인수를 일치시키려면 내부 변수를 사용하십시오 $*
. 스크립트에서 $1
wh1(위치 매개변수 번호 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