기본적으로 원장에서 잔액을 두 개의 배열로 가져와 원하는 방식으로 인쇄할 수 있는 더 큰 스크립트에 다음 코드 조각이 있습니다.
#!/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
for
For 루프에는 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
$a
sed
이는 위의 모든 값을 스트림에서 한 번에 읽은 다음 유사하거나 유사한 스크립트 편집기를 사용하여 정렬하는 방법으로 크게 개선될 수 있습니다. 일반적으로 쉘 변수는 중요한 값이나 크기에 관계없이 정보를 보관하기에는 매우 나쁜 장소입니다. 셸 변수는 파일에서 실제 정보를 보다 쉽게 검색할 수 있도록 충분한 정보만 저장해야 합니다.
쉘 함수로 작성된 위 코드는 다음과 같습니다.
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
...다른 목록에 대해 개별 쉘 변수 값을 설정할 필요가 전혀 없습니다.