|
Softpanorama
(slightly skeptical)
Open Source Software Educational Society |
May the
source be with you,
but remember the KISS principle ;-)
|
Care and Feeding of Functions in Shell
Functions are really scripts run in the current context of the shell (this means
that a second shell is not forked to run the function; it's run within the current
shell.) That means that functions provide a lot more flexibility that
aliases. Here are two simplest functions
possible: "do nothing" function and "Hello world" function:
function quit {
exit
}
function hello {
print "Hello world !"
}
hello
quit
Declaring a function is just a matter of writing function my_func { my_code
}. Functions can be declared in arbitrary order. But they need to be declared
before
they are invoked in the script. Calling a function is just like calling
another program, you just write its name and (optionally) arguments.
The best way to create a set of useful shell functions in a separate file. Then
you can source the file with the dot (.) command or in your startup scripts.
You can also just enter the function at the command line.
To create a function from the command line, you would do something
like this:
$ psgrep() {
> ps -ef | grep $1
> }
This is a pretty simple function, and could be implemented as an
alias as well. Let's try to solve the problem of displayed files
over 1K. awk can be used to find
any matching files that are larger than 100K bytes:
oversizela() {
ls -la | awk ' { if ( $5 gt 100000 ) print $1 } '
}
As in almost any programming language, you can use functions to group pieces
of code in a more logical way or practice the divine art of recursion.
NOTE: The "$#" macro is expanded to contain the number
of arguments.
Here is an example of a function that takes one parameter and prints it:
function arg1_echo {
print "The first argument is:" $1
}
function all_arg_echo {
print "List of argumnets is:" $@
}
function arg_num_echo {
print "Number of arguments is:" $#
}
Example of invocations:
arg1_echo test
all_arg_echo test 1 test 2
the
set command displays all the loaded functions available to the
shell.
$ set
USER=dave
findit=()
{
if [ $# -lt 1 ]; then
echo "usage :findit file";
return 1;
fi;
find / -name $1 -print
}
...
You can use unset
command to remove functions:
unset function_name
The idea of .rcfunc file
Traditionally kshrc contained aliases. So for functions it
might be beneficial to use a separate file called, for example,
.rcfunc.
Let's consider a very articisial (bad) example of creating a
function that will call find for each argument so that we can find several
different files with one command (useless exersize) The function will now look like this:
$ pg .rcfunct
#!/bin/sh
findit()
{
# findit
if [ $# -lt 1 ]; then
echo "usage :findit file"
return 1
fi
for member
do
find / -name $member -print
done
}
Now source the file again:
. /.rcfunct
Using the set command to see that it is indeed
loaded, you will notice that the shell has correctly interpreted the for
loop to take in all parameters.
$ set
findit=()
{
if [ $# -lt 1 ]; then
echo "usage :`basename $0` file";
return 1;
fi;
for loop in "$@";
do
find / -name $loop -print;
done
}
... Now to execute the changed findit function. Supplying
a couple of files to find:
$ findit LPSO.doc passwd
/usr/local/accounts/LPSO.doc
/etc/passwd
...
Notes:
- Those pages are written by people for whom English is not a
native language. Some amount of grammar and spelling errors
should be expected.
- This is a Spartan WHYFF (We Help You For Free) site. It
cannot replace the best teachers and
the
best books.
- The site contain some obsolete pages as it develops like a
living tree... Some links on older pages
are broken. Please
try to use Google, Open directory, etc. to find a replacement link
(see
HOWTO search the WEB for details).
We would appreciate if you can
mail us a correct link.
|
|
Like "real" programming languages, bash has
functions, though in a somewhat limited implementation. A function is a
subroutine, a code block that implements a set of operations, a "black
box" that performs a specified task. Whenever there is repetitive code,
when a task repeats with only slight variations, then writing a function
should be investigated.
function
function-name {
command...
}
or
function-name () {
command...
}
This second form will cheer the hearts of C programmers.
The opening bracket in the function may optionally be placed on the
second line, to more nearly resemble C function syntax.
function-name ()
{
command...
}
Functions are called, triggered, simply by
invoking their names.
Note that the function definition must precede the first call to it.
There is no method of "declaring" the function, as, for example, in C.
Example 3-80. Simple function
1 #!/bin/bash
2
3 funky ()
4 {
5 echo This is a funky function.
6 echo Now exiting funky function.
7 }
8
9 # Note: function must precede call.
10
11 # Now, call the function.
12
13 funky
14
15 exit 0
|
More complex functions may have arguments passed to them and return
exit values to the script for further processing.
1 function-name $arg1 $arg2
|
The function refers to the passed arguments by position (as if they
were positional parameters), that is, $1,
$2, and so forth.
Example 3-81. Function Taking Parameters
1 #!/bin/bash
2
3 func2 () {
4 if [ -z $1 ]
5 # Checks if any params.
6 then
7 echo "No parameters passed to function."
8 return 0
9 else
10 echo "Param #1 is $1."
11 fi
12
13 if [ $2 ]
14 then
15 echo "Parameter #2 is $2."
16 fi
17 }
18
19 func2
20 # Called with no params
21 echo
22
23 func2 first
24 # Called with one param
25 echo
26
27 func2 first second
28 # Called with two params
29 echo
30
31 exit 0
|
 |
In contrast to certain other
programming languages, shell scripts permit passing only
value parameters to functions. Variable names (which are
actually pointers), if passed as parameters to functions,
will be treated as string literals and cannot be
dereferenced. Functions interpret their
arguments literally. |
- exit status
- Functions return a value, called an exit
status. The exit status may be explicitly specified by a
return statement, otherwise it is the exit
status of the last command in the function (0
if successful, and a non-zero error code if not). This exit status
may be used in the script by referencing it as
$?.
- return
- Terminates a function. The return
statement optionally takes an integer argument, which is returned to
the calling script as the "exit status" of the function, and this
exit status is assigned to the variable
$?.
Example 3-82. Converting numbers to Roman numerals
1 #!/bin/bash
2
3 # Arabic number to Roman numeral conversion
4 # Range 0 - 200
5 # It's crude, but it works.
6
7 # Extending the range and otherwise improving the script
8 # is left as an exercise for the reader.
9
10 # Usage: roman number-to-convert
11
12 ARG_ERR=1
13 OUT_OF_RANGE=200
14
15 if [ -z $1 ]
16 then
17 echo "Usage: `basename $0` number-to-convert"
18 exit $ARG_ERR
19 fi
20
21 num=$1
22 if [ $num -gt $OUT_OF_RANGE ]
23 then
24 echo "Out of range!"
25 exit $OUT_OF_RANGE
26 fi
27
28 to_roman ()
29 {
30 number=$1
31 factor=$2
32 rchar=$3
33 let "remainder = number - factor"
34 while [ $remainder -ge 0 ]
35 do
36 echo -n $rchar
37 let "number -= factor"
38 let "remainder = number - factor"
39 done
40
41 return $number
42 }
43
44 # Note: must declare function
45 # before first call to it.
46
47 to_roman $num 100 C
48 num=$?
49 to_roman $num 90 LXXXX
50 num=$?
51 to_roman $num 50 L
52 num=$?
53 to_roman $num 40 XL
54 num=$?
55 to_roman $num 10 X
56 num=$?
57 to_roman $num 9 IX
58 num=$?
59 to_roman $num 5 V
60 num=$?
61 to_roman $num 4 IV
62 num=$?
63 to_roman $num 1 I
64
65 echo
66
67 exit 0
|
- local variables
- A variable declared as local is one
that is visible only within the block of code in which it appears.
In a shell script, this means the variable has meaning only within
its own function.
Example 3-83. Local variable visibility
1 #!/bin/bash
2
3 func ()
4 {
5 local a=23
6 echo
7 echo "a in function is $a"
8 echo
9 }
10
11 func
12
13 # Now, see if local 'a'
14 # exists outside function.
15
16 echo "a outside function is $a"
17 echo
18 # Nope, 'a' not visible globally.
19
20 exit 0
|
Local variables permit recursion (a recursive function is one
that calls itself), but this practice usually involves much
computational overhead and is definitely not
recommended in a shell script.
Example 3-84. Recursion, using a local variable
1 #!/bin/bash
2
3 # factorial
4 # ---------
5
6
7 # Does bash permit recursion?
8 # Well, yes, but...
9 # You gotta have rocks in your head to try it.
10
11
12 MAX_ARG=5
13 WRONG_ARGS=1
14 RANGE_ERR=2
15
16
17 if [ -z $1 ]
18 then
19 echo "Usage: `basename $0` number"
20 exit $WRONG_ARGS
21 fi
22
23 if [ $1 -gt $MAX_ARG ]
24 then
25 echo "Out of range (5 is maximum)."
26 # Let's get real now...
27 # If you want greater range than this, rewrite it in a real programming language.
28 exit $RANGE_ERR
29 fi
30
31 fact ()
32 {
33 local number=$1
34 # Variable "number" must be declared as local otherwise this doesn't work.
35 if [ $number -eq 0 ]
36 then
37 factorial=1
38 else
39 let "decrnum = number - 1"
40 fact $decrnum # Recursive function call.
41 let "factorial = $number * $?"
42 fi
43
44 return $factorial
45 }
46
47 fact $1
48 echo "Factorial of $1 is $?."
49
50 exit 0
|
Here is a simple way to create a script that will behave both as
an executable script and as a ksh function. Being an executable
script means the script can be run from any shell. Being a ksh
function means the script can be optimized to run faster if launched
from a ksh shell. This is an attempt to get the best of both worlds.
Procedure
Start by writing a ksh function. A ksh function is just like a
ksh script except the script code is enclosed within a
function name {
script } construct.
Take the following example:
# Example script
function fun {
print "pid=$$ cmd=$0 args=$*" opts="$-"
}
Save the text in a file. You'll notice nothing happens if you try
to execute the code as a script:
ksh ./example
In order to use a function, the file must first be sourced.
Sourcing the file will create the function definition in the current
shell. After the function has been sourced, it can then be executed
when you call it by name:
.. ./example
fun
To make the function execute as a script, the function must be
called within the file. Add the bold text to the example function.
# Example script
function fun {
print "pid=$$ cmd=$0 args=$*" opts="$-"
}
fun $*
Now you have a file that executes like a ksh script and sources
like a ksh function. One caveat is that the file now executes while
it is being sourced.
There are advantages and disadvantages to how the code is
executed. If the file was executed as a script, the system spawns a
child ksh process, loads the function definition, and then executes
the function. If the file was sourced, no child process is created,
the function definition is loaded into the current shell process,
and the function is then executed.
Sourcing the file will make it run faster because no extra
processes are created, however, loading a function occupies
environment memory space. Functions can also manipulate environment
variables whereas a script only gets a copy to work with. In
programming terms, a function can use call by reference
parameters via shell variables. A shell script is always call by
value via arguments.
Advanced Information
When working with functions, it's advantageous to use ksh
autoloading. Autoloading eliminates the need to source a file before
executing the function. This is accomplished by saving the file with
the same name as the function. In the above example, save the
example as the file name "fun".
Then set the FPATH environment
variable to the directory where the file fun is. Now, all that needs to be done is type "fun"
on the command line to execute the function.
Notice the double output the first time fun is called. This is because the first time the function is
called, the file must be sourced, and in sourcing the file, the
function gets called. What we need is to only call the function when
the file is executed as a script, but skip calling the function if
the file is sourced. To accomplish this, notice the output of the
script when executing it as opposed to sourcing it. When the file is
sourced, arg0 is always
-ksh. Also, note the difference in
opts when the script is sourced.
Test the output of arg0 to
determine if the function should be called or not. Also, make the
file a self-executing script. After all, no one likes having to type
"ksh" before running every ksh
script.
#!/bin/ksh
# Example script
function fun {
print "pid=$$ cmd=$0 args=$*" opts="$-"
}
[[ "${0##*/}" == "fun" ]] && fun $*
Now the file is a self-executing script as well as a
self-sourcing function (when used with ksh autoloading). What
becomes more interesting is that since the file can be an autoload
function as well as a stand-alone script, it could be placed in a
single directory and have both PATH
and FPATH point to it.
# ${HOME}/.profile
FPATH=${HOME}/bin
PATH=${FPATH}:${PATH}
In this setup, fun will always
be called as a function unless it's explicitly called as
${HOME}/bin/fun.
Considerations
Even though the file can be executed as a function or a script,
there are minor differences in behavior between the two. When the
file is sourced as a function, all local environment variables will
be visible to the script. If the file is executed as a script, only
exported environment variables will be visible. Also, when sourced,
a function can modify all environment variables. When the file is
executed, all visible environment variables are only copies. We may
want to make special allowances depending on how the file is called.
Take the following example.
#!/bin/ksh
# Add arg2 to the contents of arg1
function addTo {
eval $1=$(($1 + $2))
}
if [[ "${0##*/}" == "addTo" ]]; then
addTo $*
eval print \$$1
fi
The script is called by naming an environment variable and a
quantity to add to that variable. When sourced, the script will
directly modify the environment variable with the new value.
However, when executed as a script, the environment variable cannot
be modified, so the result must be output instead. Here is a sample
run of both situations.
# called as a function
var=5
addTo var 3
print $var
# called as a script
var=5
export var
var=$(./addTo var 3)
print $var
Note the extra steps needed when executing this example as a
script. The var must be exported
prior to running the script or else it won't be visible. Also,
because a script can't manipulate the current environment, you must
capture the new result.
Extra function-ality
It's possible to package several functions into a single file.
This is nice for distribution as you only need to maintain a single
file. In order to maintain autoloading functionality, all that needs
to be done is create a link for each function named in the file.
#!/bin/ksh
function addTo {
eval $1=$(($1 + $2))
}
function multiplyBy {
eval $1=$(($1 * $2))
}
if [[ "${0##*/}" == "addTo" ]] \
|| [[ "${0##*/}" == "multiplyBy" ]]; then
${0##*/} $*
eval print \$$1
fi
if [[ ! -f "${0%/*}/addTo" ]] \
|| [[ ! -f "${0%/*}/multiplyBy" ]]; then
ln "${0}" "${0%/*}/addTo"
ln "${0}" "${0%/*}/multiplyBy"
chmod u+rx "${0}"
fi
Notice the extra code at the bottom. This text could be saved in
a file named myDist. The first time
the file is sourced or executed, the appropriate links and file
permissions will be put in place, thus creating a single
distribution for multiple functions. Couple that with making the
file a script executable and you end up with a single distribution
of multiple scripts. It's like a shar file, but nothing
actually gets unpacked.
The only downside to this distribution tactic is that BigAdmin
will only credit you for each file submission, not based on the
actual number of executable programs...
Time to Run
Try some of the sample code in this document. Get comfortable
with the usage of each snippet to understand the differences and
limitations. In general, it's safest to always distribute a script,
but it's nice to have a function when speed is a consideration. Do
some timing tests.
export var=8
time ./addTo var 5
time addTo var 5
If this code were part of an inner-loop calculation of a larger
script, that speed difference could be significant.
This document aims to provide the best of both worlds. You can
have a script and retain function speed for when it's needed. I hope
you have enjoyed this document and its content. Thanks to Sun and
BigAdmin for the hosting and support to make contributions like this
possible.
In case of broken links
please try to use Google search. If you find the page please notify
us about new location
Marco's Bash Functions Library -
Summary [Gna!]
This package is an attempt to make
GNU
bash a viable
solution for medium sized scripts. A problem with bash is that it doesn't
provide encapsulation of any sort, beside the feature of providing
functions. This problem is partly solved by writing subscripts and invoking
them in the main script, but this is not always the best solution.
A set of modules implementing common
operations and a script template are provided by this package and the author
has used them with success in implementing non-small scripts.
The philosophy of MBFL is to do the work as much as possible without
external commands. For example: string manipulation is done using the
special variable substitution provided by
bash, and no use is done of utilities like
sed,
grep and
ed.
The library is better used if our
script is developed on the template provided in the package (examples/template.sh). This is
because with MBFL some choices have been made to reduce the application dependent part
of the script to the smallest dimension; if we follow another schema,
MBFL modules may be indequate. This is
especially true for the options parsing module.
The best way to use the library is to
include at runtime the library file
libmbfl.sh in the script; this is possible
by installing MBFL on the system and using this code in the scripts:
mbfl_INTERACTIVE='no'
source "${MBFL_LIBRARY:=`mbfl-config`}"
after the service variables have been
declared (Service Variables for details).
This code will read the full pathname of the library from the environment
variable MBFL_LIBRARY; if this variable is not set: the script
mbfl-config is invoked
with no arguments to acquire the pathname of the library.
mbfl-config is installed
in the bin
directory with the library.
Another solution is to include the
library directly in the script; this is easy if we preprocess our scripts
with GNU
m4:
m4_changequote([[, ]])
m4_include(libmbfl.sh)
is all we need to do. We can preprocess the
script with:
$ m4 --prefix-builtins --include=/path/to/library \
script.sh.m4 >script.sh
easy to do in a
Makefile; we can take
the MBFL's Makefile as example of this method.
It is also interesting to process the script
with the following rule:
M4 = ...
M4FLAGS = --prefix-builtins --include=/path/to/library
%.sh: %.sh.m4
$(M4) $(M4FLAGS) $(<) | \
grep --invert-match -e '^#' -e '^$$' | \
sed -e "s/^ \\+//" >$(@)
this will remove all the comments and
blank lines, decreasing the size of the script significantly if one makes
use of verbose comments; note that this will wipe out the
#!/bin/bash first line
also.
Usually we want the script to begin
with #!/bin/bash followed by a comment describing the license terms.
Bash by
example, Part 3
Encoding and decoding strings
The purpose of this module is to let an external process invoke a bash
script with damncommand line arguments: strings including blanks or
strange characters that may trigger quoting rules.
This problem can arise when using scripting languages with some sort of
eval command.
The solution is to encode the argument string in hexadecimal or octal format
strings, so that all the damn characters are converted to "good" ones. The the
bash script can convert them back.
| mbfl_decode_hex string |
Function |
| Decodes a hex string and outputs it on stdout. |
| mbfl_decode_oct string |
Function |
| Decodes a oct string and outputs it on stdout. |
Example:
mbfl_decode_hex 414243
-> ABC
Manipulating files and pathnames
Node:File Names, Next:File Commands, Up:File
File names
Node:File Name Parts, Next:File Name Path, Up:File
Names
Splitting a file name into its components
| mbfl_file_extension pathname
|
Function |
Extracts the extension from a file name. Searches the last dot (.)
character in the argument string and echoes to stdout the range of
characters from the dot to the end, not including the dot. If a slash (/)
character is found first, echoes to stdout the empty string.
|
| mbfl_file_dirname pathname
|
Function |
| Extracts the directory part from a fully qualified file name.
Searches the last slash character in the input string and echoes to
stdout the range of characters from the first to the slash, not
including the slash.
If no slash is found: echoes a single dot (the current directory).
If the input string begins with / or //
with no slash characters after the first ones, the string echoed to
stdout is a single slash. |
| mbfl_file_rootname pathname
|
Function |
| Extracts the root portion of a file name. Searches the last dot
character in the argument string and echoes to stdout the range of
characters from the beginning to the dot, not including the dot.
If a slash character is found first, or no dot is found, or the dot
is the first character, echoes to stdout the empty string. |
| mbfl_file_tail pathnbame |
Function |
| Extracts the file portion from a fully qualified file name. Searches
the last slash character in the input string and echoes to stdout the
range of characters from the slash to the end, not including the slash.
If no slash is found: echoes the whole string. |
| mbfl_file_split pathname |
Function |
Separates a file name into its components. One or more contiguous
occurrences of the slash character are used as separator. The components
are stored in an array named SPLITPATH, that may be
declared local in the scope of the caller; the base index
is zero. The number of elements in the array is stored in a variable
named SPLITCOUNT. Returns true. |
Node:File Name Path, Next:File Name System, Previous:File Name Parts, Up:File
Names
Handling relative pathnames
| mbfl_file_normalise pathname ?prefix?
|
Function |
Normalises a file name: removes all the occurrences of .
and ...
If pathname is relative (according to
mbfl_file_is_absolute) and prefix is not present or it
is the empty string: the current process working directory is prepended
to pathname.
If prefix is present and non empty, and pathname
is relative (according to mbfl_file_is_absolute):
prefix is prepended to pathname and normalised, too.
Echoes to stdout the normalised file name; returns true. |
| mbfl_file_is_absolute pathname
|
Function |
Returns true if the first character in pathname is a
slash (/); else returns false. |
| mbfl_file_is_absolute_dirname pathname
|
Function |
Returns true if pathname is a directory according to
mbfl_file_is_directory and an absolute pathname according
to mbfl_file_is_absolute. |
| mbfl_file_is_absolute_filename pathname
|
Function |
Returns true if pathname is a file according to
mbfl_file_is_file and an absolute pathname according to
mbfl_file_is_absolute. |
Node:File Name System, Previous:File Name Path, Up:File Names
Finding pathnames on the system
| mbfl_file_find_tmpdir ?PATHNAME?
|
Function |
Finds a value for a temporary directory. If PATHNAME is
not null and is a directory and is writable it is accepted; else the
value /tmp/$USER, where USER is the
environment variable, is tried; finally the value /tmp is
tried. When a value is accepted it's echoed to stdout. Returns true if a
value is found, false otherwise.
|
Node:File Commands, Next:File Testing, Previous:File Names, Up:File
File Commands
Node:File Commands Listing, Next:File Commands Mkdir, Up:File Commands
Retrieving informations
| mbfl_file_enable_listing |
Function |
Declares to the program module the commands required to retrieve
informations about files and directories (Program
Declaring). The programs are: ls. |
| mbfl_file_get_owner pathname
|
Function |
| Prints the owner of the file. |
| mbfl_file_get_group pathname
|
Function |
| Prints the group of the file. |
| mbfl_file_get_size pathname
|
Function |
| Prints the size of the file. |
| mbfl_file_normalise_link pathname
|
Function |
Makes use of the readlink to normalise the pathname of
a symbolic link (remember that a symbolic link references a file, never
a directory). Echoes to stdout the normalised pathname.
The command line of readlink is:
readlink -fn $pathname
|
Node:File Commands Mkdir, Next:File Commands Copy, Previous:File Commands Listing, Up:File Commands
Creating directories
| mbfl_file_enable_make_directory |
Function |
Declares to the program module the commands required to create
directories (Program Declaring). The
programs are: mkdir. |
| mbfl_file_make_directory pathname
?permissions? |
Function |
| Creates a directory named pathname; all the unexistent
parents are created, too. If permissions is present: it is
the specification of directory permissions in octal mode. |
Node:File Commands Copy, Next:File Commands Removing, Previous:File Commands Mkdir, Up:File Commands
Copying files
| mbfl_file_enable_copy |
Function |
Declares to the program module the commands required to copy files
and directories (Program Declaring).
The programs are: cp. |
| mbfl_file_copy source target
?...? |
Function |
| Copies the source, a file, to target, a file
pathname. Additional arguments are handed to the command unchanged.
If source does not exist, or if it is not a file, an error
is generated and the return value is 1. No test is done upon target.
|
| mbfl_file_copy_recursively source
target ?...? |
Function |
Copies the source, a directory, to target, a
directory pathname. Additional arguments are handed to the command
unchanged. This function is like mbfl_file_copy, but it
adds --recursive to the command line of cp.
If source does not exist, or if it is not a file, an error
is generated and the return value is 1. No test is done upon target.
|
Node:File Commands Removing, Next:File Commands Tar, Previous:File Commands Copy, Up:File Commands
Removing files and directories
Files removal is forced: the --force option to rm
is always used. It is responsibility of the caller to validate the operation
before invoking these functions.
Some functions test the existence of the pathname before attempting to remove
it: this is done only if test execution is disabled; if test execution is
enabled the command line is echoed to stderr to make it easier to debug scripts.
| mbfl_file_enable_remove |
Function |
Declares to the program module the commands required to remove files
and directories (Program Declaring).
The programs are: rm and rmdir. |
| mbfl_file_remove pathname
|
Function |
| Removes pathname, no matter if it is a file or directory.
If it is a directory: descends the sublevels removing all of them. If an
error occurs returns 1. |
| mbfl_file_remove_file pathname
|
Function |
| Removes the file selected by pathname. If the file does
not exist or it is not a file or an error occurs: returns 1. |
| mbfl_file_remove_directory pathname
|
Function |
| Removes the directory selected by pathname. If the
directory does not exist or an error occurs: returns 1. |
Manipulating tar archives
Remember that when we execute a script with the --test option:
the external commands are not executed: a command line is echoed to stdout. It
is recommended to use this mode to fine tune the command line options required
by tar.
| mbfl_file_enable_tar |
Function |
| mbfl_tar_exec ?...? |
Function |
Executes tar with whatever arguments are used. Returns
the return code of tar. |
| mbfl_tar_create_to_stdout directory
?...? |
Function |
Creates an archive and sends it to stdout. The root of the archive
is the directory. Files are selected with the .
pattern. tar flags may be appended to the invocation to
this function. In case of error returns 1. |
| mbfl_tar_extract_from_stdin directory
?...? |
Function |
Reads an archive from stdin and extracts it under directory.
tar flags may be appended to the invocation to this
function. In case of error returns 1. |
| mbfl_tar_extract_from_file directory
archive ?...? |
Function |
Reads an archive from a file and extracts it under directory.
tar flags may be appended to the invocation to this
function. In case of error returns 1. |
| mbfl_tar_create_to_file directory
archive ?...? |
Function |
Creates an archive named archive holding the contents of
directory. Before creating the archive, the process changes
the current directory to directory and selects the files with
the pattern .. tar flags may be appended to
the invocation to this function. In case of error returns 1. |
| mbfl_tar_archive_directory_to_file
directory archive ?...? |
Function |
Like mbfl_tar_create_to_file but archives all the
contents of directory, including the directory itself (not
its parents).
|
| mbfl_tar_list archive ?...?
|
Function |
Prints to stdout the list of files in archive. tar
flags may be appended to the invocation to this function. In case of
error returns 1. |
Node:File Testing, Next:File Misc, Previous:File Commands, Up:File
Testing file existence and the like
| mbfl_file_is_file filename
|
Function |
| Returns true if filename is not the empty string and is a
file.
|
| mbfl_file_is_readable filename
|
Function |
| Returns true if filename is not the empty string, is a
file and is readable. |
| mbfl_file_is_writable filename
|
Function |
| Returns true if filename is not the empty string, is a
file and is writable. |
| mbfl_file_is_directory directory
|
Function |
| Returns true if directory is not the empty string and is
a directory. |
| mbfl_file_directory_is_readable
directory |
Function |
| Returns true if directory is not the empty string, is a
directory and is readable. |
| mbfl_file_directory_is_writable
directory |
Function |
| Returns true if directory is not the empty string, is a
directory and is writable. |
| mbfl_file_is_symlink pathname
|
Function |
| Returns true if pathname is not the empty string and is a
symbolic link. |
Node:File Misc, Previous:File Testing, Up:File
Miscellaneous commands
| mbfl_cd dirname ?...? |
Function |
Changes directory to dirname. Optional flags to cd
may be appended. |
Node:Getopts, Next:Message,
Previous:File, Up:Top
The getopt module defines a set of procedures to be used to process command
line arguments with the following format:
-a
- brief option
a with no value;
-a123
- brief option
a with value 123;
--bianco
- long option
bianco with no value;
--color=bianco
- long option
color with value bianco.
Requires the message module (Message for details).
Node:Getopts Arguments, Next:Getopts Usage, Up:Getopts
Arguments
The module contains, at the root level, a block of code like the following:
ARGC=0
declare -a ARGV ARGV1
for ((ARGC1=0; $# > 0; ++ARGC1)); do
ARGV1[$ARGC1]="$1"
shift
done
this block is executed when the script is evaluated. Its purpose is to store
command line arguments in the global array ARGV1 and the number of
command line arguments in the global variable ARGC1.
The global array ARGV and the global variable ARGC
are predefined and should be used by the mbfl_getopts functions to
store non-option command line arguments.
Example:
$ script --gulp wo --gasp=123 wa
if the script makes use of the library, the strings wo and
wa will go into ARGV and ARGC will be set to 2.
The option arguments are processed and some action is performed to register
them.
We can access the non-option arguments with the following code:
for ((i=0; $i < $ARGC; ++i)); do
# do something with ${ARGV[$i]}
done
Node:Getopts Usage, Next:Getopts Options, Previous:Getopts Arguments, Up:Getopts
Using the module
To use this module we have to declare a set of script options; we declare a
new script option with the function mbfl_declare_option. Options
declaration should be done at the beginning of the script, before doing
anything; for example: right after the MBFL library code.
In the main block of the script: options are parsed by invoking
mbfl_getopts_parse: this function will update a global variable and
invoke a script function for each option on the command line.
Examples
Example of option declaration:
mbfl_declare_option ALPHA no a alpha noarg "enable alpha option"
this code declares an option with no argument and properties:
- global variable
script_option_ALPHA, which will be set to
no by default and to yes if the option is used;
- brief flag
-a;
- long flag
--alpha;
- description
enable alpha option, to be shown in the usage
output.
If the option is used: the function script_option_update_alpha
is invoked (if it exists) with no arguments, after the variable
script_option_ALPHA has been set to yes. Valid option usages
are:
$ script.sh -a
$ script.sh --alpha
Another example:
mbfl_declare_option BETA 123 b beta witharg "select beta value"
this code declares an option with argument and properties:
- global variable
script_option_BETA, which will be set to
123 by default and to the value selected on the command line if
the option is used;
- brief flag
-b;
- long flag
--beta;
- description
select beta value, to be shown in the usage
output.
If the option is used: the function script_option_update_beta is
invoked (if it exists) with no arguments, after the variable
script_option_BETA has been set to the selected value. Valid option
usages are:
$ script.sh -b456
$ script.sh --beta=456
Node:Getopts Options, Next:Getopts Interface, Previous:Getopts Usage, Up:Getopts
Predefined options
A set of predefined options is recognised by the library and not handed to
the user defined functions.
--encoded-args
- Signals to the library that the non-option arguments and the option
values are encoded in hexadecimal strings. Encoding is useful to avoid
quoting problems when invoking a script from another one.
If this option is used: the values are decoded by
mbfl_getopts_parse before storing them in the ARGV array
and before being stored in the option's specific global variables.
-v
--verbose
- Turns on verbose messages. The fuction
mbfl_option_verbose
returns true (Message, for details).
--silent
- Turns off verbose messages. The fuction
mbfl_option_verbose
returns false.
--verbose-program
- If used the
--verbose option is added to the command line
of external programs that support it. The fuction
mbfl_option_verbose_program returns true or false depending on the
state of this option.
--show-program
- Prints the command line of executed external programs.
--debug
- Turns on debugging messages (Message, for
details).
--test
- Turns on test execution (Program Testing,
for details).
--null
- Signals to the script that it has to use the null character to separate
values, instead of the common newline. The global variable
mbfl_option_NULL is set to yes.
-f
--force
- Signals to the script that it does not have to query
the user before doing dangerous operations, like overwriting files. The
global variable
mbfl_option_INTERACTIVE is set to no.
-i
--interactive
- Signals to the script that it does have to query the
user before doing dangerous operations, like overwriting files. The global
variable
mbfl_option_INTERACTIVE is set to yes.
--validate-programs
- Validates the existence of all the programs needed by the script; then
exits. The exit code is zero if all the programs were found, one otherwise.
--version
- Prints to the standard output of the script the contents of the global
variable
mbfl_message_VERSION, then exits with code zero. The
variable makes use of the service variables (Service
Variables, for details).
--version-only
- Prints to the standard output of the script the contents of the global
variable
script_VERSION, then exits with code zero.
--license
- Prints to the standard output of the script the contents of one of the
global variables
mbfl_message_LICENSE_*, then exits with code
zero. The variable makes use of the service variables (Service Variables, for details).
-h
--help
--usage
- Prints to the standard output of the script: the contents of the global
variable
script_USAGE; a newline; the string options:;
a newline; an automatically generated string describing the options declared
with mbfl_declare_option; a string describing the MBFL
default options. Then exits with code zero.
The following options may be used to set, unset and query the state of the
predefined options.
| mbfl_option_encoded_args |
Function |
| mbfl_set_option_encoded_args |
Function |
| mbfl_unset_option_encoded_args |
Function |
| Query/sets/unsets the encoded arguments option. |
| mbfl_option_encoded_args |
Function |
| mbfl_set_option_encoded_args |
Function |
| mbfl_unset_option_encoded_args |
Function |
| Query/sets/unsets the verbose messages option. |
| mbfl_option_verbose_program |
Function |
| mbfl_set_option_verbose_program |
Function |
| mbfl_unset_option_verbose_program |
Function |
| Query/sets/unsets verbose execution for external programs.
This option, of course, is supported only for programs that are known
by MBFL (like rm): if a program is executed
with mbfl_program_exec, it is responsibility of the caller
to use the option. |
| mbfl_option_show_program |
Function |
| mbfl_set_option_show_program |
Function |
| mbfl_unset_option_show_program |
Function |
| Prints the command line of executed external program. This does not
disable program execution, it just prints the command line before
executing it.
|
| mbfl_option_test |
Function |
| mbfl_set_option_test |
Function |
| mbfl_unset_option_test |
Function |
| Query/sets/unsets the test execution option. |
| mbfl_option_debug |
Function |
| mbfl_set_option_debug |
Function |
| mbfl_unset_option_debug |
Function |
| Query/sets/unsets the debug messages option. |
| mbfl_option_null |
Function |
| mbfl_set_option_null |
Function |
| mbfl_unset_option_null |
Function |
| Query/sets/unsets the null list separator option. |
| mbfl_option_interactive |
Function |
| mbfl_set_option_interactive |
Function |
| mbfl_unset_option_interactive |
Function |
| Query/sets/unsets the interactive excution option.
|
Node:Getopts Interface, Next:Getopts Values, Previous:Getopts Options, Up:Getopts
Interface functions
| mbfl_declare_option keyword
default brief long hasarg
description |
Function |
Declares a new option. Arguments description follows.
- keyword
- A string identifying the option; internally it is used to build
a function name and a variable name. It is safer to limit this
string to the letters in the range
a-z and underscores.
- default
- The default value for the option. For an option with argument it
can be anything; for an option with no argument: it must be
yes or no.
- brief
- The brief option selector: a single character. It is safer to
choose a single letter (lower or upper case) in the ASCII
standard.
- long
- The long option selector: a string. It is safer to choose a
sequence of letters in the ASCII standard, separated
by underscores or dashes.
- hasarg
- Either
witharg or noarg: declares if
the option requires an argument or not.
- description
- A one-line string describing the option briefly.
|
| mbfl_getopts_parse |
Function |
Parses a set of command line options. The options are handed to user
defined functions. The global array ARGV1 and the global
variable ARGC1 are supposed to hold the command line
arguments and the number of command line arguments. Non-option arguments
are left in the global array ARGV, the global variable
ARGC holds the number of elements in ARGV.
|
| mbfl_getopts_islong string
varname |
Function |
| Verifies if a string is a long option without argument. string
is the string to validate, varname is the optional name of a
variable that's set to the option name, without the leading dashes.
Returns with code zero if the string is a long option without
argument, else returns with code one.
An option must be of the form --option, only characters
in the ranges A-Z, a-z, 0-9 and
the characters - and _ are allowed in the
option name. |
| mbfl_getopts_islong_with string
optname varname |
Function |
Verifies if a string is a long option with argument. Arguments:
- string
- the string to validate;
- optname
- optional name of a variable that's set to the option name,
without the leading dashes;
- varname
- optional name of a variable that's set to the option value.
Returns with code zero if the string is a long option with argument,
else returns with code one.
An option must be of the form --option=value, only
characters in the ranges A-Z, a-z, 0-9
and the characters - and _ are allowed in the
option name.
If the argument is not an option with value, the variable names are
ignored. |
| mbfl_getopts_isbrief string
varname |
Function |
| Verifies if a string is a brief option without argument. Arguments:
string is the string to validate, varname optional
name of a variable that's set to the option name, without the leading
dash.
Returns with code zero if the argument is a brief option without
argument, else returns with code one.
A brief option must be of the form -a, only characters
in the ranges A-Z, a-z, 0-9 are
allowed as option letters. |
| mbfl_getopts_isbrief_with string
optname valname |
Function |
Verifies if a string is a brief option without argument. Arguments:
- string
- the string to validate;
- optname
- optional name of a variable that's set to the option name,
without the leading dashes;
- valname
- optional name of a variable that's set to the option value.
Returns with code zero if the argument is a brief option without
argument, else returns with code one.
A brief option must be of the form -aV (a
is the option, V is the value), only characters in the
ranges A-Z, a-z, 0-9 are allowed
as option letters. |
| mbfl_wrong_num_args required
present |
Function |
| Validates the number of arguments. required is the
required number of arguments, present is the given number of
arguments on the command line. If the number of arguments is different
from the required one: prints an error message and returns with code
one; else returns with code zero.
|
| mbfl_argv_from_stdin |
Function |
If the ARGC global variable is set to zero: fills the
global variable ARGV with lines from stdin. If the global
variable mbfl_option_NULL is set to yes: lines
are read using the null character as terminator, else they are read
using the standard newline as terminator.
This function may block waiting for input. |
| mbfl_argv_all_files |
Function |
Checks that all the arguments in ARGV are file names of
existent file. Returns with code zero if no errors, else prints an error
message and returns with code 1. |
Node:Getopts Values, Previous:Getopts Interface, Up:Getopts
Querying Options
Some feature and behaviour of the library is configured by the return value
of the following set of functions. All of these functions are defined by the
Getopts module, but they can be redefined by the script.
| mbfl_option_encoded_args |
Function |
Returns true if the option --encoded-args was used on
the command line. |
| mbfl_option_verbose |
Function |
Returns true if the option --verbose was used on the
command line after all the occurrences of --silent. Returns
false if the option --silent was used on the command line
after all the occurrences of --verbose. |
| mbfl_option_test |
Function |
Returns true if the option --test was used on the
command line.
|
| mbfl_option_debug |
Function |
Returns true if the option --debug was used on the
command line. |
| mbfl_option_null |
Function |
Returns true if the option --null was used on the
command line.
|
| mbfl_option_interactive |
Function |
Returns true if the option --interactive was used on
the command line after all the occurrences of --force.
Returns false if the option --force was used on the command
line after all the occurrences of --interactive. |
This module allows one to print messages on an output channel. Various forms
of message are supported.
All the function names are prefixed with mbfl_message_. All the
messages will have the forms:
<progname>: <message>
<progname>: [error|warning]: <message>
The following global variables are declared:
mbfl_message_PROGNAME
- must be initialised with the name of the script that'll be displayed at
the beginning of each message;
mbfl_message_VERBOSE
yes if verbose messages should be displayed, else no;
| mbfl_message_set_program PROGNAME
|
Function |
| Sets the script official name to put at the beginning of messages.
|
| mbfl_message_set_channel channel
|
Function |
| Selects the channel to be used to output messages.
|
| mbfl_message_string string
|
Function |
Outputs a message to the selected channel. Echoes a string composed
of: the content of the mbfl_message_PROGNAME global
variable; a colon; a space; the provided message.
A newline character is NOT appended to the message. Escape characters
are allowed in the message. |
| mbfl_message_verbose string
|
Function |
Outputs a message to the selected channel, but only if the
evaluation of the function/alias mbfl_option_verbose
returns true.
Echoes a string composed of: the content of the
mbfl_message_PROGNAME global variable; a colon; a space; the
provided message.
A newline character is NOT appended to the message. Escape characters
are allowed in the message. |
| mbfl_message_verbose_end string
|
Function |
Outputs a message to the selected channel, but only if the
evaluation of the function/alias mbfl_option_verbose
returns true.
Echoes the string. A newline character is NOT appended to the
message. Escape characters are allowed in the message. |
| mbfl_message_debug string
|
Function |
Outputs a message to the selected channel, but only if the
evaluation of the function/alias mbfl_option_debug returns
true.
Echoes a string composed of: the content of the
mbfl_message_PROGNAME global variable; a colon; a space; the
provided message.
A newline character is NOT appended to the message. Escape characters
are allowed in the message. |
| mbfl_message_warning string
|
Function |
Outputs a warning message to the selected channel. Echoes a string
composed of: the content of the mbfl_message_PROGNAME
global variable; a colon; a space; the string warning; a
colon; a space; the provided message.
A newline character IS appended to the message. Escape characters are
allowed in the message. |
| mbfl_message_error string
|
Function |
Outputs a error message to the selected channel. Echoes a string
composed of: the content of the mbfl_message_PROGNAME
global variable; a colon; a space; the string error; a
colon; a space; the provided message.
A newline character IS appended to the message. Escape characters are
allowed in the message. |
Node:Program, Next:Signal,
Previous:Message, Up:Top
This module declares a set of global variables all prefixed with
mbfl_program_. We have to look at the module's code to see which one are
declared.
Node:Program Testing, Next:Program Checking, Up:Program
Testing a script and running programs
MBFL allows a script to execute a "dry run", that is: do not
perform any operation on the system, just print messages describing what will
happen if the script is executed with the selected options. This implies, in the
MBFL model, that no external program is executed.
When this feature is turned on: mbfl_program_exec does not
execute the program, instead it prints the command line on standard error and
returns true.
| mbfl_set_option_test |
Function |
Enables the script test option. After this a script should not do
anything on the system, just print messages describing the operations.
This function is invoked when the predefined option --test
is used on the command line. |
| mbfl_unset_option_test |
Function |
| Disables the script test option. After this a script should perform
normal operations. |
| mbfl_option_test |
Function |
| Returns true if test execution is enabled, else returns false.
|
Node:Program Checking, Next:Program Executing, Previous:Program Testing, Up:Program
Checking programs existence
The simpler way to test the availability of a program is to look for it just
before it is used. The following function should be used at the beginning of a
function that makes use of external programs.
| mbfl_program_check program ?program
...? |
Function |
| Checks the availability of programs. All the pathnames on the
command line are checked: if one is not executable an error message is
printed on stderr. Returns false if a program can't be found, true
otherwise.
|
| mbfl_program_find program
|
Function |
A wrapper for:
type -ap program
that looks for a program in the current search path: prints the full
pathname of the program found, or prints an empty string if nothing is
found. |
Node:Program Executing, Next:Program Declaring, Previous:Program Checking, Up:Program
Executing a program
| mbfl_program_exec arg ...
|
Function |
| Evaluates a command line.
If the function mbfl_option_test returns true: instead
of evaluation, the command line is sent to stderr.
If the function mbfl_option_show_program returns true:
the command line is sent to stderr, then it is executed. |
Node:Program Declaring, Previous:Program Executing, Up:Program
Declaring the intention to use a program
To make a script model simpler, we assume that the unavailability of a
program at the time of its execution is a fatal error. So if we need to execute
a program and the executable is not there, the script must be aborted on the
spot.
Functions are available to test the availability of a program, so we can try
to locate an alternative or terminate the process under the script control. On a
system where executables may vanish from one moment to another, no matter how we
test a program existence, there's always the possibility that the program is not
"there" when we invoke it.
If we just use mbfl_program_exec to invoke an external program,
the function will try and fail if the executable is unavailable: the return code
will be false.
The vanishing of a program is a rare event: if it's there when we look for
it, probably it will be there also a few moments later when we invoke it. For
this reason, MBFL proposes a set of functions with which we can
declare the intention of a script to use a set of programs; a command line
option is predefined to let the user test the availability of all the declared
programs before invoking the script.
| mbfl_declare_program program
|
Function |
| Registers program as the name of a program required by
the script. The return value is always zero. |
| mbfl_program_validate_declared |
Function |
| Validates the existence of all the declared programs. The return
value is zero if all the programs are found, one otherwise.
This function is invoked by mbfl_getopts_parse when the
--validate-programs option is used on the command line.
It is a good idea to invoke this function at the beginning of a
script, just before starting to do stuff, example:
mbfl_program_validate_declared || mbfl_exit_program_not_found
If verbose messages are enabled: a brief summary is echoed to stderr;
from the command line the option --verbose must be used
before --validate-programs. |
| mbfl_program_found program
|
Function |
Prints the pathname of the previously declared program.
Returns zero if the program was found, otherwise prints an error message
and exits the script by invoking mbfl_exit_program_not_found.
This function should be used to retrieve the pathname of the program
to be used as first argument to mbfl_program_exec. |
| mbfl_exit_program_not_found |
Function |
| Terminates the script with exit code 20. This function may be
redefined by a script to make use of a different exit code; it may even
be redefined to execute arbitrary code and then exit. |
Node:Signal, Next:String,
Previous:Program, Up:Top
MBFL provides an interface to the trap builtin
that allows the execution of more than one function when a signal is received;
this may sound useless, but that is it.
| mbfl_signal_map_signame_to_signum
sigspec |
Function |
| Converts sigspec to the corresponding signal number, then
prints the number. |
| mbfl_signal_attach sigspec
handler |
Function |
| Append handler to the list of functions that are executed
whenever sigspec is received. |
| mbfl_signal_invoke_handlers signum
|
Function |
| Invokes all the handlers registered for signum. This
function is not meant to be used during normal scripts execution, but it
may be useful to debug a script. |
Node:String, Next:Dialog,
Previous:Signal, Up:Top
Node:String Quote, Next:String Inspection, Up:String
Quoted characters
| mbfl_string_is_quoted_char string
position |
Function |
Returns true if the character at position in string
is quoted; else returns false. A character is considered quoted if it is
preceeded by an odd number of backslashes (\).
position is a zero-based index. |
| mbfl_string_is_equal_unquoted_char
string position char |
Function |
Returns true if the character at position in string
is equal to char and is not quoted (according to
mbfl_string_is_quoted_char); else returns false. position
is a zero-based index. |
| mbfl_string_quote string |
Function |
Prints string with quoted characters. All the occurrences
of the backslash character, \, are substituted with a
quoted backslash, \\. Returns true. |
Node:String Inspection, Next:String Splitting, Previous:String Quote, Up:String
Inspecting a string
| mbfl_string_index string
index |
Function |
| Selects a character from a string. Echoes to stdout the selected
character. If the index is out of range: the empty string is echoed to
stdout.
|
| mbfl_string_first string char
?begin? |
Function |
| Searches characters in a string. Arguments: string, the
target string; char, the character to look for; begin,
optional, the index of the character in the target string from which the
search begins (defaults to zero).
Prints an integer representing the index of the first occurrence of
char in string. If the character is not found:
nothing is sent to stdout. |
| mbfl_string_last string char
?begin? |
Function |
| Searches characters in a string starting from the end. Arguments:
string, the target string; char, the character to
look for; begin, optional, the index of the character in the
target string from which the search begins (defaults to zero).
Prints an integer representing the index of the last occurrence of
char in string. If the character is not found:
nothing is sent to stdout. |
| mbfl_string_range string
begin end |
Function |
Extracts a range of characters from a string. Arguments: string,
the source string; begin, the index of the first character in
the range; end, optional, the index of the character next to
the last in the range, this character is not extracted. end
defaults to the last character in the string; if equal to end:
the end of the range is the end of the string. Echoes to stdout the
selected range of characters.
|
| mbfl_string_equal_substring string
position pattern |
Function |
| Returns true if the substring starting at position in
string is equal to pattern; else returns false. If
position plus the length of pattern is greater
than the length of string: the return value is false, always.
|
Node:String Splitting, Next:String Case, Previous:String Inspection, Up:String
Splitting a string
| mbfl_string_chars string |
Function |
Splits a string into characters. Fills an array named
SPLITFIELD with the characters from the string; the number of
elements in the array is stored in a variable named SPLITCOUNT.
Both SPLITFIELD and SPLITCOUNT may be declared
local in the scope of the caller.
The difference between this function and using: ${STRING:$i:1},
is that this function detects backslash characters, \, and
treats them as part of the following character. So, for example, the
sequence \n is treated as a single char. |
Example of usage for mbfl_string_chars:
string="abcde\nfghilm"
mbfl_string_chars "${string}"
# Now:
# "${#string}" = $SPLITCOUNT
# a = "${SPLITFIELD[0]}"
# b = "${SPLITFIELD[1]}"
# c = "${SPLITFIELD[2]}"
# d = "${SPLITFIELD[3]}"
# e = "${SPLITFIELD[4]}"
# \n = "${SPLITFIELD[5]}"
# f = "${SPLITFIELD[6]}"
# g = "${SPLITFIELD[7]}"
# h = "${SPLITFIELD[8]}"
# i = "${SPLITFIELD[9]}"
# l = "${SPLITFIELD[10]}"
# m = "${SPLITFIELD[11]}"
| mbfl_string_split string
separator |
Function |
Splits string into fields using seprator.
Fills an array named SPLITFIELD with the characters from
the string; the number of elements in the array is stored in a variable
named SPLITCOUNT. Both SPLITFIELD and
SPLITCOUNT may be declared local in the scope of the
caller. |
Node:String Case, Next:String Class, Previous:String Splitting, Up:String
Converting between upper and lower case
| mbfl_string_toupper string
|
Function |
| Outputs string with all the occurrencies of lower case
ASCII characters (no accents) turned into upper case.
|
| mbfl_string_tolower string
|
Function |
| Outputs string with all the occurrencies of upper case
ASCII characters (no accents) turned into lower case.
|
Node:String Class, Next:String Misc, Previous:String Case, Up:String
Matching a string with a class
| mbfl-string-is-alpha-char char
|
Function |
Returns true if char is in one of the ranges: a-z,
A-Z. |
| mbfl-string-is-digit-char char
|
Function |
Returns true if char is in one of the ranges: 0-9.
|
| mbfl-string-is-alnum-char char
|
Function |
Returns true if mbfl-string-is-alpha-char ||
mbfl-string-is-digit-char returns true when acting on char.
|
| mbfl-string-is-noblank-char char
|
Function |
Returns true if char is in none of the characters: ,
\n, \r, \f, \t.
char is meant to be the unquoted version of the non-blank
characters: the one obtained with:
$'char'
|
| mbfl-string-is-name-char char
|
Function |
Returns true if mbfl-string-is-alnum-char returns true
when acting upon char or char is an underscore,
_.
|
| mbfl-string-is-alpha string
|
Function |
| mbfl-string-is-digit string
|
Function |
| mbfl-string-is-alnum string
|
Function |
| mbfl-string-is-noblank string
|
Function |
| mbfl-string-is-name string
|
Function |
Return true if the associated char function returns true for each
character in string. As an additional constraint:
mbfl-string-is-name returns false if mbfl-string-is-digit
returns true when acting upon the first character of string.
|
Node:String Misc, Previous:String Class, Up:String
Miscellaneous functions
| mbfl_string_replace string
pattern ?subst? |
Function |
| Replaces all the occurrences of pattern in string
with subst; prints the result. If not used, subst
defaults to the empty string. |
| mbfl_sprintf varname format
... |
Function |
Makes use of printf to format the string format
with the additional arguments, then stores the result in varname:
if this name is local in the scope of the caller, this has the effect of
filling the variable in that scope. |
| mbfl_string_skip string
varname char |
Function |
| Skips all the characters in a string equal to char.
varname is the name of a variable in the scope of the caller: its
value is the offset of the first character to test in string.
The offset is incremented until a char different from char is
found, then the value of varname is update to the position of
the different char. If the initial value of the offset corresponds to a
char equal to char, the variable is left untouched. Returns
true.
|
Node:Dialog, Next:Variables,
Previous:String, Up:Top
| mbfl_dialog_yes_or_no string ?progname?
|
Function |
Prints the question string on the standard output and
waits for the user to type yes or no in the
standard input. Returns true if the user has typed yes,
false if the user has typed no.
The optional parameter progname is used as prefix for the
prompt; if not given: defaults to the value of script_PROGNAME
(Service Variables for details). |
| mbfl_dialog_ask_password prompt
|
Function |
| Prints prompts followed by a colon and a space, then
reads a password from the terminal. Prints the password. |
Node:Variables, Next:Main,
Previous:Dialog, Up:Top
Node:Variables Arrays, Next:Variables Colon, Up:Variables
Manipulating arrays
| mbfl_variable_find_in_array element
|
Function |
Searches the array mbfl_FIELDS for a value equal to
element. If it is found: prints the index and returns true;
else prints nothing and returns false.
mbfl_FIELDS must be filled with elements having
subsequent indexes starting at zero.
|
| mbfl_variable_element_is_in_array
element |
Function |
A wrapper for mbfl_variable_find_in_array that does not
print anything. |
Node:Variables Colon, Previous:Variables Arrays, Up:Variables
Manipulating colon variables
| mbfl_variable_colon_variable_to_array
varname |
Function |
| Reads varname's value, a colon s |