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. 큰따옴표가 없으면 쉘은 변수의 내용을 여러 "단어"로 분할하고 찾은 파일 glob(와일드카드 표현식)을 확장하려고 시도합니다. 같은 표현[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 스타일 루프가 더 적합할 수 있습니다.

관련 정보