it-swarm.com.ru

Массивы в оболочке unix?

Как создать массив в сценариях Unix Shell?

68
Arunachalam

Следующий код создает и печатает массив строк в оболочке:

#!/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
79
Vincent Agami

в Bash вы создаете массив, как это

arr=(one two three)

называть элементы

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

чтобы запросить ввод пользователя, вы можете использовать чтение

read -p "Enter your choice: " choice
55
ghostdog74

Bourne Shell не поддерживает массивы. Однако есть два способа решения проблемы.

Используйте позиционные параметры оболочки $ 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
14
Mishka
#!/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"

10
Lai Jiangshan

У Bourne Shell и C Shell нет массивов, 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"
5
Dennis Williamson

Попробуй это : 

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

while [ $n -gt 0 ] #For Seperating digits and Stored into array "x"
do
        x[$i]=`expr $n % 10`
        n=`expr $n / 10`
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"
5
muthukrishnavinayagam

Ваш вопрос касается "сценариев оболочки Unix", но помечен 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[@]}"

Более старые версии ksh до ksh93 также имели массивы, но не основанные на скобках обозначения, и при этом они не поддерживали нарезку. Вы можете создать массив следующим образом:

set -A myArray -- first "second element" 3rd 
5
Mark Reed

Массив может быть загружен в два раза.

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

Кроме того, я думаю, что ниже информация может помочь:

Shell поддерживает одномерные массивы. Максимальное количество массивов элементов 1024. Когда массив определен, он автоматически размером до 1024 элементов. Одномерный массив содержит последовательность элементов массива, которые похожи на связанные вагоны вместе на железнодорожной трассе.

Если вы хотите получить доступ к массиву:

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
Pinaki Mukherjee

Вы можете попробовать следующий тип:

#!/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
3
Roopesh Majeti

Если вы хотите сохранить значение ключа с поддержкой пробелов, используйте параметр -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 имени."

3
richardjsimkins

Есть несколько способов создать массив в Shell.

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

${ARR[*]} печатает все элементы в массиве.

Второй способ это:

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

${#ARR[@]} используется для подсчета длины массива.

2
Manjotsingh Chug

Чтобы прочитать значения с клавиатуры и вставить элемент в массив

# 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
2
para

Простой способ:

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
0
rashedcs

В 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 )) ]}
0
user224243