Bash 스크립트에서 수학과 관련된 연결 문자열을 계산하는 방법

Bash 스크립트에서 수학과 관련된 연결 문자열을 계산하는 방법

이 문자열을 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 스타일 루프가 더 적합할 수 있습니다.

관련 정보