유닉스 쉘의 배열?


답변:


90

다음 코드는 셸에서 문자열 배열을 만들고 인쇄합니다.

#!/bin/bash
array=("A" "B" "ElementC" "ElementE")
for element in "${array[@]}"
do
    echo "$element"
done

echo
echo "Number of elements: ${#array[@]}"
echo
echo "${array[@]}"

결과:

A
B
ElementC
ElementE

Number of elements: 4

A B ElementC ElementE

61

bash에서는 다음과 같은 배열을 만듭니다.

arr=(one two three)

요소를 호출하려면

$ echo "${arr[0]}"
one
$ echo "${arr[2]}"
three

사용자 입력을 요청하려면 읽기를 사용할 수 있습니다.

read -p "Enter your choice: " choice

공백으로 구분 된 선언은 /bin/sh오류 발생 과 함께 작동하지 않습니다 line 1: syntax error: unexpected "(". 대안을 알고 있습니까?
mhyousefi

20

Bourne 쉘은 배열을 지원하지 않습니다. 그러나 문제를 처리하는 방법에는 두 가지가 있습니다.

위치 쉘 매개 변수 $ 1, $ 2 등을 사용하십시오.

$ set one two three
$ echo $*
one two three
$ echo $#
3
$ echo $2
two

변수 평가 사용 :

$ n=1 ; eval a$n="one" 
$ n=2 ; eval a$n="two" 
$ n=3 ; eval a$n="three"
$ n=2
$ eval echo \$a$n
two

1
Bash는 배열을 지원합니다. 확실하지 원래 Bourne 쉘에 대해,하지만 bash는 요즘 ... 더 유행
plesiv

2
@zplesivcak-... GNU / 리눅스에서 GNU이기 때문입니다. 예를 들어, FreeBSD 는 함께 제공되지 않습니다 bash(하지만 포트에서 설치할 수 있습니다). 가정 작성 스크립트 bash기능은 휴대용 아니며, 그들은 noticably 느린 (같은 대부분의 Bourne 쉘 구현보다 느린 것 dash, 입니다 GNU / Linux 배포판에 공통). bash좋은 대화 형 셸이지만 스크립팅에는 느립니다.
beatgammit

1
$*유해한 것으로 간주됩니다. 일반적으로 $@동일하기 때문에 선호되지만 공백을 유지합니다. $@반면, "$ 1" "$ 2" "$ 3"... "$ N"으로 확장 $*"$ 1 배속 2 배속 $ $ 3X ... N $"로서 여기서 확장 x$IFS세퍼레이터 (대부분 공간).
zserge 2014

1
따옴표 없음 $@은 다음과 같습니다 $*. 차이점은 따옴표로 묶인 경우에만 나타납니다 . 원래 단어 분리는 유지 "$*"하면서 한 단어 "$@"입니다.
Mark Reed

질문은 태그가 지정 bash되어 있으므로 bash 특정 응답이 적절하지만 그것이 /bin/shbash 라고 가정해서는 안된다는 것은 확실히 사실입니다 .
Mark Reed

13
#!/bin/bash

# define a array, space to separate every item
foo=(foo1 foo2)

# access
echo "${foo[1]}"

# add or changes
foo[0]=bar
foo[2]=cat
foo[1000]=also_OK

ABS "Advanced Bash-Scripting Guide"를 읽을 수 있습니다.


3
ABS를 학습 리소스로 제안하는 것을 다시 고려하십시오 .W3Schools가 HTML 및 Javascript에 얼마나 큰 영향을 미치는지, 많은 Google 주스를 가지고 있지만 많은 예제에서 나쁜 관행을 보여주고 드물고 부적절하게 업데이트되는 것은 여러 가지입니다. bash-hackers의 위키 는 훨씬 더 나은 리소스입니다. 그래서입니다 BashGuide은 .
Charles Duffy

공백으로 구분 된 선언은 /bin/sh오류 발생 과 함께 작동하지 않습니다 line 1: syntax error: unexpected "(". 대안을 알고 있습니까?
mhyousefi

8

Bourne 쉘과 C 쉘에는 IIRC라는 배열이 없습니다.

다른 사람들이 말한 것 외에도 Bash에서 다음과 같이 배열의 요소 수를 얻을 수 있습니다.

elements=${#arrayname[@]}

슬라이스 스타일 작업을 수행합니다.

arrayname=(apple banana cherry)
echo ${arrayname[@]:1}                   # yields "banana cherry"
echo ${arrayname[@]: -1}                 # yields "cherry"
echo ${arrayname[${#arrayname[@]}-1]}    # yields "cherry"
echo ${arrayname[@]:0:2}                 # yields "apple banana"
echo ${arrayname[@]:1:1}                 # yields "banana"

csh에는 배열이 있습니다.
Keith Thompson

@KeithThompson : 매뉴얼 페이지에 문서화되어 있지 않지만 기능이 적어도 일부 버전에있는 것처럼 보입니다.
추후 공지가있을 때까지 일시 중지되었습니다.

3
매뉴얼 페이지에는 해당 이름으로 "배열"이 언급되어 있지 않지만 set명령 ( set name=(wordlist)) 및 "변수 대체"섹션 ( $name[selector]${name[selector]})에 대한 설명서를 참조하십시오 . 내가 아는 한, csh는 항상 배열을 지원했습니다. 예를 들어 환경 변수 $path를 미러링하는 배열 변수 를 참조하십시오 $PATH.
Keith Thompson

8

이 시도 :

echo "Find the Largest Number and Smallest Number of a given number"
echo "---------------------------------------------------------------------------------"
echo "Enter the number"
read n
i=0

while [ $n -gt 0 ] #For Seperating digits and Stored into array "x"
do
        x[$i]=`expr $n % 10`
        n=`expr $n / 10`
        i=`expr $i + 1`
done

echo "Array values ${x[@]}"  # For displaying array elements


len=${#x[*]}  # it returns the array length


for (( i=0; i<len; i++ ))    # For Sorting array elements using Bubble sort
do
    for (( j=i+1; j<len;  j++ ))
    do
        if [ `echo "${x[$i]} > ${x[$j]}"|bc` ]
        then
                t=${x[$i]}
                t=${x[$i]}
                x[$i]=${x[$j]}
                x[$j]=$t
        fi
        done
done


echo "Array values ${x[*]}"  # Displaying of Sorted Array


for (( i=len-1; i>=0; i-- ))  # Form largest number
do
   a=`echo $a \* 10 + ${x[$i]}|bc`
done

echo "Largest Number is : $a"

l=$a  #Largest number

s=0
while [ $a -gt 0 ]  # Reversing of number, We get Smallest number
do
        r=`expr $a % 10`
        s=`echo "$s * 10 + $r"|bc`
        a=`expr $a / 10`
done
echo "Smallest Number is : $s" #Smallest Number

echo "Difference between Largest number and Smallest number"
echo "=========================================="
Diff=`expr $l - $s`
echo "Result is : $Diff"


echo "If you try it, We can get it"

이것은 ksh와 bash에서만 작동합니다.
Lassi

6

귀하의 질문은 "unix shell scripting"에 대해 묻지 만 태그는 bash. 두 가지 대답이 있습니다.

쉘에 대한 POSIX 사양에는 원래 Bourne 쉘이 지원하지 않았기 때문에 어레이에 대해 말할 것이 없습니다. 오늘날에도 FreeBSD, Ubuntu Linux 및 기타 많은 시스템에서는 /bin/sh어레이를 지원하지 않습니다. 따라서 스크립트가 다른 Bourne 호환 셸에서 작동하도록하려면 사용하지 않아야합니다. 또는 특정 셸을 가정하는 경우 shebang 줄에 전체 이름을 입력해야합니다 (예 : #!/usr/bin/env bash.

당신이 사용하는 경우 bash는 또는 zsh을 , 또는의 현대 버전 KSH를 ,이 같은 배열을 만들 수 있습니다 :

myArray=(first "second element" 3rd)

이와 같은 액세스 요소

$ echo "${myArray[1]}"
second element

을 통해 모든 요소를 ​​얻을 수 있습니다 "${myArray[@]}". 슬라이스 표기법 $ {array [@] : start : length} 를 사용하여 참조되는 배열의 부분을 제한 할 수 있습니다 (예 : "${myArray[@]:1}"첫 번째 요소를 제외).

배열의 길이는 ${#myArray[@]}입니다. 를 사용하여 기존 배열의 모든 인덱스를 포함하는 새 배열을 가져올 수 있습니다 "${!myArray[@]}".

ksh93 이전 버전의 ksh에도 배열이 있었지만 괄호 기반 표기법은 없었으며 슬라이싱도 지원하지 않았습니다. 하지만 다음과 같은 배열을 만들 수 있습니다.

set -A myArray -- first "second element" 3rd 

5

다음 유형을 시도 할 수 있습니다.

#!/bin/bash
 declare -a arr

 i=0
 j=0

  for dir in $(find /home/rmajeti/programs -type d)
   do
        arr[i]=$dir
        i=$((i+1))
   done


  while [ $j -lt $i ]
  do
        echo ${arr[$j]}
        j=$((j+1))
  done

공백으로 디렉토리 이름을 끊습니다. 변경 IFS의 while 읽기 루프를 사용하여 처리하십시오.
ghostdog74

5

배열은 양방향으로로드 할 수 있습니다.

set -A TEST_ARRAY alpha beta gamma

또는

X=0 # Initialize counter to zero.

-문자열 알파, 베타 및 감마로 배열로드

for ELEMENT in alpha gamma beta
do
    TEST_ARRAY[$X]=$ELEMENT
    ((X = X + 1))
done

또한 아래 정보가 도움이 될 것이라고 생각합니다.

쉘은 1 차원 배열을 지원합니다. 배열 요소의 최대 수는 1,024 개입니다. 배열이 정의되면 1,024 개 요소로 자동으로 치수가 지정됩니다. 1 차원 배열에는 기차 트랙에서 함께 연결된 박스 카와 같은 일련의 배열 요소가 포함됩니다.

어레이에 액세스하려는 경우 :

echo ${MY_ARRAY[2] # Show the third array element
 gamma 


echo ${MY_ARRAY[*] # Show all array elements
-   alpha beta gamma


echo ${MY_ARRAY[@] # Show all array elements
 -  alpha beta gamma


echo ${#MY_ARRAY[*]} # Show the total number of array elements
-   3


echo ${#MY_ARRAY[@]} # Show the total number of array elements
-   3

echo ${MY_ARRAY} # Show array element 0 (the first element)
-  alpha

4

공백을 지원하는 키 값 저장소를 원하는 경우 -A매개 변수를 사용하십시오 .

declare -A programCollection
programCollection["xwininfo"]="to aquire information about the target window."

for program in ${!programCollection[@]}
do
    echo "The program ${program} is used ${programCollection[${program}]}"
done

http://linux.die.net/man/1/bash "연관 배열은 선언 -A 이름을 사용하여 생성됩니다."


4

셸에서 배열을 만드는 방법에는 여러 가지가 있습니다.

ARR[0]="ABC"
ARR[1]="BCD"
echo ${ARR[*]}

${ARR[*]} 배열의 모든 요소를 ​​인쇄합니다.

두 번째 방법은 다음과 같습니다.

ARR=("A" "B" "C" "D" 5 7 "J")
echo ${#ARR[@]}
echo ${ARR[0]}

${#ARR[@]} 배열의 길이를 계산하는 데 사용됩니다.


좋은 대답, 초보자에게 좋은 시작입니다. 그리고 upvote 레벨에 오신 것을 환영합니다 ;-)
GhostCat

3

keybord에서 값을 읽고 배열에 요소를 삽입하려면

# enter 0 when exit the insert element
echo "Enter the numbers"
read n
while [ $n -ne 0 ]
do
    x[$i]=`expr $n`
    read n
    let i++
done

#display the all array elements
echo "Array values ${x[@]}"
echo "Array values ${x[*]}"

# To find the array length
length=${#x[*]}
echo $length

1

ksh에서는 다음을 수행합니다.

set -A array element1 element2 elementn

# view the first element
echo ${array[0]}

# Amount elements (You have to substitute 1)
echo ${#array[*]}

# show last element
echo ${array[ $(( ${#array[*]} - 1 )) ]}

마지막 요소를 표시하는 더 간결한 방법은 echo "${array[@]:(-1)}"입니다. 이렇게하면 배열 변수 이름을 두 번 쓸 필요가 없습니다.
Alex Dupuy 2014

1

간단한 방법 :

arr=("sharlock"  "bomkesh"  "feluda" )  ##declare array

len=${#arr[*]}  #determine length of array

# iterate with for loop
for (( i=0; i<len; i++ ))
do
    echo ${arr[$i]}
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.