Penguin
Diff: HowToBashProgIntroHOWTO
EditPageHistoryDiffInfoLikePages

Differences between current version and predecessor to the previous major change of HowToBashProgIntroHOWTO.

Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History

Newer page: version 2 Last edited on Thursday, October 21, 2004 5:15:35 pm by AristotlePagaltzis
Older page: version 1 Last edited on Friday, June 7, 2002 1:06:15 am by perry Revert
@@ -1,1854 +1 @@
-  
-  
-  
-BASH Programming - Introduction HOW-TO  
-  
-  
-  
-----  
-  
-!!!BASH Programming - Introduction HOW-TO  
-  
-!!by Mike G mikkey at dynamo.com.ar Thu Jul 27 09:36:18 ART 2000  
-  
-  
-----  
-'' This article intends to help you to start programming basic-intermediate shell scripts. It does not intend to be an advanced document (see the title). I am NOT an expert nor guru shell programmer. I decided to write this because I'll learn a lot and it might be useful to other people. Any feedback will be apreciated, specially in the patch form :) ''  
-----  
-  
-  
-  
-  
-!!1. Introduction  
-  
-  
-*1.1 Getting the latest version  
-  
-*1.2 Requisites  
-  
-*1.3 Uses of this document  
-  
-  
-  
-  
-  
-!!2. Very simple Scripts  
-  
-  
-*2.1 Traditional hello world script  
-  
-*2.2 A very simple backup script  
-  
-  
-  
-  
-  
-!!3. All about redirection  
-  
-  
-*3.1 Theory and quick reference  
-  
-*3.2 Sample: stdout 2 file  
-  
-*3.3 Sample: stderr 2 file  
-  
-*3.4 Sample: stdout 2 stderr  
-  
-*3.5 Sample: stderr 2 stdout  
-  
-*3.6 Sample: stderr and stdout 2 file  
-  
-  
-  
-  
-  
-!!4. Pipes  
-  
-  
-*4.1 What they are and why you'll want to use them  
-  
-*4.2 Sample: simple pipe with sed  
-  
-*4.3 Sample: an alternative to ls -l *.txt  
-  
-  
-  
-  
-  
-!!5. Variables  
-  
-  
-*5.1 Sample: Hello World! using variables  
-  
-*5.2 Sample: A very simple backup script (little bit better)  
-  
-*5.3 Local variables  
-  
-  
-  
-  
-  
-!!6. Conditionals  
-  
-  
-*6.1 Dry Theory  
-  
-*6.2 Sample: Basic conditional example if .. then  
-  
-*6.3 Sample: Basic conditional example if .. then ... else  
-  
-*6.4 Sample: Conditionals with variables  
-  
-  
-  
-  
-  
-!!7. Loops for, while and until  
-  
-  
-*7.1 For sample  
-  
-*7.2 C-like for  
-  
-*7.3 While sample  
-  
-*7.4 Until sample  
-  
-  
-  
-  
-  
-!!8. Functions  
-  
-  
-*8.1 Functions sample  
-  
-*8.2 Functions with parameters sample  
-  
-  
-  
-  
-  
-!!9. User interfaces  
-  
-  
-*9.1 Using select to make simple menus  
-  
-*9.2 Using the command line  
-  
-  
-  
-  
-  
-!!10. Misc  
-  
-  
-*10.1 Reading user input with read  
-  
-*10.2 Arithmetic evaluation  
-  
-*10.3 Finding bash  
-  
-*10.4 Getting the return value of a program  
-  
-*10.5 Capturing a commands output  
-  
-*10.6 Multiple source files  
-  
-  
-  
-  
-  
-!!11. Tables  
-  
-  
-*11.1 String comparison operators  
-  
-*11.2 String comparison examples  
-  
-*11.3 Arithmetic operators  
-  
-*11.4 Arithmetic relational operators  
-  
-*11.5 Useful commands  
-  
-  
-  
-  
-  
-!!12. More Scripts  
-  
-  
-*12.1 Applying a command to all files in a directory.  
-  
-*12.2 Sample: A very simple backup script (little bit better)  
-  
-*12.3 File re-namer  
-  
-*12.4 File renamer (simple)  
-  
-  
-  
-  
-  
-!!13. When something goes wrong (debugging)  
-  
-  
-*13.1 Ways Calling BASH  
-  
-  
-  
-  
-  
-!!14. About the document  
-  
-  
-*14.1 (no) warranty  
-  
-*14.2 Translations  
-  
-*14.3 Thanks to  
-  
-*14.4 History  
-  
-*14.5 More resources  
-  
-----  
-  
-!!1. Introduction  
-  
-!!1.1 Getting the latest version  
-  
-  
-  
-  
-http://www.linuxdoc.org/HOWTO/Bash-Prog-Intro-HOWTO.html  
-  
-  
-  
-  
-  
-  
-!!1.2 Requisites  
-  
-  
-  
- Familiarity with GNU/Linux command lines, and familiarity  
-with basic programming concepts is helpful. While this is not  
-a programming introduction, it explains (or at least tries) many  
-basic concepts.  
-  
-  
-  
-  
-!!1.3 Uses of this document  
-  
-  
-  
- This document tries to be useful in the following situations  
-  
-  
-* You have an idea about programming and you want to start  
-coding some shell scripts.  
-*  
-  
-* You have a vague idea about shell programming and want  
-some sort of reference.  
-*  
-  
-* You want to see some shell scripts and some comments to  
-start writing your own  
-*  
-  
-* You are migrating from DOS/Windows (or already did)  
-and want to make "batch" processes.  
-*  
-  
-* You are a complete nerd and read every how-to available  
-*  
-  
-----  
-  
-!!2. Very simple Scripts  
-  
-  
- This HOW-TO will try to give you some hints about shell script  
-programming strongly based on examples.  
-  
-  
- In this section you'll find some little scripts which  
-will hopefully help you to understand some techniques.  
-  
-  
-  
-  
-!!2.1 Traditional hello world script  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-echo Hello World  
-  
-  
-  
-  
-  
-  
-  
- This script has only two lines.  
-The first indicates the system which program  
-to use to run the file.  
-  
-  
- The second line is the only action performed by this script,  
-which prints 'Hello World' on the terminal.  
-  
-  
- If you get something like ''./hello.sh: Command not found.''  
-Probably the first line '#!/bin/bash' is wrong, issue whereis bash or see  
-'finding bash' to see how sould you write this line.  
-  
-!!2.2 A very simple backup script  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-tar -cZf /var/my-backup.tgz /home/me/  
-  
-  
-  
-  
- In this script, instead of printing a message on the terminal,  
-we create a tar-ball of a user's home directory. This is NOT intended  
-to be used, a more useful backup script is presented later in this  
-document.  
-----  
-  
-!!3. All about redirection  
-  
-!!3.1 Theory and quick reference  
-  
-  
-  
- There are 3 file descriptors, stdin, stdout and stderr (std=standard).  
-  
-  
-  
-  
-  
-Basically you can:  
-  
-  
-# redirect stdout to a file  
-#  
-  
-# redirect stderr to a file  
-#  
-  
-# redirect stdout to a stderr  
-#  
-  
-# redirect stderr to a stdout  
-#  
-  
-# redirect stderr and stdout to a file  
-#  
-  
-# redirect stderr and stdout to stdout  
-#  
-  
-# redirect stderr and stdout to stderr  
-#  
-  
-1 'represents' stdout and 2 stderr.  
-  
-  
- A little note for seeing this things: with the less command you can view both stdout  
-(which will remain on the buffer) and the stderr that will be printed on the screen, but erased as  
-you try to 'browse' the buffer.  
-  
-!!3.2 Sample: stdout 2 file  
-  
-  
-  
- This will cause the ouput of a program to be written to a file.  
-  
-  
-ls -l > ls-l.txt  
-  
-  
-Here, a file called 'ls-l.txt' will be created and it will contain what you would see on the  
-screen if you type the command 'ls -l' and execute it.  
-  
-!!3.3 Sample: stderr 2 file  
-  
-  
-  
- This will cause the stderr ouput of a program to be written to a file.  
-  
-  
-grep da * 2> grep-errors.txt  
-  
-  
-Here, a file called 'grep-errors.txt' will be created and it will contain what you would see  
-the stderr portion of the output of the 'grep da *' command.  
-  
-!!3.4 Sample: stdout 2 stderr  
-  
-  
-  
- This will cause the stderr ouput of a program to be written to the same filedescriptor  
-than stdout.  
-  
-  
-grep da * 1>&2  
-  
-  
-Here, the stdout portion of the command is sent to stderr, you may notice that in differen ways.  
-  
-!!3.5 Sample: stderr 2 stdout  
-  
-  
-  
- This will cause the stderr ouput of a program to be written to the same filedescriptor  
-than stdout.  
-  
-  
-grep * 2>&1  
-  
-  
-Here, the stderr portion of the command is sent to stdout, if you pipe to less, you'll see that  
-lines that normally 'dissapear' (as they are written to stderr) are being kept now (because  
-they're on stdout).  
-  
-!!3.6 Sample: stderr and stdout 2 file  
-  
-  
-  
- This will place every output of a program to a file. This is suitable sometimes  
-for cron entries, if you want a command to pass in absolute silence.  
-  
-  
-rm -f $(find / -name core) &> /dev/null  
-  
-  
-This (thinking on the cron entry) will delete every file called 'core' in any directory. Notice  
-that you should be pretty sure of what a command is doing if you are going to wipe it's output.  
-----  
-  
-!!4. Pipes  
-  
-  
- This section explains in a very simple and practical way how to use pipes,  
-nd why you may want it.  
-  
-  
-  
-  
-!!4.1 What they are and why you'll want to use them  
-  
-  
-  
- Pipes let you use (very simple, I insist) the output of a program as the  
-input of another one  
-  
-!!4.2 Sample: simple pipe with sed  
-  
-  
-  
- This is very simple way to use pipes.  
-  
-  
-ls -l | sed -e "s/ [[aeio ]/u/g"  
-  
-  
-Here, the following happens: first the command ls -l is executed, and it's output,  
-instead of being printed, is sent (piped) to the sed program, which in turn, prints  
-what it has to.  
-  
-!!4.3 Sample: an alternative to ls -l *.txt  
-  
-  
-  
- Probably, this is a more difficult way to do ls -l *.txt, but it is here for illustrating pipes,  
-not for solving such listing dilema.  
-  
-  
-ls -l | grep "\.txt$"  
-  
-  
-Here, the output of the program ls -l is sent to the grep program, which, in turn, will print  
-lines which match the regex "\.txt$".  
-----  
-  
-!!5. Variables  
-  
-  
- You can use variables as in any programming languages.  
-There are no data types. A variable in bash can contain a number, a  
-character, a string of characters.  
-  
-  
- You have no need to declare a variable, just  
-assigning a value to its reference will create it.  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-!!5.1 Sample: Hello World! using variables  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-STR="Hello World!"  
-echo $STR  
-  
-  
-  
-  
-  
-  
-  
- Line 2 creates  
-a variable called STR and assigns the string "Hello World!" to  
-it. Then the VALUE of this variable is retrieved by putting  
-the '$' in at the beginning. Please notice (try it!)  
-that if you don't use the '$' sign, the output of the program will  
-be different, and probably not what you want it to be.  
-  
-!!5.2 Sample: A very simple backup script (little bit better)  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-OF=/var/my-backup-$(date +%Y%m%d).tgz  
-tar -cZf $OF /home/me/  
-  
-  
-  
-  
- This script introduces another thing. First  
-of all, you should be familiarized with the variable  
-creation and assignation on line 2. Notice the expression  
-'$(date +%Y%m%d)'.  
-If you run the script you'll notice that  
-it runs the  
-command inside the parenthesis, capturing its output.  
-  
-  
-  
-  
-  
- Notice that in this script, the output filename will  
-be different every day, due to the format switch to the date command(+%Y%m%d).  
-You can change this by specifying a different format.  
-  
-  
- Some more examples:  
-  
-  
- echo ls  
-  
-  
- echo $(ls)  
-  
-!!5.3 Local variables  
-  
-  
-  
- Local variables can be created by using the keyword ''local''.  
-  
-  
-  
-  
-  
-#!/bin/bash  
-HELLO=Hello  
-function hello {  
-local HELLO=World  
-echo $HELLO  
-}  
-echo $HELLO  
-hello  
-echo $HELLO  
-  
-  
-  
-  
- This example should be enought to show how to use a local variable.  
-----  
-  
-!!6. Conditionals  
-  
-  
- Conditionals let you decide whether to perform an action  
-or not, this decision is taken by evaluating an expression.  
-  
-  
-  
-  
-!!6.1 Dry Theory  
-  
-  
-  
- Conditionals have many forms. The most basic form is:  
-__if__ ''expression'' __then__ ''statement''  
-where 'statement' is only executed if 'expression'  
-evaluates to true.  
-'2<1' is an expresion that evaluates to false, while '2>1'  
-evaluates to true.xs  
-  
-  
- Conditionals have other forms such as:  
-__if__ ''expression''  
-__then__ ''statement1'' __else__ ''statement2''.  
-Here 'statement1' is executed if 'expression' is true,otherwise  
-'statement2' is executed.  
-  
-  
- Yet another form of conditionals is:  
-__if__ ''expression1''  
-__then__ ''statement1''  
-__else if__ ''expression2'' __then__ ''statement2''  
-__else__ ''statement3''.  
-In this form there's added only the  
-"ELSE IF 'expression2' THEN 'statement2'" which makes statement2 being  
-executed if expression2 evaluates to true. The rest is as you may  
-imagine (see previous forms).  
-  
-  
- A word about syntax:  
-  
-  
- The base for the 'if' constructions in bash is this:  
-  
-  
- if [[expression];  
-  
-  
- then  
-  
-  
- code if 'expression' is true.  
-  
-  
- fi  
-  
-!!6.2 Sample: Basic conditional example if .. then  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-if [[ "foo" = "foo" ]; then  
-echo expression evaluated as true  
-fi  
-  
-  
-  
-  
- The code to be executed if the expression within braces  
-is true can  
-be found after the 'then' word and before 'fi' which indicates the end  
-of the conditionally executed code.  
-  
-!!6.3 Sample: Basic conditional example if .. then ... else  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-if [[ "foo" = "foo" ]; then  
-echo expression evaluated as true  
-else  
-echo expression evaluated as false  
-fi  
-  
-  
-  
-!!6.4 Sample: Conditionals with variables  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-T1="foo"  
-T2="bar"  
-if [[ "$T1" = "$T2" ]; then  
-echo expression evaluated as true  
-else  
-echo expression evaluated as false  
-fi  
-  
-  
-----  
-  
-!!7. Loops for, while and until  
-  
-  
- In this section you'll find for, while and until loops.  
-  
-  
- The __for__ loop is a little bit different from other programming  
-languages. Basically, it let's you iterate over a series of  
-'words' within a string.  
-  
-  
- The __while__ executes a piece of code if the control expression  
-is true, and only stops when it is false (or a explicit break is found  
-within the executed code.  
-  
-  
- The __until__ loop is almost equal to the while loop, except that  
-the code is executed while the control expression evaluates to false.  
-  
-  
- If you suspect that while and until are very similar you are right.  
-  
-!!7.1 For sample  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-for i in $( ls ); do  
-echo item: $i  
-done  
-  
-  
-  
-  
-  
-  
-  
- On the second line, we declare i to be the variable that  
-will take the  
-different values contained in $( ls ).  
-  
-  
- The third line could be longer if needed, or there could  
-be more lines  
-before the done (4).  
-  
-  
- 'done' (4) indicates that the code that used the value of $i has  
-finished and $i can take a new value.  
-  
-  
- This script has very little sense, but a more useful way to use the  
-for loop would be to use it to match only certain files on the previous  
-example  
-  
-  
-  
-  
-!!7.2 C-like for  
-  
-  
-  
- fiesh suggested adding this form of looping. It's a for loop  
-more similar to C/perl... for.  
-  
-  
-#!/bin/bash  
-for i in `seq 1 10`;  
-do  
-echo $i  
-done  
-  
-  
-  
-!!7.3 While sample  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-COUNTER=  
-while [[ $COUNTER -lt 10 ]; do  
-echo The counter is $COUNTER  
-let COUNTER=COUNTER+1  
-done  
-  
-  
-  
-  
-  
-  
-  
- This script 'emulates' the well known  
-(C, Pascal, perl, etc) 'for' structure  
-  
-!!7.4 Until sample  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-COUNTER=20  
-until [[ $COUNTER -lt 10 ]; do  
-echo COUNTER $COUNTER  
-let COUNTER-=1  
-done  
-  
-  
-----  
-  
-!!8. Functions  
-  
-  
- 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.  
-  
-  
- Declaring a function is just a matter of writing function my_func { my_code }.  
-  
-  
- Calling a function is just like calling another program, you just write its name.  
-  
-  
-  
-  
-!!8.1 Functions sample  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-function quit {  
-exit  
-}  
-function hello {  
-echo Hello!  
-}  
-hello  
-quit  
-echo foo  
-  
-  
-  
-  
- Lines 2-4 contain the 'quit' function. Lines 5-7 contain the 'hello' function  
-If you are not absolutely sure about what this script does, please try it!.  
-  
-  
- Notice that a functions don't need to be declared in any specific order.  
-  
-  
- When running the script you'll notice that first: the function 'hello' is  
-called, second the 'quit' function, and the program never reaches line 10.  
-  
-!!8.2 Functions with parameters sample  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-function quit {  
-exit  
-}  
-function e {  
-echo $1  
-}  
-e Hello  
-e World  
-quit  
-echo foo  
-  
-  
-  
-  
- This script is almost identically to the previous one. The main difference is the  
-funcion 'e'. This function, prints the first argument it receives.  
-Arguments, within funtions, are treated in the same manner as arguments given to the script.  
-----  
-  
-!!9. User interfaces  
-  
-!!9.1 Using select to make simple menus  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-OPTIONS="Hello Quit"  
-select opt in $OPTIONS; do  
-if [[ "$opt" = "Quit" ]; then  
-echo done  
-exit  
-elif [[ "$opt" = "Hello" ]; then  
-echo Hello World  
-else  
-clear  
-echo bad option  
-fi  
-done  
-  
-  
-  
-  
- If you run this script you'll see that it is a  
-programmer's dream for text based menus. You'll probably notice  
-that it's very similar to the 'for' construction, only rather  
-than looping for each 'word' in $OPTIONS, it prompts the user.  
-  
-  
-  
-  
-!!9.2 Using the command line  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-if [[ -z "$1" ]; then  
-echo usage: $0 directory  
-exit  
-fi  
-SRCD=$1  
-TGTD="/var/backups/"  
-OF=home-$(date +%Y%m%d).tgz  
-tar -cZf $TGTD$OF $SRCD  
-  
-  
-  
-  
-  
-  
-  
- What this script does should be clear to you. The expression  
-in the first conditional tests if the program has received an argument  
-($1) and quits if it didn't, showing the user a little usage message.  
-The rest of the script should be clear at this point.  
-----  
-  
-!!10. Misc  
-  
-!!10.1 Reading user input with read  
-  
-  
-  
- In many ocations you may want to prompt the user for some input, and  
-there are several ways  
-to achive this. This is one of those ways:  
-  
-  
-#!/bin/bash  
-echo Please, enter your name  
-read NAME  
-echo "Hi $NAME!"  
-  
-  
-  
-  
- As a variant, you can get multiple values with read, this example may  
-clarify this.  
-  
-  
-#!/bin/bash  
-echo Please, enter your firstname and lastname  
-read FN LN  
-echo "Hi! $LN, $FN !"  
-  
-  
-  
-  
-  
-  
-!!10.2 Arithmetic evaluation  
-  
-  
-  
- On the command line (or a shell) try this:  
-  
-  
- echo 1 + 1  
-  
-  
- If you expected to see '2' you'll be disappointed. What if  
-you want BASH to evaluate some numbers you have? The solution  
-is this:  
-  
-  
- echo $((1+1))  
-  
-  
- This will produce a more 'logical' output. This is to evaluate an  
-arithmetic expression. You can achieve this also like this:  
-  
-  
- echo $[[1+1]  
-  
-  
-  
-  
-  
- If you need to use fractions, or more math or you just want it, you  
-can use bc to evaluate arithmetic expressions.  
-  
-  
- if i ran "echo $[[3/4]" at the command prompt, it would return  
-because bash only uses integers when answering. If you ran  
-"echo 3/4|bc -l", it would properly return .75.  
-  
-!!10.3 Finding bash  
-  
-  
-  
- From a message from mike (see Thanks to)  
-  
-  
- you always use #!/bin/bash .. you might was to give an example of  
-  
-  
- how to find where bash is located.  
-  
-  
- 'locate bash' is preferred, but not all machines have locate.  
-  
-  
- 'find ./ -name bash' from the root dir will work, usually.  
-  
-  
- Suggested locations to check:  
-  
-  
- ls -l /bin/bash  
-  
-  
- ls -l /sbin/bash  
-  
-  
- ls -l /usr/local/bin/bash  
-  
-  
- ls -l /usr/bin/bash  
-  
-  
- ls -l /usr/sbin/bash  
-  
-  
- ls -l /usr/local/sbin/bash  
-  
-  
- (can't think of any other dirs offhand... i've found it in  
-  
-  
- most of these places before on different system).  
-  
-  
- You may try also 'which bash'.  
-  
-!!10.4 Getting the return value of a program  
-  
-  
-  
- In bash, the return value of a program is stored in a special variable called $?.  
-  
-  
- This illustrates how to capture the return value of a program, I assume that the directory  
-''dada'' does not exist. (This was also suggested by mike)  
-  
-  
-#!/bin/bash  
-cd /dada &> /dev/null  
-echo rv: $?  
-cd $(pwd) &> /dev/null  
-echo rv: $?  
-  
-  
-  
-!!10.5 Capturing a commands output  
-  
-  
-  
- This little scripts show all tables from all databases (assuming you got MySQL installed).  
-Also, consider changing the 'mysql' command to use a valid username and password.  
-  
-  
-#!/bin/bash  
-DBS=`mysql -uroot -e"show databases"`  
-for b in $DBS ;  
-do  
-mysql -uroot -e"show tables from $b"  
-done  
-  
-  
-  
-!!10.6 Multiple source files  
-  
-  
-  
- You can use multiple files with the command source.  
-  
-  
- __TO-DO__  
-----  
-  
-!!11. Tables  
-  
-!!11.1 String comparison operators  
-  
-  
-  
- (1) s1 = s2  
-  
-  
- (2) s1 != s2  
-  
-  
- (3) s1 < s2  
-  
-  
- (4) s1 > s2  
-  
-  
- (5) -n s1  
-  
-  
- (6) -z s1  
-  
-  
-  
-  
-  
- (1) s1 matches s2  
-  
-  
- (2) s1 does not match s2  
-  
-  
- (3) __TO-DO__  
-  
-  
- (4) __TO-DO__  
-  
-  
- (5) s1 is not null (contains one or more characters)  
-  
-  
- (6) s1 is null  
-  
-!!11.2 String comparison examples  
-  
-  
-  
- Comparing two strings.  
-  
-  
-#!/bin/bash  
-S1='string'  
-S2='String'  
-if [[ $S1=$S2 ];  
-then  
-echo "S1('$S1') is not equal to S2('$S2')"  
-fi  
-if [[ $S1=$S1 ];  
-then  
-echo "S1('$S1') is equal to S1('$S1')"  
-fi  
-  
-  
-  
-  
- I quote here a note from a mail, sent buy Andreas Beck, refering to use  
-''if [[ $1 = $2 ]''.  
-  
-  
- This is not quite a good idea, as if either $S1 or $S2 is empty, you will  
-get a parse error. x$1=x$2 or "$1"="$2" is better.  
-  
-  
-  
-  
-!!11.3 Arithmetic operators  
-  
-  
-  
- +  
-  
-  
- -  
-  
-  
- *  
-  
-  
- /  
-  
-  
- % (remainder)  
-  
-!!11.4 Arithmetic relational operators  
-  
-  
-  
- -lt (<)  
-  
-  
- -gt (>)  
-  
-  
- -le (<=)  
-  
-  
- -ge (>=)  
-  
-  
- -eq (==)  
-  
-  
- -ne (!=)  
-  
-  
- C programmer's should simple map the operator to its corresponding  
-parenthesis.  
-  
-!!11.5 Useful commands  
-  
-  
-  
- This section was re-written by Kees (see thank to...)  
-  
-  
- Some of these command's almost contain complete programming languages.  
-From those commands only the basics will be explained. For a more detailed  
-description, have a closer look at the man pages of each command.  
-  
-  
-__sed__ (stream editor)  
-  
-  
-  
-  
-  
- Sed is a non-interactive editor. Instead of altering a file by moving the  
-cursor on the screen, you use a script of editing instructions to sed, plus the  
-name of the file to edit. You can also describe sed as a filter. Let's have  
-a look at some examples:  
-  
-  
-  
-  
-  
-$sed 's/to_be_replaced/replaced/g' /tmp/dummy  
-  
-  
-  
-  
-  
-  
-  
- Sed replaces the string 'to_be_replaced' with the string 'replaced' and  
-reads from the /tmp/dummy file. The result will be sent to stdout (normally  
-the console) but you can also add '> capture' to the end of the line above so  
-that sed sends the output to the file 'capture'.  
-  
-  
-  
-  
-  
-$sed 12, 18d /tmp/dummy  
-  
-  
-  
-  
-  
-  
-  
- Sed shows all lines except lines 12 to 18. The original file is not altered by this command.  
-  
-  
-__awk__ (manipulation of datafiles, text retrieval and processing)  
-  
-  
-  
-  
-  
- Many implementations of the AWK programming language exist (most known interpreters are GNU's  
-gawk and 'new awk' mawk.) The principle is simple: AWK scans for a pattern, and for every  
-matching pattern a action will be performed.  
-  
-  
- Again, I've created a dummy file containing the following lines:  
-  
-  
- ''"test123''  
-  
-  
- ''test''  
-  
-  
- ''tteesstt"''  
-  
-  
-  
-  
-  
-$awk '/test/ {print}' /tmp/dummy  
-  
-  
-  
-  
- test123  
-  
-  
-  
-  
-  
- test  
-  
-  
-  
-  
-  
- The pattern AWK looks for is 'test' and the action it performs when it found a line in the file  
-/tmp/dummy with the string 'test' is 'print'.  
-  
-  
-  
-  
-  
-$awk '/test/ {i=i+1} END {print i}' /tmp/dummy  
-  
-  
-  
-  
-  
-  
-  
- 3  
-  
-  
-  
-  
-  
- When you're searching for many patterns, you should replace the text between the quotes with '-f  
-file.awk' so you can put all patterns and actions in 'file.awk'.  
-  
-  
-__grep__ (print lines matching a search pattern)  
-  
-  
-  
-  
-  
- We've already seen quite a few grep commands in the previous chapters, that display the lines  
-matching a pattern. But grep can do more.  
-  
-  
-$grep "look for this" /var/log/messages -c  
-  
-  
-  
-  
- 12  
-  
-  
- The string "look for this" has been found 12 times in the file /var/log/messages.  
-  
-  
-  
-  
-  
- [[ok, this example was a fake, the /var/log/messages was tweaked :-)]  
-  
-  
-__wc__ (counts lines, words and bytes)  
-  
-  
-  
-  
-  
- In the following example, we see that the output is not what we expected. The dummy file, as used  
-in this example, contains the following text:  
-''"bash introduction''  
-'' howto test file"''  
-  
-  
-  
-  
-  
-$wc --words --lines --bytes /tmp/dummy  
-  
-  
-  
-  
-  
-  
-  
- 2 5 34 /tmp/dummy  
-  
-  
-  
-  
-  
- Wc doesn't care about the parameter order. Wc always prints them in a standard order, which is,  
-as you can see: .  
-  
-  
-__sort__ (sort lines of text files)  
-  
-  
-  
-  
-  
- This time the dummy file contains the following text:  
-  
-  
- ''"b''  
-  
-  
- ''c''  
-  
-  
- ''a"''  
-  
-  
-$sort /tmp/dummy  
-  
-  
-  
-  
-  
-  
-  
- This is what the output looks like:  
-  
-  
-  
-  
-  
- ''a''  
-  
-  
- ''b''  
-  
-  
- ''c''  
-  
-  
-  
-  
-  
- Commands shouldn't be that easy :-)  
-__bc__ (a calculator programming language)  
-  
-  
-  
-  
-  
- Bc is accepting calculations from command line (input from file. not from redirector or pipe),  
-but also from a user interface. The following demonstration shows some of the commands. Note that  
-  
-  
- I start bc using the -q parameter to avoid a welcome message.  
-  
-  
-  
-  
-  
-$bc -q  
-  
-  
-  
-  
-  
-  
-  
- ''1 == 5''  
-  
-  
- ''''  
-  
-  
- ''.05 == .05''  
-  
-  
- ''1''  
-  
-  
- ''5 != 5''  
-  
-  
- ''''  
-  
-  
- ''2 ^ 8''  
-  
-  
- ''256''  
-  
-  
- ''sqrt(9)''  
-  
-  
- ''3''  
-  
-  
- ''while (i != 9) {''  
-  
-  
- ''i = i + 1;''  
-  
-  
- ''print i''  
-  
-  
- ''}''  
-  
-  
- ''123456789''  
-  
-  
- ''quit''  
-  
-  
-__tput__ (initialize a terminal or query terminfo database)  
-  
-  
-  
-  
-  
- A little demonstration of tput's capabilities:  
-  
-  
-$tput cup 10 4  
-  
-  
-  
-  
- The prompt appears at (y10,x4).  
-  
-  
-$tput reset  
-  
-  
-  
-  
- Clears screen and prompt appears at (y1,x1). Note that (y0,x0) is the upper left corner.  
-  
-  
-$tput cols  
-  
-  
-''80''  
-  
-  
- Shows the number of characters possible in x direction.  
-  
-  
- It it higly recommended to be familiarized with these programs (at least). There are tons of  
-little programs that will let you do real magic on the command line.  
-  
-  
- [[some samples are taken from man pages or FAQs]  
-----  
-  
-!!12. More Scripts  
-  
-!!12.1 Applying a command to all files in a directory.  
-  
-  
-  
-  
-  
-!!12.2 Sample: A very simple backup script (little bit better)  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-SRCD="/home/"  
-TGTD="/var/backups/"  
-OF=home-$(date +%Y%m%d).tgz  
-tar -cZf $TGTD$OF $SRCD  
-  
-  
-  
-  
-  
-  
-!!12.3 File re-namer  
-  
-  
-  
-  
-  
-  
-#!/bin/sh  
-# renna: rename multiple files according to several rules  
-# written by felix hudson Jan - 2000  
-#first check for the various 'modes' that this program has  
-#if the first ($1) condition matches then we execute that portion of the  
-#program and then exit  
-# check for the prefix condition  
-if [[ $1 = p ]; then  
-#we now get rid of the mode ($1) variable and prefix ($2)  
-prefix=$2 ; shift ; shift  
-# a quick check to see if any files were given  
-# if none then its better not to do anything than rename some non-existent  
-# files!!  
-if [[$1 = ]; then  
-echo "no files given"  
-exit  
-fi  
-# this for loop iterates through all of the files that we gave the program  
-# it does one rename per file given  
-for file in $*  
-do  
-mv ${file} $prefix$file  
-done  
-#we now exit the program  
-exit  
-fi  
-# check for a suffix rename  
-# the rest of this part is virtually identical to the previous section  
-# please see those notes  
-if [[ $1 = s ]; then  
-suffix=$2 ; shift ; shift  
-if [[$1 = ]; then  
-echo "no files given"  
-exit  
-fi  
-for file in $*  
-do  
-mv ${file} $file$suffix  
-done  
-exit  
-fi  
-# check for the replacement rename  
-if [[ $1 = r ]; then  
-shift  
-# i included this bit as to not damage any files if the user does not specify  
-# anything to be done  
-# just a safety measure  
-if [[ $# -lt 3 ] ; then  
-echo "usage: renna r [[expression] [[replacement] files... "  
-exit  
-fi  
-# remove other information  
-OLD=$1 ; NEW=$2 ; shift ; shift  
-# this for loop iterates through all of the files that we give the program  
-# it does one rename per file given using the program 'sed'  
-# this is a sinple command line program that parses standard input and  
-# replaces a set expression with a give string  
-# here we pass it the file name ( as standard input) and replace the nessesary  
-# text  
-for file in $*  
-do  
-new=`echo ${file} | sed s/${OLD}/${NEW}/g`  
-mv ${file} $new  
-done  
-exit  
-fi  
-# if we have reached here then nothing proper was passed to the program  
-# so we tell the user how to use it  
-echo "usage;"  
-echo " renna p [[prefix] files.."  
-echo " renna s [[suffix] files.."  
-echo " renna r [[expression] [[replacement] files.."  
-exit  
-# done!  
-  
-  
-  
-!!12.4 File renamer (simple)  
-  
-  
-  
-  
-  
-  
-#!/bin/bash  
-# renames.sh  
-# basic file renamer  
-criteria=$1  
-re_match=$2  
-replace=$3  
-for i in $( ls *$criteria* );  
-do  
-src=$i  
-tgt=$(echo $i | sed -e "s/$re_match/$replace/")  
-mv $src $tgt  
-done  
-  
-  
-----  
-  
-!!13. When something goes wrong (debugging)  
-  
-!!13.1 Ways Calling BASH  
-  
-  
-  
- A nice thing to do is to add on the first line  
-  
-  
-#!/bin/bash -x  
-  
-  
-  
-  
- This will produce some intresting output information  
-----  
-  
-!!14. About the document  
-  
-  
- Feel free to make suggestions/corrections, or whatever you think  
-it would be interesting to see in this document. I'll try to update  
-it as soon as I can.  
-  
-!!14.1 (no) warranty  
-  
-  
-  
- This documents comes with no warranty of any kind.  
-and all that  
-  
-!!14.2 Translations  
-  
-  
-  
- Italian: by William Ghelfi (wizzy at tiscalinet.it)  
-is here  
-  
- French: by Laurent Martelli  
-is missed  
-  
- Korean: Minseok Park  
-http://kldp.org  
-  
- Korean: Chun Hye Jin  
-unknown  
-  
- Spanish: unknow  
-http://www.insflug.org  
-  
- I guess there are more translations, but I don't have any info of them,  
-if you have it, please, mail it to me so I update this section.  
-  
-!!14.3 Thanks to  
-  
-  
-  
-  
-  
-  
-* People who translated this document to other languages (previous section).  
-*  
-  
-* Nathan Hurst for sending a lot of corrections.  
-*  
-  
-* Jon Abbott for sending comments about evaluating arithmetic expressions.  
-*  
-  
-* Felix Hudson for writing the ''renna'' script  
-*  
-  
-* Kees van den Broek  
-(for sending many corrections, re-writting usefull comands section)  
-*  
-  
-* Mike (pink) made some suggestions about locating bash and testing files  
-*  
-  
-* Fiesh make a nice suggestion for the loops section.  
-*  
-  
-* Lion suggested to mention a common error (./hello.sh: Command not found.)  
-*  
-  
-* Andreas Beck made several corrections and coments.  
-*  
-  
-  
-!!14.4 History  
-  
-  
-  
- New translations included and minor correcitons.  
-  
-  
- Added the section usefull commands re-writen by Kess.  
-  
-  
- More corrections and suggestions incorporated.  
-  
-  
- Samples added on string comparison.  
-  
-  
- v0.8 droped the versioning, I guess the date is enought.  
-  
-  
- v0.7 More corrections and some old TO-DO sections written.  
-  
-  
- v0.6 Minor corrections.  
-  
-  
- v0.5 Added the redirection section.  
-  
-  
- v0.4 disapperd from its location due to my ex-boss and thid doc found it's new place  
-at the proper url: www.linuxdoc.org.  
-  
-  
- prior: I don't rememeber and I didn't use rcs nor cvs :(  
-  
-!!14.5 More resources  
-  
-  
-  
-  
-  
-  
- Introduction to bash (under BE)  
-http://org.laol.net/lamug/beforever/bashtut.htm  
-  
- Bourne Shell Programming  
-http://207.213.123 .70/book/  
-----  
+Describe [HowToBashProgIntroHOWTO ] here.