1 / 33

Bash Programming Review

Learn coding standards, I/O handling, redirection, and pipeline techniques for efficient Bash scripting. Master variables, loop redirection, arithmetic operations, and conditions for robust shell scripts.

jlambert
Download Presentation

Bash Programming Review

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Bash Programming Review CISC3130, Spring 2011 Dr. Zhang

  2. Outline • Coding standard: how to get good grades in lab assignment • Review of standard input/output/error • How to redirect them ? • Pipeline • Review of bash scripting

  3. Standard input/output/error • By default, link to keyboard and terminal window respectively • Can be redirected to files • Can be redirected to pipeline • input can be redirected to reading end of a pipe • output and error can be redirected to writing end of a pipe • When a bash script’s input/output/error is redirected: • E.g., headtail 3 10 .bash_profile > output • ls –l | headtail 10 24 | wc –l • input/output/error for every command in the script are redirected !

  4. Save standard input if necessary cat > stdinput ## save standard input to a file ## so that we can use as many times as we want wc –l stdinput grep PHONE stdinput

  5. Redirection can be applied to loop for i in `ls` do echo $i cat $i done > all_files Similar for <, |

  6. Outline • Coding standard: how to get good grades in lab assignment • Review of standard input/output/error • How to redirect them ? • Pipeline • Review of bash scripting

  7. Bash scripting: general hints • Use echo command to trace (like cout, printf in C/C++) • Sometimes there are alternatives ways to do things, choose one and remember it: • $(( …)), and $[ … ] • [[ ]] for test • Be careful about typo, shell wont complain variable not declared/assigned … • The price of freedom • A walk-through of basic bash scripting

  8. Bash Scripting • Variables • Environment variable: affect behavior of shell • User defined variable: default type is string, can declare it to be other type • Positional variables: used to pass command line arguments to bash script • Variable assignment: x=10 ## assign value 10 to variable x, no space around = x=$x+1 ## add 1 to x’s value and assign to x PATH=$PATH:.:~/bin • To refer to a variable’s value, precede variable name with $

  9. A script that display positional variable echo All arguments: $* echo Number of arguments: $# echo Script name: $0 echo argument 1: $1 echo argument 2: $2 for arg in $* do echo argument $arg done

  10. demo [zhang@storm CISC3130]$ ./test 10 20 tmpfile All arguments: 10 20 tmpfile Number of arguments: 3 Script name: ./test argument 1: 10 argument 2: 20 argument 10 argument 20 argument tmpfile

  11. arithmetic operation • As variable’s default type is string, to perform arithmetic operation, use the following syntax $[$x+1] or $(($x+1)) • For simpler syntax: declare variable to be numerical declare –i x x=$x*10+2 • Above are for integer arithmetic operations only ..

  12. Command bc • An arbitrary precision calculator $ bc 3.14159*10^2 314.15900 130^2 16900 sqrt(1000) 31 scale=4 sqrt(1000) 31.6277 quit An interactive calculator: * user input shown in normal font, * result shown in italics font Internal variable scale: * control the number of decimal points after decimal point

  13. bc in command line/script • To evaluate an expression, simply send it using pipe to bc echo "56.8 + 77.7" | bc • Write a script that read a Fahrenheit degree from standard input, convert it to Celsius degree (up to 2 digits after decimal point): C=(F-32)*5/9 • Base conversion, from base 10 (decimal) to base 16 (hexadecimal) echo "obase=16; ibase=10; 56" | bc

  14. Test/Conditions • Any command or script, if it return 0, then test is successful if rm tmp.txt then echo file tmp.txt has been deleted else echo fail to remove file tmp.txt Fi • Use ! to negate

  15. Test Condition • Numerical comparisons • -lt, -ne, -ge, … • String comparision • Pattern matching: using double brackets • To test if first argument is “–” followed by a number: if [[ "$1" == -[0-9]* ]] then ….

  16. AND/OR list construct • Statement1 && statement2 && statement3 && … • Each statement is executed; if it returns true, next statement is executed…. Until finding first statement that returns false, or all statements return true • Note: the statement can be any command, such as echo (which always return true) • Statement1 || statement2 || statement3 || … • Each statement is executed; if it returns false, next statement is executed…. Until finding first statement that returns true (the construct then return true), or all statements return false (the construct then returns false).

  17. Check password: maximum 5 tries tries=0; limit=5 while [ "$input" != "secret“ ] &&[ $tries –lt $limit ] do echo "Enter your password" read input; tries=$(($tries+1)) done if [ $input= “secret” ] then echo "welcome!“ else echo “retry limit (5) reached” fi

  18. Infinite loop while[ 1 ] do echo -n "Enter your password" read input if[ $input = "secret" ] then break else echo -n "Try again... " fi done

  19. Useful command : select loop #!/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 echo bad option fi done Recall pick command ?

  20. Next: • More advanced bash scripting • Array • Function • Here document

  21. Array • Bash provides one-dimensional array variables. • There is no maximum limit on the size of an array, nor any requirement that members be indexed or assigned contiguously. • Arrays are indexed using integers and are zero-based. • Assign values to array: array=( one two three ) files=( "/etc/passwd" "/etc/group" "/etc/hosts" ) limits=( 10, 20, 26, 39, 48)

  22. To Iterate Through Array Values for i in "${arrayName[@]}“ do # do whatever on $i done ----------------------------------------------------------------------- #!/bin/bash # declare an array called array and define 3 vales array=( one two three ) for i in "${array[@]}" do echo $i done

  23. Functions • One can define functions to increase modularity and readability of shell scripts • More efficient than breaking large scripts into many smaller ones… Why ? foo() { Echo “in function foo” } echo “start script…” foo echo “end script …”

  24. About functions • Need to be defined first, and then can be called • Parameter passing #! /bin/bash calsum(){ echo `expr $1 + $2` } x=1;y=2; calsum $x $y

  25. About functions • Result returning • Through setting a variable • Use return command • Use echo command #! /bin/bash calsum(){ echo `expr $1 + $2` } x=1;y=2; calsum $x $y z=`calsum $x $y` • calsum(){ • z=`expr $1 + $2` • } • x=1;y=2; • calsum $x $y • echo z=$z

  26. About functions • Local variable: its scope is within the function #! /bin/bash calsumsqr(){ local sum=`expr $1 + $2`; echo `expr $sum * $sum` } x=1;y=2; calsum $x $y z=`calsum $x $y`

  27. Here document • A special way to pass input to a command: here document, i.e., from the shell script itself #!/bin/bash cat <<!FUNKY! Hello This is a here Document !FUNKY! Here document starts with <<, followed by a special string which is repeated at the end of the document. Note: the special string should be chosen to be rare one.

  28. Here document:2 • Benefits: store codes and data together, easier to maintain • Example: 411 script grep “$*” << End Dial-a-joke 212-976-3838 Dial-a-prayer 212-246-4200 Dial santa 212-976-141 End ~/Demo/Examples/411

  29. A case study: bundle program (P 97) • Suppose a friend asks for copies of shell files in your bin directory $ cd /user/you/bin $ for i in *.sh > do > echo ===== This is file $i =============== > cat $i > done | mail yourfriend@hotmail.com Pipeline & input/output redirection can be applied to for, while, until loop.

  30. Make it better ? • Construct a mail message that could automatically unpack itself, i.e., to generate the original files packed inside • A shell script contains instructions for unpacking, and files themselves • Use here document mechanism • Generate this shell script using another script

  31. Bundle script #!/bin/bash echo ‘# To unbundle, bash this file’ for i do echo “echo $i 1>&2” echo “cat >$i <<‘End of $i’” cat $i echo “End of $i” done ~/Examples/writescript bundle.sh

  32. An example bundle file • Try it out: • ./bundle.sh bundle.sh 411 > junk • Inside junk:

  33. Inside junk file #To unbundle, bash this file echo bundle.sh 1>&2 cat >bundle.sh <<'End of bundle.sh' #!/bin/bash echo '#To unbundle, bash this file' for i in $@ ## or for i do echo "echo $i 1>&2" echo "cat >$i <<'End of $i'" cat $i echo "End of $i" done end of bundle.sh echo 411 1>&2 cat >411 <<'End of 411' grep "$*" <<End dial-a-joke 212-976-3838 dial-a-prayer 000000000 dial santa 8900999 today is `date` end end of 411

More Related