
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 쉘에 의해 스크립트가 실행됩니다.bash
sh
./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가 말했듯이 코드를 심각하게 수정하고 새 질문을 게시하십시오.