Сделать объявление объявления массива для всех оболочек Linux [duplicate]

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
66
задан Yves M. 11 June 2015 в 09:56
поделиться

15 ответов

Попробуйте следующее:

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
ответ дан Abimaran Kugathasan 18 August 2018 в 22:08
поделиться

Массив может быть загружен в 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
4
ответ дан agc 18 August 2018 в 22:08
поделиться

У оболочки 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"
5
ответ дан fcm 18 August 2018 в 22:08
поделиться
  • 1
    У csh есть массивы. – Keith Thompson 5 August 2013 в 07:30
  • 2
    @KeithThompson: он не задокументирован на странице man , но функциональность действительно присутствует, по крайней мере, в некоторых версиях. – Dennis Williamson 5 August 2013 в 12:03
  • 3
    На странице руководства не упоминаются «массивы». по этому имени, но см. документацию по команде set (set name=(wordlist)) и переменной «Переменная», ($name[selector] и ${name[selector]}). Насколько я знаю, csh всегда поддерживал массивы. См., Например, переменную массива $path, которая отражает переменную среды $PATH. – Keith Thompson 19 September 2013 в 16:45

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

3
ответ дан Fopa Léon Constantin 18 August 2018 в 22:08
поделиться

в bash, вы создаете такой массив

arr=(one two three)

, чтобы вызвать элементы

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

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

read -p "Enter your choice: " choice
49
ответ дан John Kugelman 18 August 2018 в 22:08
поделиться
  • 1
    Пожалуйста, передумайте, предлагая АБС в качестве учебного ресурса - во многих отношениях можно использовать то, что W3Schools для HTML и Javascript, имея много сока Google, но демонстрируя плохие практики во многих своих примерах и редко и неадекватно обновляемые. wiki bash-hackers - намного лучший ресурс; так же BashGuide . – Charles Duffy 22 June 2018 в 16:04

В вашем вопросе возникает вопрос о «сценарии unix shell», но помечен 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 18 August 2018 в 22:08
поделиться

Оболочка 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
14
ответ дан Mishka 18 August 2018 в 22:08
поделиться
  • 1
    Bash поддерживает массивы. Не уверен в оригинальной оболочке Bourne, но bash в наши дни более распространен ... – plesiv 5 August 2013 в 07:16
  • 2
    @zplesivcak - ... на GNU / Linux, так как это предмет GNU. Например, FreeBSD не поставляется с bash (однако он устанавливается из портов). Сценарии, написанные с учетом функций bash, не переносимы, и они заметно медленнее, чем большинство реализаций оболочки Bourne (например, dash, которые являются обычными в дистрибутивах GNU / Linux). bash - приятная интерактивная оболочка, но для сценариев она медленная. – tjameson 31 October 2013 в 20:36
  • 3
    $* считается вредным. Обычно $@ является предпочтительным, поскольку он делает то же самое, но сохраняет пробелы. $@ расширяется как "$ 1" & Quot; $ 2 & Quot; & Quot; $ 3 & Quot; ... & quot; $ n & quot ;, тогда как $* раскрываетс как "$ 1x $ 2x $ 3x ... $ n", где x является разделителем $IFS (скорее всего, пространством). – zserge 14 February 2014 в 20:15
  • 4
    Без кавычек $@ совпадает с $*; разница только появляется при цитировании: "$*" - одно слово, а "$@" сохраняет исходные разрывы слов. – Mark Reed 9 December 2015 в 17:11
  • 5
    Вопрос помечен bash, поэтому ответы, специфичные для bash, являются подходящими, но это, безусловно, верно, что нельзя предполагать, что /bin/sh является bash. – Mark Reed 9 December 2015 в 17:12

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

# 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
1
ответ дан para 18 August 2018 в 22:08
поделиться

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

#!/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 18 August 2018 в 22:08
поделиться
  • 1
    разбивает имена каталогов на пробелы. используйте цикл чтения IFS, чтобы позаботиться об этом. – ghostdog74 10 December 2009 в 07:22

В 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 18 August 2018 в 22:08
поделиться
  • 1
    Более кратким способом отображения последнего элемента является echo "${array[@]:(-1)}". Это устраняет необходимость записи имени переменной массива дважды. – Alex Dupuy 27 February 2014 в 00:20
68
ответ дан John Kugelman 7 September 2018 в 05:48
поделиться
0
ответ дан rashedcs 7 September 2018 в 05:48
поделиться
0
ответ дан rashedcs 30 October 2018 в 09:58
поделиться
1
ответ дан Boiethios 30 October 2018 в 09:58
поделиться
72
ответ дан John Kugelman 30 October 2018 в 09:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: