Command Line Arguments/Positional Parameters
A command line argument is nothing but an argument sent to a program being called. A program can take any number of command line arguments. For example, type the following command:
pbmac@pbmac-server $ ls grate_stories_of grate_stories_of: No such file or directory pbmac@pbmac-server $ ls great_stories_of great_stories_of
There is no file or directory named grate_stories_of so the system issues an error message.
ls is the name of an actual command and shell executed this command when you type command at shell prompt. The first word on the command line is:
- ls - name of the command to be executed.
- Everything else on command line is taken as arguments to this command. (ALTHOUGH many texts, this course included, make a distinction between options and arguments - with options specifying behavior of the command, whereas the actual arguments specify what to apply the options to.)
Consider the following example:
pbmac@pbmac-server $ tail +10 /path/to/file.txt
- tail: Command name.
- +10 /path/to/file.txt: The arguments.
Try the following command and note down its command line arguments:
|Command||Command name||Total number of arguments||Argument name(s)|
|cp /etc/resolv.conf /tmp/test.txt||cp||2||/etc/resolv.conf, and /tmp/test.txt|
|sort -r -n /path/to/file||sort||3||-r, -n, and /path/to/file|
Command Line Parameters Different Names
A command line parameter is also known as:
- Command line options
- Positional parameters
- Switches or switch
- Command-line arguments
Why Use Command Line Arguments
- Telling the command/utility which option to use.
- Informing the utility/command which file or group of files to process (reading/writing of files).
Accessing Command-Line Arguments
All command line parameters (positional parameters) are available via special shell variable $1, $2, $3,...,$9.
The simple shell script called cmdargs.sh is shown in this example:
#!/bin/bash echo "The script name : $0" echo "The value of the first argument to the script : $1" echo "The value of the second argument to the script : $2" echo "The value of the third argument to the script : $3" echo "The number of arguments passed to the script : $#" echo "The value of all command-line arguments (\$* version) : $*" echo "The value of all command-line arguments (\$@ version) : $@"
When the script is run, the output looks like:
The script name : ./cmdargs.sh The value of the first argument to the script : bmw The value of the second argument to the script : ford The value of the third argument to the script : toyota The number of arguments passed to the script : 3 The value of all command-line arguments ($* version) : bmw ford toyota The value of all command-line arguments ($@ version) : bmw ford toyota
The following are additional examples; the results are in the table that follows.
pbmac@pbmac-server $ ls /tmp ./math 10 + 3 ~/scripts/addzone cyberciti.com ~/scripts/adddomain cyberciti.biz '184.108.40.206' '2607:f0d0:1002:11::4' /etc/init.d/named reload /usr/local/etc/rc.d/jail restart cyberciti.biz
|Shell script name ($0)||Total number of arguments ($#)||Actual Command line argument ($1,..,$9)|
|./math||3||10, +, and 3|
|~/scripts/adddomain||3||cyberciti.biz, 220.127.116.11, and 2607:f0d0:1002:11::4|
|/usr/local/etc/rc.d/jail||2||restart, and cyberciti.biz|
A Note About $@ and $*
- $@ expanded as "$1" "$2" "$3" ... "$n"
- $* expanded as "$1y$2y$3y...$n", where y is the value of $IFS (Input Field Seperator) variable i.e. "$*" is one long string and $IFS act as a separator or token delimiters.
The Difference Between $@ and $*
An example showing difference between these two variables:
#!/bin/bash # Set Input FIeld Separator IFS=", " echo "* Displaying all pizza names using \$@" echo "$@" echo # Output includes the field separator - the comma echo "* Displaying all pizza names using \$*" echo "$*"
When the script runs the output is:
pbmac@pbmac-server $ ./pizza.sh * Displaying all pizza names using $@ Margherita Tomato Panner Gourmet *Displaying all pizza names using $* Margherita,Tomato,Panner,Gourmet
The exec Command
The exec command in Linux is used to execute a command from the bash itself. This command does not create a new process, it just replaces the bash with the command to be executed. If the exec command is successful, it does not return to the calling process.
exec [-cl] [-a name] [command [arguments]] [redirection ...]
- -c: Used to execute the command with empty environment.
- -a name: Used to pass a name as the zeroth argument of the command.
- - l: Used to pass dash as the zeroth argument of the command.
Note: exec command does not create a new process. When we run the exec command from the terminal, the ongoing terminal process is replaced by the command that is provided as the argument for the exec command.
The exec command can be used in two modes:
- Exec with a command as an argument: In the first mode, the exec tries to execute it as a command passing the remaining arguments, if any, to that command and managing the redirections, if any.
# The given command is executed in a different process...and returns the results, then the original process is back in control pbmac@pbmac-server $ exec wc -w < tmp 9 pbmac@pbmac-server $
- Exec without a command: If no command is supplied, the redirections can be used to modify the current shell environment. This is useful as it allows us to change the file descriptors of the shell as per our desire. The process continues even after the exec command unlike the previous case but now the standard input, output, and error are modified according to the redirections.
pbmac@pbmac-server $ bash This exec creates a new process that overlays the bash shell started by the previous command pbmac@pbmac-server $ exec > tmp We are now in a different process....and all of this is being directed to the file names tmp by the previous command pbmac@pbmac-server $ ls pbmac@pbmac-server $ echo "This message will not be displayed" pbmac@pbmac-server $ exit exit The exit command exits the other process...and returns to the original context We see all of the output that had been sent to the file named tmp pbmac@pbmac-server $ cat tmp test2.sh test.sh tmp This message will not be displayed
The source Command
The source command is a shell built-in command which is used to read and execute the content of a file (generally a set of commands), passed as an argument in the current shell script. After taking the content of the specified files, the command passes it to the TCL interpreter as a text script which then gets executed. If any arguments are supplied, they become the positional parameters when filename is executed. Otherwise, the positional parameters remain unchanged. The entries in $PATH are used to find the directory containing FILENAME, however if the file is not present in $PATH it will search the file in the current directory. The source command has no option and the argument is the file only.
source FILENAME [arguments]
Using the source command is very similar to writing a shell script, but there is no requirement for a shebang line, and the file does NOT have to be set to executable. If there is a file that has the following two lines:
pbmac@pbmac-server $ cat test-3.txt ls cal
Then to source the file:
"How to use positional parameters" by Vivek Gite is licensed under CC BY-NC 3.0
"exec command in Linux with examples" by anindo_7, Geeks for Geeks is licensed under CC BY-SA 4.0
"source command in Linux with Examples" by Suraj1994, Geeks for Geeks is licensed under CC BY-SA 4.0