Example 4
Concepts:
The if
statement, the shift
built-in bash command, and the grep
command.
Text:
Implement a bash script that receives two parameters as command line arguments.
The last parameter is a string containing the name of a command.
The script must produce the list of all the running processes launched with a command containing the string passed to the script as a parameter.
The produced list must contain the same fields reported by the program ps -ef.
The first parameter (-h) is optional. If it is present, the bash script must print the header (i.e, the first line) produced by the command ps.
Example:
Here two possible outputs of the script:
$ ./es -h bash UID PID PPID C STIME TTY TIME CMD user 2454 2449 0 18:05 pts/2 00:00:00 bash user 2816 2449 0 18:09 pts/4 00:00:00 bash user 2944 2449 0 18:14 pts/5 00:00:00 bash user 3249 2816 0 18:32 pts/4 00:00:00 bash
$ ./es bash user 2454 2449 0 18:05 pts/2 00:00:00 bash user 2816 2449 0 18:09 pts/4 00:00:00 bash user 2944 2449 0 18:14 pts/5 00:00:00 bash user 3249 2816 0 18:32 pts/4 00:00:00 bash
Solution:
- bash_ex4.sh
# Implement a bash script that receives two parameters as command line arguments. # The last parameter is a string containing the name of a command. # The script must produce the list of all the running processes launched with a command containing # the string passed to the script as a parameter. # The produced list must contain the same fields reported by the program ps -ef. # The first parameter (-h) is optional. If it is present, the bash script must print the header # (i.e, the first line) produced by the command ps. # Examples: # Input: ./es -h bash # UID PID PPID C STIME TTY TIME CMD user 2454 2449 0 18:05 pts/2 00:00:00 bash user 2816 2449 0 18:09 pts/4 00:00:00 bash user 2944 2449 0 18:14 pts/5 00:00:00 bash user 3249 2816 0 18:32 pts/4 00:00:00 bash # Input: ./es bash user 2454 2449 0 18:05 pts/2 00:00:00 bash user 2816 2449 0 18:09 pts/4 00:00:00 bash user 2944 2449 0 18:14 pts/5 00:00:00 bash user 3249 2816 0 18:32 pts/4 00:00:00 bash #!/bin/bash HEADER="false" PSCMD="/bin/ps -ef" # -e all the processes, -f full-format listing if [ "$1" = "-h" ] ; then HEADER=true echo "Script parameters before shift: $*" shift echo "Script parameters after shift: $*" fi if [ -z "$1" ] ; then # This condition is tree if length of $1 is 0 echo Usage: $0 [-h] process exit 1; fi if [ "$HEADER" = "true" ] ; then $PSCMD 2> /dev/null | head -n 1 fi $PSCMD 2> /dev/null | grep "$1" | grep -v grep exit 0
Comments:
The command shift
shifts to the left of one position the values stored in the positional command line parameters (i.e., $0
, $1
, $2
, …). The value $#
is modified coherently by the shift
command.
For instance, the bash script:
./script.sh par1 par2 par3
generates the following mapping:
$0=“./scritp.sh”
$1=“par1”
$2=“par2”
$3=“par3”
After the execution of the shift
command, the parameters passed to the script (with the exclusion of $0
) are shifted to the left of one position:
$0=“./scritp.sh”
$1=“par2”
$2=“par3”
The command shift
followed by a number shifts the values stored in the positional command line parameters of a quantity equal to the number.
The shift
command makes it possible to easily manage scripts with different numbers of command arguments, as in the presented example.
If you found any error, or if you want to partecipate to the editing of this wiki, please contact: admin [at] skenz.it
You can reuse, distribute or modify the content of this page, but you must cite in any document (or webpage) this url: https://www.skenz.it/cs/bash_language/example_4