Как создать массив в сценариях unix shell?
Массивы в оболочке unix?
Ответ 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