형식 지정, xargs 사용, 데이터를 스크립트에 전달하는 방법 등을 다루면서 배열을 만드는 데 문제가 있습니다.
alias lstest='ls | xargs --delimiter="\n" ~/.config/lsdif_color.sh'
for fileLine in "$@"
do
if [[ $fileLine == total* ]]; then echo $fileLine;
else
cols=($fileLine);
echo ${#cols}, $l
echo ${cols[0]}
echo ${cols[$(( ${#cols}-1 ))]}
fi;
done
그래서 이것은 훌륭하게 작동합니다. "cols" 배열은 올바른 길이를 보여주고 첫 번째와 마지막 요소가 완벽하게 출력됩니다.
이제 질문은 다음과 같습니다.
...
else
# Method 1
declare -a cw=(11 2 8 7 6 5 4 3 6 0);
echo ${#cw}
# Method 2
widths=($(11 2 8 7 6 5 4 3 6 0));
echo ${#widths}
#Method 3
cws[0]="11"
cws[1]="2"
cws[3]="8"
cws[4]="7"
cws[5]="6"
cws[6]="5"
cws[7]="4"
cws[8]="3"
cws[9]="6"
cws[10]="0"
echo ${#cws}
fi;
이러한 배열을 정의하는 세 가지 방법 모두에서 에코 길이는 항상 2입니다. 10 대신. 위의 Cols 배열에는 10개의 요소가 나열되어 있지만 숫자 배열을 만들려고 하면 문자열로 만들어도 실패합니다.
왜?
Jaeden "Sifo Dyas" al'Raec Ruiner에게 감사드립니다.
답변1
다음을 사용하면 됩니다:
echo {#cws[@]}
{#cws}
일반적으로 문자열의 길이를 반환하는 데 사용됩니다.[@]
이것이 없으면 값은$cws
전체 배열이 아니지만 기본값은 배열 값의 첫 번째 요소(일명)가 되기 때문에 중요 합니다 .$cws[0]
예를 들어 명령 프롬프트에서 다음과 유사한 간단한 3개 요소 배열을 만들 수 있습니다.
$ cws[0]="11"; cws[1]="2"; cws[3]="8"
이제 다음을 인용하면 어떤 일이 일어나는지 살펴보십시오 $cws
.
$ echo $cws
11
따라서 bash 확장을 사용하여 무언가의 길이를 결정할 때 {#
... }
, 그렇지 않은 경우 , is 라고 [@]
쓰고 bash에게 "11의 길이는 얼마입니까?"라고 묻습니다. 물론 bash는 두 문자가 포함된 문자열을 확인하므로 Bash는 "오, 그건 2입니다"라고 말합니다.${#cws}
$cws
11
11
$ echo ${#cws}
2
이것이 바로 배열의 길이를 지정하는 이유입니다 [@]
. 다음을 기억하세요.
$ echo ${#cws[@]}
3
답변2
문제는 배열을 참조하는 방법입니다. 시작:
$ declare -a cw=(11 2 8 7 6 5 4 3 6 0)
이제 길이를 두 가지 다른 방식으로 살펴보겠습니다.
$ echo ${#cw}
2
$ echo ${#cw[@]}
10
첫 번째 메소드는 인덱스 0(이 경우 첫 번째 요소이기도 함 cw
)에 있는 요소의 길이를 반환합니다. 대조적으로, 두 번째 방법은 배열의 요소 수를 반환합니다.
더
질문에는 다음 코드가 있습니다.
widths=($(11 2 8 7 6 5 4 3 6 0));
11
이 코드는 매개변수를 사용하여 명령을 실행하려고 시도합니다 2 8 7 6 5 4 3 6 0
. 결과는 이름이 지정된 명령이 존재하는지 여부에 따라 달라집니다 11
. 그렇지 않은 경우 다음이 표시됩니다.
bash: 11: command not found