54 lines
5.4 KiB
Markdown
54 lines
5.4 KiB
Markdown
## Marking a script as executable
|
||
Sometimes, you may need to mark a script as an executable to run it. On Linux, this can be accomplished by `chmod +x [FILE]`, where `[FILE]` is the file you want to mark as executable. To unmark a file as executable, use `chmod -x`
|
||
|
||
## The Shebang
|
||
There are various shells with their own language syntax (`sh`, `bash`, `fish`, etc). Therefore, more complicated scripts will indicate a particular shell by specifying the absolute path to the interpreter as the first line, prefixed by `#!` like this:
|
||
```sh
|
||
#!/bin/sh
|
||
echo "Hello, World!"
|
||
```
|
||
`#!/bin/sh` means that this script can be executed by the binary located at `/bin/sh`, and so the reader knows this is a `sh`(ell) script.
|
||
|
||
## Variables
|
||
In bash, variable assignment is done with the `=` operator. Variables are conventionally named with `SCREAMING_SNAKE_CASE`, and can be accessed by prefixing the variable name with a dollar sign (`$`):
|
||
```bash
|
||
#!/bin/bash
|
||
# There may not be any spaces used during assignment, `A = B` means something different than `A=B`
|
||
# Assignment is done with the equal sign (=) operator:
|
||
MY_VARIABLE="Hi Mom!"
|
||
echo $MY_VARIABLE
|
||
```
|
||
|
||
## Quotes
|
||
In Bash, different styles of quotes (or a backtick) mean different things:
|
||
|
||
| Quote | Description |
|
||
| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||
| Single Quotes (') | Enclosing characters in single quotes (`'`) preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash. Commands in single quotes will not be evaluated. |
|
||
| Double Quotes (") | Enclosing characters in double quotes (`"`) preserves the literal value of all characters within the quotes, with the exception of `$`, \`, `\`, and, when history expansion is enabled, `!`. The characters `$` and \‘ retain their special meaning within double quotes. A double quote may be quoted within double quotes by preceding it with a backslash. When the shell is in POSIX mode (see Bash POSIX Mode), the ‘!’ has no special meaning within double quotes, even when history expansion is enabled.<br><br>Within double quotes, substitution can be done using `$()`.<br><br>```<br>"Output of ls: $(ls)"<br>``` |
|
||
| Backtick (\`) | While a backtick is not technically a quotation mark, it's included here. Backticks are used to substitute the output a command in a location:<br>```<br>sudo chown `id -u` /some/directory<br>``` |
|
||
## Conditionals
|
||
A basic if statement in bash looks like this:
|
||
```
|
||
if somecommand; then
|
||
# The code here will be run if somecommand has an exit code of 0
|
||
fi
|
||
```
|
||
Note that the if statement is terminated by `fi`. This is fairly standard throughout bash scripting, where the blocks are closed with the reverse text used to open them.
|
||
|
||
You can also make use of `else` for more complex conditional logic:
|
||
```
|
||
if somecommand; then
|
||
# If the command succeeds, run this code
|
||
else
|
||
# If the command fails, run this code.
|
||
fi
|
||
```
|
||
|
||
## Commands
|
||
| Command | Description |
|
||
| ----------------- | ---------------------------------------------------------------------------------------------- |
|
||
| `exit [CODE]` | Make the script process exit, where `[CODE]` is the exit code the process will terminate with. |
|
||
| `read [VARIABLE]` | Read user input into the provided variable. |
|
||
| `test CONDITION]` | |
|