Poniższy kod tworzy i drukuje tablicę ciągów w powłoce:
#!/bin/bash
array=("A""B""ElementC""ElementE")
for element in"${array[@]}"doecho"$element"doneechoecho"Number of elements: ${#array[@]}"echoecho"${array[@]}"
Wynik:
A
B
ElementC
ElementE
Number of elements: 4
A B ElementC ElementE
Bash supports arrays. Not sure about original Bourne shell, but bash is more prevalent these days...
plesiv
2
@zplesivcak - ... on GNU/Linux, since it's a GNU thing. For example, FreeBSD doesn't ship with bash (it's installable from ports though). Scripts written assuming bash features aren't portable, and they're noticably slower slower than most Bourne shell implementations (like dash, which is common on GNU/Linux distributions). bash is a nice interactive shell, but it's slow for scripting.
beatgammit
1
$* is considered harmful. Normally, $@ is preferred since it does the same, but keeps spaces. $@ is expanded as "$1" "$2" "$3" ... "$n", while $* is expanded as "$1x$2x$3x...$n", where x is $IFS separator (most likely, space).
zserge
1
Unquoted, $@ is the same as $*; the difference only shows up when quoted: "$*" is one word, while "$@" preserves the original word breaks.
Mark Reed
The question is tagged bash, so bash-specific responses are appropriate, but it's certainly true that one shouldn't assume that /bin/sh is bash.
Mark Reed
13
#!/bin/bash# define a array, space to separate every item
foo=(foo1 foo2)
# accessecho"${foo[1]}"# add or changes
foo[0]=bar
foo[2]=cat
foo[1000]=also_OK
You can read the ABS "Advanced Bash-Scripting Guide"
Please reconsider suggesting the ABS as a learning resource -- it's in many ways to bash what W3Schools is to HTML and Javascript, having lots of Google juice but showcasing bad practices in many of its examples, and rarely and inadequately updated. The bash-hackers' wiki is a much better resource; so is the BashGuide.
Charles Duffy
The space-separated declaration does NOT work with /bin/sh throwing an error line 1: syntax error: unexpected "(". Do you know of an alternative?
mhyousefi
8
The Bourne shell and C shell don't have arrays, IIRC.
In addition to what others have said, in Bash you can get the number of elements in an array as follows:
@KeithThompson: It's not documented in the man page but the functionality does appear to be present in at least some versions.
Dennis Williamson
3
The man page doesn't mention "arrays" by that name, but see the documentation of the set command (set name=(wordlist)) and the "Variable substituion" section ($name[selector] and ${name[selector]}). As far as I know, csh has always supported arrays. See, for example, the $path array variable, which mirrors the $PATH environment variable.
Keith Thompson
8
Try this :
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`
doneecho"Array values ${x[@]}"# For displaying array elements
len=${#x[*]}# it returns the array lengthfor (( i=0; i<len; i++ )) # For Sorting array elements using Bubble sortdofor (( j=i+1; j<len; j++ ))
doif [ `echo"${x[$i]} > ${x[$j]}"|bc` ]
then
t=${x[$i]}
t=${x[$i]}
x[$i]=${x[$j]}
x[$j]=$tfidonedoneecho"Array values ${x[*]}"# Displaying of Sorted Arrayfor (( i=len-1; i>=0; i-- )) # Form largest numberdo
a=`echo$a \* 10 + ${x[$i]}|bc`
doneecho"Largest Number is : $a"
l=$a#Largest number
s=0
while [ $a -gt 0 ] # Reversing of number, We get Smallest numberdo
r=`expr $a % 10`
s=`echo"$s * 10 + $r"|bc`
a=`expr $a / 10`
doneecho"Smallest Number is : $s"#Smallest Numberecho"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"
Your question asks about "unix shell scripting", but is tagged bash. Those are two different answers.
The POSIX specification for shells does not have anything to say about arrays, as the original Bourne shell did not support them. Even today, on FreeBSD, Ubuntu Linux, and many other systems, /bin/sh does not have array support. So if you want your script to work in different Bourne-compatible shells, you shouldn't use them. Alternatively, if you are assuming a specific shell, then be sure to put its full name in the shebang line, e.g. #!/usr/bin/env bash.
If you are using bash or zsh, or a modern version of ksh, you can create an array like this:
myArray=(first "second element" 3rd)
and access elements like this
$ echo"${myArray[1]}"
second element
You can get all the elements via "${myArray[@]}". You can use the slice notation ${array[@]:start:length} to restrict the portion of the array referenced, e.g. "${myArray[@]:1}" to leave off the first element.
The length of the array is ${#myArray[@]}. You can get a new array containing all the indexes from an existing array with "${!myArray[@]}".
Older versions of ksh before ksh93 also had arrays, but not the parenthesis-based notation, nor did they support slicing. You could create an array like this, though:
#!/bin/bashdeclare -a arr
i=0
j=0
for dir in $(find /home/rmajeti/programs -type d)
do
arr[i]=$dir
i=$((i+1))
donewhile [ $j -lt $i ]
doecho${arr[$j]}
j=$((j+1))
done
breaks on directory names with spaces. use a while read loop of change IFS to take care of that.
ghostdog74
5
An array can be loaded in twoways.
set -A TEST_ARRAY alpha beta gamma
or
X=0 # Initialize counter to zero.
-- Load the array with the strings alpha, beta, and gamma
for ELEMENT in alpha gamma beta
do
TEST_ARRAY[$X]=$ELEMENT
((X = X + 1))
done
Also, I think below information may help:
The shell supports one-dimensional arrays. The maximum number of array
elements is 1,024. When an array is defined, it is automatically
dimensioned to 1,024 elements. A one-dimensional array contains a
sequence of array elements, which are like the boxcars connected
together on a train track.
In case you want to access the array:
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
If you want a key value store with support for spaces use the -A parameter:
declare -A programCollection
programCollection["xwininfo"]="to aquire information about the target window."for program in${!programCollection[@]}doecho"The program ${program} is used ${programCollection[${program}]}"done
Nice answer, Great start for a newbie. And welcome to upvote levels ;-)
GhostCat
3
To read the values from keybord and insert element into array
# enter 0 when exit the insert elementecho"Enter the numbers"read n
while [ $n -ne 0 ]
do
x[$i]=`expr $n`
read n
let i++
done#display the all array elementsecho"Array values ${x[@]}"echo"Array values ${x[*]}"# To find the array length
length=${#x[*]}echo$length
set -A array element1 element2 elementn
# view the first elementecho${array[0]}# Amount elements (You have to substitute 1)echo${#array[*]}# show last elementecho${array[ $(( ${#array[*]} - 1 )) ]}
Odpowiedzi:
Poniższy kod tworzy i drukuje tablicę ciągów w powłoce:
#!/bin/bash array=("A" "B" "ElementC" "ElementE") for element in "${array[@]}" do echo "$element" done echo echo "Number of elements: ${#array[@]}" echo echo "${array[@]}"
Wynik:
źródło
w bash tworzysz tablice w ten sposób
to call the elements
$ echo "${arr[0]}" one $ echo "${arr[2]}" three
to ask for user input, you can use read
read -p "Enter your choice: " choice
źródło
/bin/sh
throwing an errorline 1: syntax error: unexpected "("
. Do you know of an alternative?Bourne shell doesn't support arrays. However, there are two ways to handle the issue.
Use positional shell parameters $1, $2, etc.:
$ set one two three $ echo $* one two three $ echo $# 3 $ echo $2 two
Use variable evaluations:
$ 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
źródło
bash
(it's installable from ports though). Scripts written assumingbash
features aren't portable, and they're noticably slower slower than most Bourne shell implementations (likedash
, which is common on GNU/Linux distributions).bash
is a nice interactive shell, but it's slow for scripting.$*
is considered harmful. Normally,$@
is preferred since it does the same, but keeps spaces.$@
is expanded as "$1" "$2" "$3" ... "$n", while$*
is expanded as "$1x$2x$3x...$n", wherex
is$IFS
separator (most likely, space).$@
is the same as$*
; the difference only shows up when quoted:"$*"
is one word, while"$@"
preserves the original word breaks.bash
, so bash-specific responses are appropriate, but it's certainly true that one shouldn't assume that/bin/sh
is bash.#!/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
You can read the ABS "Advanced Bash-Scripting Guide"
źródło
/bin/sh
throwing an errorline 1: syntax error: unexpected "("
. Do you know of an alternative?The Bourne shell and C shell don't have arrays, IIRC.
In addition to what others have said, in Bash you can get the number of elements in an array as follows:
elements=${#arrayname[@]}
and do slice-style operations:
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"
źródło
set
command (set name=(wordlist)
) and the "Variable substituion" section ($name[selector]
and${name[selector]}
). As far as I know, csh has always supported arrays. See, for example, the$path
array variable, which mirrors the$PATH
environment variable.Try this :
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"
źródło
Your question asks about "unix shell scripting", but is tagged
bash
. Those are two different answers.The POSIX specification for shells does not have anything to say about arrays, as the original Bourne shell did not support them. Even today, on FreeBSD, Ubuntu Linux, and many other systems,
/bin/sh
does not have array support. So if you want your script to work in different Bourne-compatible shells, you shouldn't use them. Alternatively, if you are assuming a specific shell, then be sure to put its full name in the shebang line, e.g.#!/usr/bin/env bash
.If you are using bash or zsh, or a modern version of ksh, you can create an array like this:
myArray=(first "second element" 3rd)
and access elements like this
$ echo "${myArray[1]}" second element
You can get all the elements via
"${myArray[@]}"
. You can use the slice notation ${array[@]:start:length} to restrict the portion of the array referenced, e.g."${myArray[@]:1}"
to leave off the first element.The length of the array is
${#myArray[@]}
. You can get a new array containing all the indexes from an existing array with"${!myArray[@]}"
.Older versions of ksh before ksh93 also had arrays, but not the parenthesis-based notation, nor did they support slicing. You could create an array like this, though:
set -A myArray -- first "second element" 3rd
źródło
You can try of the following type :
#!/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
źródło
An array can be loaded in twoways.
set -A TEST_ARRAY alpha beta gamma
or
X=0 # Initialize counter to zero.
-- Load the array with the strings alpha, beta, and gamma
for ELEMENT in alpha gamma beta do TEST_ARRAY[$X]=$ELEMENT ((X = X + 1)) done
Also, I think below information may help:
In case you want to access the array:
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
źródło
If you want a key value store with support for spaces use the
-A
parameter: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 "Associative arrays are created using declare -A name. "
źródło
There are multiple ways to create an array in shell.
ARR[0]="ABC" ARR[1]="BCD" echo ${ARR[*]}
${ARR[*]}
prints all elements in the array.Second way is:
ARR=("A" "B" "C" "D" 5 7 "J") echo ${#ARR[@]} echo ${ARR[0]}
${#ARR[@]}
is used to count length of the array.źródło
To read the values from keybord and insert element into array
# 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
źródło
In ksh you do it:
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 )) ]}
źródło
echo "${array[@]:(-1)}"
. This eliminates the need to write the array variable name twice.A Simple way :
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
źródło