Parameter File for a Shell Script
I have a parameter file like this.
unix> cat script.par
name=david
city=portland
job=(admin,manager)
admin_role=(calls,meetings,gusts)
manager_role=(meetings,workers)
age=60
I have to use the above parameters in a shell script.
Since the number of parameters are high I can't pass them as $1.. $10 etc
in the command prompt. Number of oarameters in script.par can vary.
In the shell script I need to read the values in script.par
and assign them to different variables as shown below!
name=david
city=portland
job_1=admin
job_2=manager
admin_role_1=calls
admin_role_2=meetings
admin_role_3=gusts
manager_role_1=meetings
manager_role_2=workers
age=60
Please let me know how to achieve this.
>>>>>
Try this :
ReadParams()?{
eval?$(?awk?-F?"="?'
NF?>=?2?{
???variable?=?$1;
???value????=?$2;
???if?(value?~?/^\(.*\)[:space:]*$/)?{
??????sub(/^\(/,?"",?value);
??????sub(/\)[:space:]*$/,?"",?value);
??????nbv?=?split(value,?values,?",")
??????for?(i=1;?i<=nbv;?i++)
??print?variable?"_"?i?"="?values[i];
???}?else?{
??????print?variable?"="?value;
???}
}
'?$1?)????
}
ReadParams?script.par
>>>>>
I would like to know what is the purpose of ~, :space:
in the awk command. I really appreciate if you could give me brief description
of each line with in the awk command. I am trying to understand what it
is doing.
Since values can vary in script.par file, when I am using
the variables I want to know what's the max values supplied for that variable.
in other words there will be 3 admin roles (admin_role_1=calls, admin_role_2=meetings,
admin_role_3=gusts) and two manager roles (manager_role_1=meetings, manager_role_2=workers),
so number of
values are changing. so, Would you please let me know
how to know what's the max values supplied for a given variable
so that I will refer to only to those variables in shell
script.
>>>>>
Some explanations about the script
-F "="
Set the internal awk variable FS to "=".,this specify
the field separator value.
NF >= 2 { . . . . }
Select lines with two or more fields (in the form variable=value)
and specify the code to execute for those lines.
variable = $1 ; value = $2
Get the variable name an it's value (fields delimited
by FS="=")
if (value ~ /^\(.*\)[:space:]*$/) { ... }
Test if the value is an array definition
value ~ /.../ : value match the regular expression
^ : start of string
\(.*\) : characters between parenthesis
[:space:]* : spaces (space or tab)
$ : end of string
sub(/^\(/,"",value)
Remove ( at start of string in variable value
sub(/\)[:space:]*$/,"",value")
Remove last ) and optionals spaces at end of string in
variable value.
Now, value contains elements of array delimited by commas
nbv = split(value, values, ",")
The elements of array are stored in the array values
(elements delimited by "," in value).
The number of elements is stored in the variable nbv.
for (i=1; i<=nbv; i++) print variable "_" i "=" values[i];
For each element of the array a variable assignment is
created in the form :
variable_n=value_n
else { print variable "=" value }
The else state for 'not an array definition'.
The variable assignment is printed in the form :
variable=value
(same as input without optional ending spaces).
The global result of the awk script is a list of variable
assignments that are evaluated by the 'eval' command to define script variables.
You need to determine how many values are supplied for
a variable (array definition). I propose you to define an extra variable
which contains this count
(for example admin_role_count=3).
Add the following statement in the awk script :
for (i=1; i<=nbv; i++)
???print variable "_" i "=" values[i];
print variable "_count=" nbv;
>>>>>
I am sorry to post another question. some parameters
in script.par file can be commented out. Would you please let me know how
to handle that. An example situation: I commented out "city" in script.par
and this parameter should not be used in shell script. Would you please
let me know how to handle that.
DEV UNIX 27> cat script.par
name=david
#city=phoenix
job=(admin,manager)
admin_role=(calls,meetings,gusts)
manager_role=(meetings,workers)
age=60
DEV UNIX 28>
>>>>>
I modified the script like this to handle the commented
parameters. It is working as expected. When you get a chance please verify
this. Please look at my earlier post for the challenge I am facing.
Modified script. Please let me know if I am doing it right
-
ReadParams() {
eval $( awk -F "=" '
NF >= 2 {
variable = $1;
value = $2;
if (variable !~ /^#/)
{
if (value ~ /^\(.*\)[:space:]*$/) {
sub(/^\(/, "", value);
sub(/\)[:space:]*$/, "", value);
nbv = split(value, values, ",")
for (i=1; i<=nbv; i++)
print variable "_" i "=" values[i];
print variable "_max" "=" nbv;
} else {
print variable "=" value;
}
}
}
' $1 )
}
ReadParams script2.par
>>>>>
Replace the statement :
NF >= 2 {
by :
NF >= 2 && $0 !~ /^[:space:]*#/ {
See Also
Unix
Administrator Career Path
Have a Unix Problem
Do
you have a UNIX Question?
Unix Books :-
UNIX Programming,
Certification, System Administration, Performance Tuning Reference Books
Return to : - Unix
System Administration Hints and Tips
(c) www.gotothings.com All material on this site is Copyright.
Every effort is made to ensure the content integrity.
Information used on this site is at your own risk.
All product names are trademarks of their respective
companies.
The site www.gotothings.com is in no way affiliated with
or endorsed by any company listed at this site.
Any unauthorised copying or mirroring is prohibited.
|