Bash의 for 루프

Bash의 for 루프

1부터 변수에 저장된 숫자까지 실행되는 for 루프를 만들고 싶습니다. 하지만 다음과 같은 오류가 발생합니다.

구문 오류: 루프 변수에 대한 잘못된 내용

이것은 내 스크립트입니다.

#!/bin/bash

count_lines () 
{
  local f=$1  
  l=`wc -l $f | sed 's/^\([0-9]*\).*$/\1/'`
}
echo "$0 counts the lines of code" 
l=0
while [ "$*" != ""  ]
do
        count_lines $1
        echo "$1: $l"
        shift
done
for(( i= 0 ; i <= ${l} ; i++))
do
   title=$(grep -oPm1 "(?<=<title>)[^<]+" <<< "$0")
   echo "$title"
done

답변1

스크립트가 실행 가능한지 확인하고 명령(경로 포함)을 입력하여 스크립트를 실행하세요. 예를 들어 스크립트가 호출 foo되고 현재 디렉터리에 있는 경우 다음을 실행합니다.

./foo

오류 메시지가 나타나면 비슷한 작업을 수행하고 있는 것입니다 sh foo. 컴퓨터에 사용 중인 for 루프 구문을 지원하지 않는 다른 쉘(아마도 대시) 이 있습니다 sh. 을 실행하면 첫 번째 줄에 언급된 bash 쉘에 의해 스크립트가 실행됩니다.bashsh./foo

스크립트에는 이상한 부분이 여러 개 있습니다.

  • 변수 대체에는 항상 큰따옴표를 사용하세요.: "$1", "$f", 등.
  • while [ "$*" != "" ] …루프는 스크립트 매개변수를 반복하는 매우 우회적인 방법입니다. 간단하고 관용적인 방법은 다음과 같습니다.

    for x; do
      count_lines "$x"
    done
    

    또는

    for x in "$@"; do
      count_lines "$x"
    done
    
  • 무엇을 하려는지 잘 모르겠습니다 title=$(grep -oPm1 "(?<=<title>)[^<]+" <<< "$0"). "$0"스크립트 경로이므로 (?<=<title>)[^<]+스크립트 경로에서 정규식을 검색하고 있는데 이는 의미가 없습니다.

답변2

내 생각에 주요 문제는 파일이 실제로 존재하는지 테스트하지 않고 l루프에 유효하지 않은 카운트를 얻는 것입니다 for.

몇 가지 아이디어를 얻으려면 이 (매우 수정된) 유사한 스크립트를 살펴보십시오.

#!/bin/bash

count_lines() {
if [[ -r $1 ]]; then     # if the file exist.
  l="$(wc -l "$1")"      # count the number of lines.
  l="${l%%[^0-9]*}"      # remove anything that is not a digit from the end.
else
  l=0
fi
}
echo "$0 counts the lines of code"

for file; do               # while there is an argument.
  count_lines "$file"    # execute the function above
  echo "$file: $l"       # print the number of lines.
done

echo "$(grep -oPm1 "(?<=<title>)[^<]+" "$0")"

파일 내부를 l찾기 위해 명령(grep)을 실행하려는 이유를 이해할 수 없습니다 . title한 번이면 충분합니다.

또한 grep 명령은 외부 파일이 아닌 스크립트를 읽고 있습니다.

Giles가 말했듯이 코드를 심각하게 수정하고 새 질문을 게시하십시오.

관련 정보