Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

arr=(one two three)

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

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

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

read -p "Enter your choice: " choice

Ответ 3

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

Ответ 4

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

Ответ 5

У оболочки 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"

Ответ 6

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

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"

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

set -A TEST_ARRAY alpha beta gamma

или

X=0 # Initialize counter to zero.

- Загрузите массив со строками alpha, beta и gamma

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

Ответ 10

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

Ответ 11

Чтобы прочитать значения из 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

Ответ 12

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

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

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

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

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

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

Ответ 13

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

Ответ 14

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

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