XP-rience

Something that I'd like to share with you!

Friday, April 23, 2021

Bash trap - signal trapping with Unix shell

No comments :

Linux/Unix shell/Bash trap command "Trap" can be used to execute a function/command on receiving certain signal. To list down all available signals, do "trap -l"
# trap -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
Please refer to https://www.computerhope.com/unix/utrap.htm for more information on this. Example common usage in a shell script, to perform cleanup when EXIT signal detected. Maybe to delete certain temporary files upon receiving CTRL+C. Example script
#!/bin/bash
cleanup(){
	echo
	echo "running cleanup here"
	echo "delete temporary files?"
	echo
}
trap cleanup EXIT
read -p "Press enter to continue"
read -p "Press enter to continue again"
read -p "Press enter to continue again"
When run, on receiving CTRL+C while the script is running (before the last line) will trigger the "cleanup" function.
# ./test.sh
Press enter to continue
Press enter to continue again^C
running cleanup here
delete temporary files?

Tuesday, April 20, 2021

Bash select - Creating simple menu with the Unix shell "select" loop

No comments :

Bash select command creates a menu from a list of items. The syntax is quite similar as the "for loop". Please refer to link below for more info https://linuxize.com/post/bash-select/ https://linuxhint.com/bash_select_command/ Lets do a quick test. Create a simple for loop as below and run it.
#!/bin/bash
for i in the quick brown fox jumps over the lazy dog
do
	echo $i
done
You will get a list of word as below.
# ./test.sh
the
quick
brown
fox
jumps
over
the
lazy
dog
Now modify the script as below. Replace "for" with "select". Add "break" just under the "echo" line.
#!/bin/bash
select i in the quick brown fox jumps over the lazy dog
do
	echo word selection = $i
	break
done
Now run the script and you will get below output.
# ./test.sh
1) the
2) quick
3) brown
4) fox
5) jumps
6) over
7) the
8) lazy
9) dog
#? 6
word selection = over
Note that, without "break", the script will keep on prompting the selection until you hit CTRL+C.

Monday, April 19, 2021

Bash array - how to use arrays in Unix shell

No comments :


Unix shell do support array. Yes, it does. Please refer to https://opensource.com/article/18/5/you-dont-know-bash-intro-bash-arrays OR https://www.tutorialspoint.com/unix/unix-using-arrays.htm for more info on this. To define an array, do;
myArray=(the quick brown fox jumps over the lazy dog)
But how to read an array?. Lets try this;
#!/bin/bash
myArray=(the quick brown fox jumps over the lazy dog)
echo $myArray
Run it ...
# ./test.sh
the
It will only echo the 1st word from the array. Lets try another example.
#!/bin/bash
myArray=(the quick brown fox jumps over the lazy dog)
echo ${myArray[0]}
echo ${myArray[1]}
echo ${myArray[2]}
echo ${myArray[3]}
echo ${myArray[4]}
echo ${myArray[5]}
echo ${myArray[6]}
echo ${myArray[7]}
echo ${myArray[8]}
echo ${myArray[9]}
Run it ...
# ./test.sh
the
quick
brown
fox
jumps
over
the
lazy
dog
Now, It will print all array content. Note that, it won't give any alert if the index is out of bound, for this example = "${myArray[9]}" Lets do a proper way to read an array by using "for loop";
#!/bin/bash
myArray=(the quick brown fox jumps over the lazy dog)
for i in ${myArray[@]}
do
    echo $i
done
Run it ...
# ./test.sh
the
quick
brown
fox
jumps
over
the
lazy
dog
You will get above output. Adding an "!" to the array name will change the loop from looping through the values to looping through the indices.
#!/bin/bash
myArray=(the quick brown fox jumps over the lazy dog)
for i in ${!myArray[@]}
do
    echo $i
done
Run it ...
# ./test.sh
0
1
2
3
4
5
6
7
8
Example below is using "while loop" to loop through the array.
#!/bin/bash
myArray=(the quick brown fox jumps over the lazy dog)
index=0
while [ $index -lt ${#myArray[@]} ]
do
    echo $index = ${myArray[index]}
    index=`expr $index + 1`
done
Run it ...
# ./test.sh
0 = the
1 = quick
2 = brown
3 = fox
4 = jumps
5 = over
6 = the
7 = lazy
8 = dog
Here are some syntax list that might be useful.
Syntax Result
myArray=() Create an empty array
myArray=(1 2 3) Initialize array
${myArray[2]} Retrieve all elements
${myArray[@]} Retrieve all elements
${!myArray[@]} Retrieve array indices
${#myArray[@]} Calculate array size
myArray[0]=3 Overwrite 1st element
myArray+=(4) Append value(s)
${arr[@]:s:n} Retrieve n elements starting at index s