1827603 Members
3410 Online
109966 Solutions
New Discussion

Manage parameter-file

 
SOLVED
Go to solution
Oviwan
Honored Contributor

Manage parameter-file

Hi @ll

what is the best way to manage a parameter-file?
I have a file like this:

par1=value1
par2=value2 #comment
par3=value3

i have a menu and there is a menu-point which is called "set par1", when i choice this point comes a prompt where i can give the value for par1. after i give the value, how can i set this value in the parameter-file? and also read from the file?

Thanks
20 REPLIES 20
Oviwan
Honored Contributor

Re: Manage parameter-file

*EDIT*
it should be in ksh.

Regards
Rodney Hills
Honored Contributor

Re: Manage parameter-file

This looks like something for a shell script, so you would use "." command to assign your shell variables. Then to update the param file, write all the params back. Example-

par2=23
(
echo "par1=$par1"
echo "par2=$par2 #comment"
echo "par3=$par3"
) >yourparamfile

HTH

-- Rod Hills
There be dragons...
Oviwan
Honored Contributor

Re: Manage parameter-file

Thanks

what is the best way to read one value from the parameter-file?

and something other:
what means "set -x"?
James R. Ferguson
Acclaimed Contributor

Re: Manage parameter-file

Hi:

One easy way to extract one parameter's value from your file is to use 'awk'.

# echo "par2=value2"|awk '/par2/ {split($0,a,/=/);print a[2]}'

..returns (prints) value2

# X=`echo "par2=value2"|awk '/par2/ {split($0,a,/=/);print a[2]}'`

Thus ${X} now contains 'value2', the value of 'par2'.

As for the shell construct 'set -x' --- this prints the shell commands as they are executed. This is useful in debugging. See the man pages for 'sh-psix' for more information.

Regards!

...JRF...
James R. Ferguson
Acclaimed Contributor

Re: Manage parameter-file

Hi (again):

I should generalize a bit; sorry. Given your parameter file is composed with "=" as the delimiter betweeen parameter and value, to find the value of parameter "X":

# X=par2;awk '{if ($1~X) {split($0,a,/=/);print a[2]}}' X=$X parmfile

...returns the value of 'par2'.

Regards!

...JRF...
Oviwan
Honored Contributor

Re: Manage parameter-file

Ty

is there also a way to write a new value in the parameter-file without rewrite the whole parameter-file? also with awk.
James R. Ferguson
Acclaimed Contributor

Re: Manage parameter-file

Hi Oviwan:

Yes, you can update your file's parameters in place with perl:

# perl -i.old -ple 's/par2=.+\b/par2=newvalue/' parmsfile

...would make a backup copy "parmsfile.old" and update inplace the value of 'par2' changing it from whatever follows the "=" character to "newvalue".

Regards!

...JRF...
Arturo Galbiati
Esteemed Contributor

Re: Manage parameter-file

Hi,
I suggest:
grep ^par1 parameter-file|cut -d"=" -f2|sed 's/^ *//g'
In this way you can have any number of spaces between = and the parameter value.
HTH,
Art
James R. Ferguson
Acclaimed Contributor

Re: Manage parameter-file

Hi:

Arturo's point about embedded spaces is easily managed:

# perl -i.old -ple 's/par2\s*=.+\b/par2=newvalue/' parmsfile

Regards!

...JRF...
Oviwan
Honored Contributor

Re: Manage parameter-file

Thanks @ll

is there also a chance to do this:
# perl -i.old -ple 's/par2\s*=.+\b/par2=newvalue/' parmsfile
in ksh or awk? nice solution with perl, but i wouldn't mix a lot of programming languages, if possible only ksh and awk.

James R. Ferguson
Acclaimed Contributor

Re: Manage parameter-file

Hi Oviwan:

Perl's regular expression handling is one of the best available. Since perl allows updating in-place, whereas 'awk' or 'sed' force you to redirect modified output into a second file and then rotate that second file over the first, I also choose perl for this task.

As far as mixing various languages, then, one sees this all the time in shell scripts. Consider the number of shell lines with 'sed' and 'awk' snippets. If a shell uses 'cut' or 'grep' in reality that too is mixing languages since the later are C-code.

Could your requirement be met wholly in shell? Well, yes. For instance, you could parse your parameter file by using the shell's IFS (inter-field-separator) much along the lines of what I did with 'split' in the 'awk' code.

Regards!

...JRF...
Oviwan
Honored Contributor

Re: Manage parameter-file

You are right, but what is more professional? to mix a lot of languages or only use of one or two (if possible)?
how do you handle this at your own?
James R. Ferguson
Acclaimed Contributor

Re: Manage parameter-file

Hi Oviwan:

You asked, "...what is more professional? to mix a lot of languages or only use of one or two (if possible)? how do you handle this at your own?"

I prefer to drive screws with screwdrivers and nails with hammers. By this I mean, I perfer to do things easily and gracefully with the tools that offer both ease of use and good performance.

Just because you can do something in language X doesn't mean that you should. I want readable, maintainable (flexible) code that performs well using a minimum of server resources in that order. Sometimes mixing two languages (e.g. shell + awk or shell + sed or shell + perl) is an easy solution. The whole Unix philosophy is built around the idea of plumbing and to me this is one case of it.

Certainly as one becomes more familar and proficient with a language, like any tool, one tends to grab it at the start of a project. Many of the tasks we do in shell scripts could be re-written in perl. In cases where a working piece of code already exists I find no harm in leveraging another language for a small subtask.

"Mixing" languages is really nothing more than calling modules or libraries and that generally means making things easier in my opinion.

Regards!

...JRF...
Oviwan
Honored Contributor

Re: Manage parameter-file

Thanks JRF for your opinion and the code.

Regards Oviwan
Oviwan
Honored Contributor

Re: Manage parameter-file

One question to JRF's perl:

why doesn't work my adjustment? the parameter file doesn't change:
echo $par_name $par_value | perl -i.old -F: -ple 's/^$F[0]\s*=.*\b/$F[0]=$F[1]/o' ${prg_path}${prg_par_file}

output of set -x:
+ echo db_name PROD
+ perl -i.old -F: -ple s/^$F[0]\s*=.*\b/$F[0]=$F[1]/o /home/oracle/scripts/file.par

are my perl parameters wrong? or is there another chance to include the shell variable $par_name in the perl?

Thanks a lot
James R. Ferguson
Acclaimed Contributor
Solution

Re: Manage parameter-file

Hi Oviwan:

I you last post, there are several things amiss. It looks like you are attempting to autosplit on the ":" character but you don't specify '-a' nor do you explicity 'split' $_.

What you want to do is let the shell expand your variables and then present them to the perl snippet:

# arg=par2;val=newvalue;perl -i.old -ple "s/$arg\s*=.+\b/$arg=$val/" parmsfile

Note that this is a variation on my last post. By using double-quotes I let the shell evaluate the $arg and $val variables before perl runs.

Regards!

...JRF...
Oviwan
Honored Contributor

Re: Manage parameter-file

Thanks a lot, now it works perfectly!

I have every time troubles with this quotes ("'`) :(

Regards
Oviwan
Honored Contributor

Re: Manage parameter-file

I have still an other question.

is it possible to include a file in a shell-script file?
one file is the main programm the other one is the function file.

i search something like exists in php:
include ("functionfile");


Regards
James R. Ferguson
Acclaimed Contributor

Re: Manage parameter-file

Hi Oviwan:

You asked if it is possible to include a file in a shell script. Yes, the process is called "sourcing" a file. You cause this by writing a "dot" followed by a "blank" followed by the file name:

#/usr/bin/sh
echo "the next line says include the file"
. $HOME/includeme
echo "done"

This technique is often used to include environmental variables from a common file into a script instead of declaring them in a login profile.

Regards!

...JRF...
Oviwan
Honored Contributor

Re: Manage parameter-file

Thanks a lot, that's exactly what i needed!

Regards