Bash Scripting: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
= 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 = | |||
* 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 = | |||
* "$@" 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 = | |||
* -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 = | |||
* 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 = | |||
* 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 = | |||
* The length of an array can be obtained via "${#array[@]}". | * 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, | * 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 = | |||
* 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 = | |||
* "<<<" can be used to feed a string as standard input. | * "<<<" 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. | * 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: | * 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;