Tuesday, June 25, 2019

Loop through an array of strings in Bash?

Yes


for Item in Item1 Item2 Item3 Item4 ;
do
echo $Item
done

Output:


Item1
Item2
Item3
Item4

To preserve spaces; single or double quote list entries and double quote list expansions.


for Item in 'Item 1' 'Item 2' 'Item 3' 'Item 4' ;
do
echo "$Item"
done

Output:


Item 1
Item 2
Item 3
Item 4

To make list over multiple lines


for Item in Item1 \
Item2 \
Item3 \
Item4
do
echo $Item
done

Output:


Item1
Item2
Item3
Item4


Simple list variable


List=( Item1 Item2 Item3 )

or


List=(
Item1
Item2
Item3
)

Display the list variable:


echo ${List[*]}

Output:


Item1 Item2 Item3

Loop through the list:


for Item in ${List[*]}
do
echo $Item
done

Output:


Item1
Item2
Item3

Create a function to go through a list:


Loop(){
for item in ${*} ;
do
echo ${item}
done
}
Loop ${List[*]}

Using the declare keyword (command) to create the list, which is technically called an array:


declare -a List=(
"element 1"
"element 2"
"element 3"
)
for entry in "${List[@]}"
do
echo "$entry"
done

Output:


element 1
element 2
element 3

Creating an associative array. A dictionary:


declare -A continent
continent[Vietnam]=Asia
continent[France]=Europe
continent[Argentina]=America
for item in "${!continent[@]}";
do
printf "$item is in ${continent[$item]} \n"
done

Output:


 Argentina is in America
Vietnam is in Asia
France is in Europe

CVS variables or files in to a list.
Changing the internal field separator from a space, to what ever you want.
In the example below it is changed to a comma


List="Item 1,Item 2,Item 3"
Backup_of_internal_field_separator=$IFS
IFS=,
for item in $List;
do
echo $item
done
IFS=$Backup_of_internal_field_separator

Output:


Item 1
Item 2
Item 3

If need to number them:


`

this is called a back tick. Put the command inside back ticks.


`commend`

It is next to the number one on your keyboard and or above the tab key. On a standard american english language keyboard.


List=()
Start_count=0
Step_count=0.1
Stop_count=1
for Item in `seq $Start_count $Step_count $Stop_count`
do
List+=(Item_$Item)
done
for Item in ${List[*]}
do
echo $Item
done

Output is:


Item_0.0
Item_0.1
Item_0.2
Item_0.3
Item_0.4
Item_0.5
Item_0.6
Item_0.7
Item_0.8
Item_0.9
Item_1.0

Becoming more familiar with bashes behavior:


Create a list in a file


cat < List_entries.txt
Item1
Item 2
'Item 3'
"Item 4"
Item 7 : *
"Item 6 : * "
"Item 6 : *"
Item 8 : $PWD
'Item 8 : $PWD'
"Item 9 : $PWD"
EOF

Read the list file in to a list and display


List=$(cat List_entries.txt)
echo $List
echo '$List'
echo "$List"
echo ${List[*]}
echo '${List[*]}'
echo "${List[*]}"
echo ${List[@]}
echo '${List[@]}'
echo "${List[@]}"

BASH commandline reference manual: Special meaning of certain characters or words to the shell.

No comments:

Post a Comment

plot explanation - Why did Peaches&#39; mom hang on the tree? - Movies &amp; TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...