유닉스 쉘 스크립팅에서 배열을 어떻게 생성합니까?
답변:
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 "("
. 대안을 알고 있습니까?
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
bash
(하지만 포트에서 설치할 수 있습니다). 가정 작성 스크립트 bash
기능은 휴대용 아니며, 그들은 noticably 느린 (같은 대부분의 Bourne 쉘 구현보다 느린 것 dash
, 입니다 GNU / Linux 배포판에 공통). bash
좋은 대화 형 셸이지만 스크립팅에는 느립니다.
$*
유해한 것으로 간주됩니다. 일반적으로 $@
동일하기 때문에 선호되지만 공백을 유지합니다. $@
반면, "$ 1" "$ 2" "$ 3"... "$ N"으로 확장 $*
"$ 1 배속 2 배속 $ $ 3X ... N $"로서 여기서 확장 x
인 $IFS
세퍼레이터 (대부분 공간).
$@
은 다음과 같습니다 $*
. 차이점은 따옴표로 묶인 경우에만 나타납니다 . 원래 단어 분리는 유지 "$*"
하면서 한 단어 "$@"
입니다.
bash
되어 있으므로 bash 특정 응답이 적절하지만 그것이 /bin/sh
bash 라고 가정해서는 안된다는 것은 확실히 사실입니다 .
#!/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"를 읽을 수 있습니다.
/bin/sh
오류 발생 과 함께 작동하지 않습니다 line 1: syntax error: unexpected "("
. 대안을 알고 있습니까?
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"
set
명령 ( set name=(wordlist)
) 및 "변수 대체"섹션 ( $name[selector]
및 ${name[selector]}
)에 대한 설명서를 참조하십시오 . 내가 아는 한, csh는 항상 배열을 지원했습니다. 예를 들어 환경 변수 $path
를 미러링하는 배열 변수 를 참조하십시오 $PATH
.
이 시도 :
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"
귀하의 질문은 "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
다음 유형을 시도 할 수 있습니다.
#!/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
배열은 양방향으로로드 할 수 있습니다.
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
공백을 지원하는 키 값 저장소를 원하는 경우 -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 이름을 사용하여 생성됩니다."
셸에서 배열을 만드는 방법에는 여러 가지가 있습니다.
ARR[0]="ABC"
ARR[1]="BCD"
echo ${ARR[*]}
${ARR[*]}
배열의 모든 요소를 인쇄합니다.
두 번째 방법은 다음과 같습니다.
ARR=("A" "B" "C" "D" 5 7 "J")
echo ${#ARR[@]}
echo ${ARR[0]}
${#ARR[@]}
배열의 길이를 계산하는 데 사용됩니다.
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
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)}"
입니다. 이렇게하면 배열 변수 이름을 두 번 쓸 필요가 없습니다.