Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Попробуйте следующее:
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"
Массив может быть загружен в 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 элемента. Одномерный массив содержит последовательность элементов массива, которые похожи на боксы, соединенные вместе на дорожке поезда.
blockquote>Если вы хотите получить доступ к массиву:
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
У оболочки 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"
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.»
в bash, вы создаете такой массив
arr=(one two three)
, чтобы вызвать элементы
$ echo "${arr[0]}"
one
$ echo "${arr[2]}"
three
, чтобы запросить ввод пользователя, вы можете использовать read
read -p "Enter your choice: " choice
В вашем вопросе возникает вопрос о «сценарии 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
Оболочка 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
bash
(однако он устанавливается из портов). Сценарии, написанные с учетом функций bash
, не переносимы, и они заметно медленнее, чем большинство реализаций оболочки Bourne (например, dash
, которые являются i> обычными в дистрибутивах GNU / Linux). bash
- приятная интерактивная оболочка, но для сценариев она медленная.
– tjameson
31 October 2013 в 20:36
$*
считается вредным. Обычно $@
является предпочтительным, поскольку он делает то же самое, но сохраняет пробелы. $@
расширяется как "$ 1" & Quot; $ 2 & Quot; & Quot; $ 3 & Quot; ... & quot; $ n & quot ;, тогда как $*
раскрываетс как "$ 1x $ 2x $ 3x ... $ n", где x
является разделителем $IFS
(скорее всего, пространством).
– zserge
14 February 2014 в 20:15
$@
совпадает с $*
; разница только появляется при цитировании: "$*"
- одно слово, а "$@"
сохраняет исходные разрывы слов.
– Mark Reed
9 December 2015 в 17:11
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
Вы можете попробовать следующий тип:
#!/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
В 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 )) ]}
echo "${array[@]:(-1)}"
. Это устраняет необходимость записи имени переменной массива дважды.
– Alex Dupuy
27 February 2014 в 00:20