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

arrays bash shell unix

253053 просмотра

14 ответа

1847 Репутация автора

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

Автор: Arunachalam Источник Размещён: 10.12.2009 05:55

Ответы (14)


5 плюса

445 Репутация автора

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

#!/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
Автор: Roopesh Majeti Размещён: 10.12.2009 06:06

13 плюса

1185 Репутация автора

#!/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"

Автор: Lai Jiangshan Размещён: 10.12.2009 06:18

60 плюса

242784 Репутация автора

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

arr=(one two three)

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

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

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

read -p "Enter your choice: " choice
Автор: ghostdog74 Размещён: 10.12.2009 06:25

8 плюса

263202 Репутация автора

Оболочки 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"
Автор: Dennis Williamson Размещён: 10.12.2009 08:00

1 плюс

359 Репутация автора

В 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 )) ]}
Автор: user224243 Размещён: 10.12.2009 05:37

7 плюса

79 Репутация автора

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

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"
Автор: muthukrishnavinayagam Размещён: 14.03.2012 08:23

18 плюса

181 Репутация автора

Оболочка 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
Автор: Mishka Размещён: 13.03.2013 12:24

3 плюса

29 Репутация автора

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

# 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
Автор: para Размещён: 05.08.2013 05:59

87 плюса

1014 Репутация автора

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

#!/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
Автор: Vincent Agami Размещён: 19.09.2013 03:21

4 плюса

383 Репутация автора

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

Автор: richardjsimkins Размещён: 18.04.2015 08:18

5 плюса

732 Репутация автора

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

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

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

Оболочка поддерживает одномерные массивы. Максимальное количество элементов массива составляет 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
Автор: Pinaki Mukherjee Размещён: 20.07.2015 02:33

6 плюса

70461 Репутация автора

Ваш вопрос касается "сценариев оболочки 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 
Автор: Mark Reed Размещён: 09.12.2015 04:24

1 плюс

1682 Репутация автора

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

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
Автор: rashedcs Размещён: 02.09.2018 03:40

3 плюса

43 Репутация автора

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

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

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

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

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

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

Автор: Manjotsingh Chug Размещён: 14.09.2018 11:57
Вопросы из категории :
32x32