이 문자열을 0이 아닌 항목에 대한 출력으로 얻으려고 합니다.
[21-40]
[41-60]
[61-80]
[81-100]
그러나 다음 스크립트는 어떻게든 _FILENAME
변수의 내용을 평가하려고 시도합니다.
#!/bin/bash
for i in 0 21 41 61 81
do
if (( $i > 0 ))
then
_FILENAME="[$i-$((i+19))]"
else
_FILENAME="First File"
fi
echo $_FILENAME
done
여기에 몇 가지 구문이 누락되었다고 확신합니다.
답변1
변수 참조 주위에 큰따옴표를 사용하십시오(예 $_FILENAME
: 큰따옴표가 없으면 쉘은 변수의 내용을 여러 "단어"로 분할하고 찾은 파일 글로브(와일드카드 표현식)를 확장하려고 시도합니다. 다음과 같이 표현됩니다.[21-40]
예globs(이것은 "2", "1"부터 "4" 또는 "0"이라는 이름의 모든 파일과 일치합니다). 현재 디렉토리에 이름이 일치하는 파일이 있으면 대괄호 표현식 대신 파일 목록이 인쇄됩니다. 따라서 해야 할 일은 다음을 사용하는 것뿐입니다.
echo "$_FILENAME"
인용되지 않은 버전보다는. 그런데 쉘이나 다른 프로그램에 특별한 의미를 갖는 많은 마법 변수와의 충돌을 피하기 위해 쉘 변수 이름에 소문자(또는 대소문자 혼합)를 사용하는 것이 가장 좋습니다.
답변2
Gordon이 코드 문제를 올바르게 설명했습니다.그의 대답에. 내가 작성한 것과 같은 대체 버전의 코드를 제공합니다.
echo 'First file'
for (( i = 20; i < 100; i += 20 )); do
printf '[%d-%d]\n' "$(( i + 1 ))" "$(( i + 20 ))"
done
printf
일반적으로 사용자가 제공하거나 변경 가능한 데이터를 출력하는 데 사용하는 것이 더 안전합니다. 예를 들어 참조하십시오.왜 printf가 echo보다 나은가요?
간격은 규칙적이므로 for
각 간격 시작 번호를 명시적으로 나열하는 것보다 C 스타일 루프가 더 적합할 수 있습니다.