Bash Scripting: Difference between revisions

From Elvanör's Technical Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
== Command Line arguments conventions ==
= Command Line arguments conventions =


* Long options are represented by two starting hyphens. Long options and short options should be provided before any other arguments.
* Long options are represented by two starting hyphens. Long options and short options should be provided before any other arguments.


== String Manipulations ==
= String Manipulations =


* To replace all substrings by another, use the following syntax:
* To replace all substrings by another, use the following syntax:
Line 17: Line 17:
echo ${stringZ/%abc/XYZ}
echo ${stringZ/%abc/XYZ}


== Special Symbols ==
= Special Symbols =


* "$@" expands to all command-line parameters.
* "$@" expands to all command-line parameters.
Line 23: Line 23:
* \ before a newline actually escapes the newline. Thus, you can create multi-line strings or commands just by terminating a line with the \ symbol.
* \ before a newline actually escapes the newline. Thus, you can create multi-line strings or commands just by terminating a line with the \ symbol.
* Positional parameters can be accessed with $1, $2 etc. You only need brackets {} after the 9th parameter ("${10}").
* Positional parameters can be accessed with $1, $2 etc. You only need brackets {} after the 9th parameter ("${10}").
== Tests ==
 
= Tests =


* -n checks if a string is not empty, -z if it is empty.
* -n checks if a string is not empty, -z if it is empty.
* [ is not a keyword but a command (a program!). It is recommended to use [[ in tests which is a keyword.
* [ is not a keyword but a command (a program!). It is recommended to use [[ in tests which is a keyword.
* Note that <nowiki>[[ myVariable ]]</nowiki> will output true even if myVariable is equal to 0. The test must be explicit.
* Note that <nowiki>[[ myVariable ]]</nowiki> will output true even if myVariable is equal to 0. The test must be explicit.
* After [[ and ]] there must be a space character.


== Quoting ==
= Quoting =


* If you need to expand special characters such as *, you cannot quote.
* If you need to expand special characters such as *, you cannot quote.
Line 35: Line 37:
* If you write \ and then a newline, the newline will be escaped which allows you to write multiline strings.
* If you write \ and then a newline, the newline will be escaped which allows you to write multiline strings.


== Expanding ==
= Expanding =


* The shell expands stuff like aaa* as soon as it sees this expression. Thus if you define a custom function myFunc(), and call it like that:
* The shell expands stuff like aaa* as soon as it sees this expression. Thus if you define a custom function myFunc(), and call it like that:
Line 43: Line 45:
If there are two files stuff1 and stuff2 in the current directory, $1 and $2 will be set to stuff1 and stuff2. Even if they are quoted ("$1", "$2") since the expansion took place before.
If there are two files stuff1 and stuff2 in the current directory, $1 and $2 will be set to stuff1 and stuff2. Even if they are quoted ("$1", "$2") since the expansion took place before.


== Arrays ==
= Arrays =


* The length of an array can be obtained via "${#array[@]}".
* The length of an array can be obtained via "${#array[@]}".


== Arithmetic context ==
= Arithmetic context =


* When within double parenthesis (( )) or after the '''let''' keyword, Bash enters arithmetic context. You don't need to quote variables or precede them with a $ sign. Tests also work as expected, eg more like in their C counterpart. For example,  
* When within double parenthesis (( )) or after the '''let''' keyword, Bash enters arithmetic context. You don't need to quote variables or precede them with a $ sign. Tests also work as expected, eg more like in their C counterpart. For example,  
Line 57: Line 59:
* Arithmetic context also applies when in an array [].
* Arithmetic context also applies when in an array [].


== Subshell ==
= Subshell =


* To launch a command in a subshell, use (). It's usually used with $(), since that allows a variable to capture stdout of the launched process. Note that using backticks is deprecated.
* To launch a command in a subshell, use (). It's usually used with $(), since that allows a variable to capture stdout of the launched process. Note that using backticks is deprecated.


== Standard Input / Output ==
= Standard Input / Output =


* "<<<" can be used to feed a string as standard input.
* "<<<" can be used to feed a string as standard input.


== Command Line Utilities ==
= Command Line Utilities =


* sdiff -s will generate a formatted output of the differences between two files. Very useful.
* sdiff -s will generate a formatted output of the differences between two files. Very useful.


== sed ==
= sed =


* sed is a stream editor. It is extremely powerful and can do almost everything under the sun. It can:
* sed is a stream editor. It is extremely powerful and can do almost everything under the sun. It can:

Revision as of 13:01, 9 December 2008

Command Line arguments conventions

  • Long options are represented by two starting hyphens. Long options and short options should be provided before any other arguments.

String Manipulations

  • To replace all substrings by another, use the following syntax:
echo ${stringZ//abc/xyz}

This would replace all occurences of abc in stringZ by xyz. The following replaces only the first match:

echo ${stringZ/abc/xyz}

To replace something at the end of a string, use:

echo ${stringZ/%abc/XYZ}

Special Symbols

  • "$@" expands to all command-line parameters.
  • "\n" in a variable does not necessarily works as expected. Eg, no newline is created.
  • \ before a newline actually escapes the newline. Thus, you can create multi-line strings or commands just by terminating a line with the \ symbol.
  • Positional parameters can be accessed with $1, $2 etc. You only need brackets {} after the 9th parameter ("${10}").

Tests

  • -n checks if a string is not empty, -z if it is empty.
  • [ is not a keyword but a command (a program!). It is recommended to use [[ in tests which is a keyword.
  • Note that [[ myVariable ]] will output true even if myVariable is equal to 0. The test must be explicit.
  • After and there must be a space character.

Quoting

  • If you need to expand special characters such as *, you cannot quote.
  • Use single quotes rather than double quotes, especially in sed. If you use double quotes, the \ itself won't be taken as a \ for escaping, thus causing problems.
  • If you write \ and then a newline, the newline will be escaped which allows you to write multiline strings.

Expanding

  • The shell expands stuff like aaa* as soon as it sees this expression. Thus if you define a custom function myFunc(), and call it like that:
myFunc stuff*

If there are two files stuff1 and stuff2 in the current directory, $1 and $2 will be set to stuff1 and stuff2. Even if they are quoted ("$1", "$2") since the expansion took place before.

Arrays

  • The length of an array can be obtained via "${#array[@]}".

Arithmetic context

  • When within double parenthesis (( )) or after the let keyword, Bash enters arithmetic context. You don't need to quote variables or precede them with a $ sign. Tests also work as expected, eg more like in their C counterpart. For example,
if (( myVariable )) 

will return false if myVariable is equal to 0.

  • Arithmetic context also applies when in an array [].

Subshell

  • To launch a command in a subshell, use (). It's usually used with $(), since that allows a variable to capture stdout of the launched process. Note that using backticks is deprecated.

Standard Input / Output

  • "<<<" can be used to feed a string as standard input.

Command Line Utilities

  • sdiff -s will generate a formatted output of the differences between two files. Very useful.

sed

  • sed is a stream editor. It is extremely powerful and can do almost everything under the sun. It can:
    • delete a line with command d;
    • append with command a;
    • use multiline strings if needed, with the standard Bash mechanism;
    • use several replacements on one line, adding the option -e to all changes;