Bash에서 변수를 배열 길이로 설정하는 중 오류가 발생했습니다.

Bash에서 변수를 배열 길이로 설정하는 중 오류가 발생했습니다.

기본적으로 원장에서 잔액을 두 개의 배열로 가져와 원하는 방식으로 인쇄할 수 있는 더 큰 스크립트에 다음 코드 조각이 있습니다.

#!/bin/bash
assets=("assets:checking" "assets:google wallet" "assets:savings" "assets:cash")
assets-bal=()

num=${#assets[@]}
for $i in {0..${num}}
do
  read -a tmp <<< `ledger -f finances balance "${assets[${i}]}"`
  assets-bal[${i}]=tmp[0]
  echo "${assets[${i}]}   ${assets-bal[${i}]}"
done

스크립트를 실행하려고 할 때마다 오류가 발생합니다.

syntax error near unexpected token `num=${#assets[@]}'
`num=${#assets[@]}'

내 검색 결과 해당 줄에 문제가 있어서는 안 됩니다. 왜 작동하지 않는지 찾으려고 빈 채로 남겨두었습니다.

누구든지 내가 어디로 잘못 가고 있는지 지적 할 수 있습니까?

답변1

문제는 다음과 같습니다.

assets-bal=()

변수 이름에는 대시가 포함될 수 없습니다. 밑줄만 사용할 수 있습니다.

bash어떻게 설명 해야 할지 모르겠지만 assets-bal=()명령이 불완전하여 다른 줄에서 완료되어야 한다고 생각합니다. 무슨 뜻인지 보려면 셸에서 이 줄을 실행해 보세요.

답변2

중괄호 확장이 완료되었으므로 변수가 지원되지 않습니다.변수 확장 전. seq꼭 필요한 경우 다음을 사용하세요.

for i in $(seq 0 ${num})

또는 (더 나은) 배열 키를 직접 가져옵니다.

for i in "${!assets[@]}"

(또한 for i in ..그렇지 않습니다 for $i in ...)


하우크라그첫 번째 오류가 발생했습니다. 이 문제를 해결하고 나면 다음 오류가 발생할 수 있습니다.


대신에

read -a tmp <<< `ledger -f finances balance "${assets[${i}]}"`

다음을 사용하는 것을 고려해보세요:

tmp=($(ledger -f finances balance "${assets[${i}]}"))

외부 ()명령 대체는 이를 배열로 변환합니다.

답변3

구문 오류가 있습니다. -변수 이름에 사용할 수 없습니다.

assets-bal

로 교체해야합니다

 assets_bal   

forFor 루프에는 C 스타일 루프를 사용할 수 있습니다 .

for ((i=0; i<${num}; i++)); do

답변4

나는 당신이 배열 유형과 일반적으로 변수에 너무 많이 의존하고 있다고 생각합니다. 위에서 수행 중인 작업을 올바르게 이해했다면 이 작업도 동일한 작업을 수행해야 한다고 생각합니다.

for a in checking google\ wallet savings cash
do  a=assets:$a
    printf "$a\t%d\n" "$(ledger -f finances balance "$a")"
done

$ased이는 위의 모든 값을 스트림에서 한 번에 읽은 다음 유사하거나 유사한 스크립트 편집기를 사용하여 정렬하는 방법으로 크게 개선될 수 있습니다. 일반적으로 쉘 변수는 중요한 값이나 크기에 관계없이 정보를 보관하기에는 매우 나쁜 장소입니다. 셸 변수는 파일에서 실제 정보를 보다 쉽게 ​​검색할 수 있도록 충분한 정보만 저장해야 합니다.

쉘 함수로 작성된 위 코드는 다음과 같습니다.

assets() if   [ "$#" -gt 0 ]
         then while [ "$#" -gt 0 ]
              do    printf "assets:%s\t%d\n" "$1" "$(
                    ledger -f finances balance "assets:$1")"
              shift;done
         else assets checking google\ wallet savings cash
         fi

...다음과 같이 호출할 수 있습니다.

assets

...기본 목록 또는 이와 유사한 것...

assets cash checking

...다른 목록에 대해 개별 쉘 변수 값을 설정할 필요가 전혀 없습니다.

관련 정보