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

arrays bash shell unix

253053 просмотра

14 ответа

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

Автор: Arunachalam Источник Размещён: 12.11.2019 09:29

Ответы (14)


87 плюса

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

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

60 плюса

в 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

18 плюса

Оболочка 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

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"

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

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

7 плюса

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

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

6 плюса

Ваш вопрос касается "сценариев оболочки 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

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

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

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

Оболочка поддерживает одномерные массивы. Максимальное количество элементов массива составляет 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

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 имени."

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

3 плюса

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

# 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

3 плюса

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

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

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

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
Автор: rashedcs Размещён: 02.09.2018 03:40
Вопросы из категории :
32x32