![스크립트에서 변수 값=*을(를) 에코할 수 없습니다.](https://linux55.com/image/126574/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EB%B3%80%EC%88%98%20%EA%B0%92%3D*%EC%9D%84(%EB%A5%BC)%20%EC%97%90%EC%BD%94%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
내 파일의 내용:
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"
또한보십시오:
- "IFS=read-r-line" 이해
- 쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?
- bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험
공백으로 구분된 각 단어를 자체 출력 줄에 표시하려면 다음을 수행하세요.
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 섹션을 참조하십시오.
질문의 두 번째 부분은 이런 일이 발생하지 않도록 하는 방법을 묻는 것 같습니다. 두 가지 방법이 있습니다. 누구나탈출하다백슬래시가 앞에 \
오거나 작은따옴표로 묶인 문자입니다. '*'
.