It can be done pretty easily using Awk, just do the below to store the contents in a bash array.
read -p "Enter object to get properties for: " objectname
all_properties=($(awk -F '=' -v input="${objectname}" '$1 ~ input{flag=1; next} $1 ~ /\[object/{flag=0; next} flag && NF {split($0,arr,"="); print arr[2] } config.ini))
Now loop the array to print the properties,
for property in "${all_properties[@]}"; do
printf "%s\n" "$property"
done
(or) just
printf "%s\n" "${all_properties[@]}"
The Awk command works as follows:-
- Getting the user input in a variable and passing to
Awkusing the-vsyntax and doing a regex match$1 ~ inputto match the line containing user input, sayobject1 - I am enabling a flag to start marking lines from this line on-wards and resetting the flag once the next object starts, see
$1 ~ /\[object/{flag=0; next} - The condition
flag && NFtakes care of processing only non-empty lines and only property values after the requested object. - Now on the selected lines, using the
split()function inAwk, we can extract the value of property and print it, which will be later stored in the array.
Put the line with read and the line below as shown in a bash script with she-bang set to #!/bin/bash and run it.
E.g. in a complete script as
#!/usr/bin/bash
read -p "Enter object to get properties for: " objectname
all_properties=($(awk -F '=' -v input="${objectname}" '$1 ~ input{flag=1; next} $1 ~ /\[object/{flag=0; next} flag && NF {split($0,arr,"="); print arr[2] }' config.ini ))
printf "%s\n" "${all_properties[@]}"
A few sample runs on the script.
$ bash script.sh
Enter object to get properties for: object1
propertyA
$ bash script.sh
Enter object to get properties for: object2
property1
property2
$ bash script.sh
Enter object to get properties for: object3
propertyxya
4
solved reading properties from ini file in a bash script