스크립트에서 변수 값=*을(를) 에코할 수 없습니다.

스크립트에서 변수 값=*을(를) 에코할 수 없습니다.

내 파일의 내용:

123  
**1    
**  

각 단어를 표시하는 스크립트를 사용해 보세요.

for i in $(cat $myfile)  
do  
  echo "$i"  
done  

결과적으로 echo *현재 디렉토리에 있는 파일이 나열되는데 그 이유는 모르겠습니다. 그래서 *이전 에코를 처리해 보았습니다 .

다른 스크립트의 내용:

for i in $(cat $myfile)  
do  
  if [[ $i == *\+ ]](regex pattern find 1 * or more.)  
  then  
       (?what should I do. I tried i="\*",i="*" etc.; it doesn't work)  
  fi  
  echo "$i"  
done

답변1

파일 이름 글로빙 은 가 아닌 for로 확장되는 -line 에서 발생합니다 .$(cat $myfile)echo

파일 내용을 반복할 때 다음을 사용하십시오 read.

while IFS= read -r words; do
    printf '%s\n' "$words"
done <"$myfile"

또한보십시오:


공백으로 구분된 각 단어를 자체 출력 줄에 표시하려면 다음을 수행하세요.

awk '{ for (i = 1; i <= NF; ++i) print $i }' "$myfile"

답변2

정답은 텍스트를 처리하기 위해 쉘 루프를 사용하지 말라는 것입니다. 하지만 빠른 해결을 원하신다면,

set -o noglob
for i in $(cat $myfile)
do
    echo "$i"
done
set +o noglob

noglob옵션은 경로 이름 확장을 방지하므로 파일 목록 대신 echo *파일 목록을 말하고 가져올 수 있습니다.*

답변3

실제로 두 가지 질문을 하고 있지만 둘 다 쉘이 역할을 처리하는 방법과 관련이 있습니다 *. 이 문자는 셸에서 특별한 의미를 가지며, 여러분이 발견한 대로 셸 매뉴얼 페이지에서 호출되는 특수한 형태의 정규식 역할을 합니다.전반적인 상황파일 이름에 대해. 이것이 바로 현재 디렉터리에서 파일 이름 목록을 얻는 이유입니다. 목록은 다음과 같습니다. 이 특정 유형의 정규식 구문의 모든 형태에 대한 자세한 설명은 쉘 매뉴얼 페이지의 globbing 섹션을 참조하십시오.

질문의 두 번째 부분은 이런 일이 발생하지 않도록 하는 방법을 묻는 것 같습니다. 두 가지 방법이 있습니다. 누구나탈출하다백슬래시가 앞에 \오거나 작은따옴표로 묶인 문자입니다. '*'.

관련 정보