Autosave: 2023-02-03 14:51:52
This commit is contained in:
parent
bd3bd0f284
commit
e982d1a6ab
5 changed files with 147 additions and 23 deletions
|
@ -14,12 +14,12 @@ Below are the main forms of expansion and substitution:
|
|||
| Representation | Name |
|
||||
| -------------- | -------------------- |
|
||||
| `~` . | Tilde expansion |
|
||||
| `{...}` | Brace expansion |
|
||||
| `{..}` | Brace expansion |
|
||||
| `${...}` | Parameter expansion |
|
||||
| `$(...)` | Command substitution |
|
||||
| `$((...))` | Arithmetic expansion |
|
||||
|
||||
## Brace expansion
|
||||
## Brace expansion: `{..}`
|
||||
|
||||
Brace expansion is for changing a smaller part of a greater whole programmatically. This is best understood by looking at examples:
|
||||
|
||||
|
@ -44,7 +44,7 @@ echo {a...c}
|
|||
a b c
|
||||
```
|
||||
|
||||
We can also set sequences. If we wanted to count to twenty in intervals of two:
|
||||
We can also set sequences. If we wanted to count to twenty in intervals of two
|
||||
|
||||
```
|
||||
echo {1..20..2}
|
||||
|
@ -53,9 +53,9 @@ echo {1..20..2}
|
|||
|
||||
> Note that we type _two_ dots **not** an elipsis
|
||||
|
||||
## Example use case
|
||||
### Example use case
|
||||
|
||||
We might use brace expansion to generate sequential file names, eg.
|
||||
We might use brace expansion to generate sequential file names using a pre-defined naming scheme, eg.
|
||||
|
||||
```
|
||||
touch file_{01..12}{a..d}
|
||||
|
@ -69,6 +69,28 @@ file_02a
|
|||
file_02b
|
||||
...
|
||||
file_12d
|
||||
|
||||
|
||||
```
|
||||
|
||||
The syntax here basically means: for each of the elements in the first list, run the second list against them.
|
||||
|
||||
## Parameter expansion: `${...}`
|
||||
|
||||
We use most frequently for returning the value of stored [variables](/Programming_Languages/Shell/Variables_and_data_types.md). Techically we do not have to use the braces, we can retrieve with just `$var` however it's better to use them to minimise interpretation fuck-ups which happen a lot.
|
||||
|
||||
When the braces are used, this allows us to transform the values before they are returned such as only returning from the 6th character: `${var:6}`.
|
||||
|
||||
## Command substition: `$(...)`
|
||||
|
||||
Command substitution (circle-brackets) allows us to put the output of one command inside another. Bash runs the bracketed command in a [sub-shell](/Programming_Languages/Shell/Shell_sessions.md) and then returns it to the main user shell.
|
||||
|
||||
For example:
|
||||
|
||||
```bash
|
||||
echo "The current directory is $(pwd)."
|
||||
```
|
||||
|
||||
## Arithemtic expansion: `$((...))`
|
||||
|
||||
We use arithmetic expansion when we want to calculate numerical values
|
||||
|
||||
See [Working with numbers in Bash](/Programming_Languages/Shell/Working_with_numbers_in_Bash.md) for more.
|
||||
|
|
31
Programming_Languages/Shell/Quote_marks.md
Normal file
31
Programming_Languages/Shell/Quote_marks.md
Normal file
|
@ -0,0 +1,31 @@
|
|||
---
|
||||
categories:
|
||||
- Programming Languages
|
||||
tags:
|
||||
- shell
|
||||
---
|
||||
|
||||
# Quote marks
|
||||
|
||||
## Single-quotes (aka _strong_ quotes)
|
||||
|
||||
Bash will interpret everything in the string as a literal:
|
||||
|
||||
```bash
|
||||
echo 'The directory is $(pwd)'
|
||||
# The directory is $(pwd)
|
||||
```
|
||||
|
||||
## Double-quotes
|
||||
|
||||
Bash will interpret strings as strings but will interpret expansions and substitutions as executable processes:
|
||||
|
||||
```bash
|
||||
$pointlessVar='directory'
|
||||
|
||||
echo "The ${pointlessVar}"
|
||||
|
||||
# The directory is /home/thomas
|
||||
```
|
||||
|
||||
It is therefore generally best to use double quotes whenever we wish to return mixed values.
|
12
Programming_Languages/Shell/Test.md
Normal file
12
Programming_Languages/Shell/Test.md
Normal file
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
categories:
|
||||
- Programming Languages
|
||||
tags:
|
||||
- shell
|
||||
---
|
||||
|
||||
# Test in bash
|
||||
|
||||
`test` is a built-in command that is used to compare values or determine whether something is the case.
|
||||
|
||||
When we run a test the result we get back is a return status of a `0` or a `1`
|
|
@ -38,22 +38,6 @@ echo ${PRIM_VAR_BOOL} # true
|
|||
- there is no compunction to use capitals for variables but it can be helpful to distinguish custom variables from program variables (see below)
|
||||
- quotation marks at declaration are also not strictly necessary however they can help avoid bugs. Also serves as a reminder that every type is basically a string at the end of the day
|
||||
|
||||
### Variables that hold references to programs
|
||||
|
||||
We can store a reference to a bash program with slightly different syntax:
|
||||
|
||||
```bash
|
||||
user="$(whoami)"
|
||||
```
|
||||
|
||||
When we want to invoke a program variable we don't need to use brackets:
|
||||
|
||||
```bash
|
||||
echo $user # thomasbishop
|
||||
```
|
||||
|
||||
> Note that when we declare anything in bash (any time `=` is used) we **do not use spaces!** If you do, the variable will not be set.
|
||||
|
||||
## Declarations
|
||||
|
||||
You can achieve a sort of typing through the `declare` keyword, although bear in mind this is not enforced and you do not have to use it.
|
||||
|
|
75
Programming_Languages/Shell/Working_with_numbers_in_Bash.md
Normal file
75
Programming_Languages/Shell/Working_with_numbers_in_Bash.md
Normal file
|
@ -0,0 +1,75 @@
|
|||
---
|
||||
categories:
|
||||
- Programming Languages
|
||||
tags:
|
||||
- shell
|
||||
---
|
||||
|
||||
# Working with numbers in Bash
|
||||
|
||||
We distinguish:
|
||||
|
||||
- **arithmetic expansion** `$(( ))`
|
||||
- returns the result of literal numbers that can then be stored in a variable
|
||||
- **artihmetic evaluation** `(( ))`
|
||||
- perform calculations on _existing_ variables
|
||||
|
||||
An example of expansion:
|
||||
|
||||
```bash
|
||||
a=3
|
||||
((a += 3))
|
||||
echo $a
|
||||
# 6
|
||||
((a++))
|
||||
# 7
|
||||
```
|
||||
|
||||
> Note: we do not use a dollar-sign when referring to variables within arithmetic evaluation, there is no need. If we do, we get an error. This is because we are using an [expansion](/Programming_Languages/Shell/Expansions_and_substitutions.md), therefore the variables are already being interpreted as variables.
|
||||
|
||||
## Declaring variables as integers
|
||||
|
||||
It is good practice to safeguard against Bash treating numbers as strings to declare them as integers in addition to using arithmetic evaluation, e.g:
|
||||
|
||||
```bash
|
||||
declare -i b=3
|
||||
```
|
||||
|
||||
Whilst this isn't a strict type, it means we can do this:
|
||||
|
||||
```bash
|
||||
b=$b+4
|
||||
echo b
|
||||
# 7
|
||||
```
|
||||
|
||||
Without getting `3+4` in return
|
||||
|
||||
## No decimals in bash
|
||||
|
||||
Bash does not support decimal calculations natively. This is what you'd get for example:
|
||||
|
||||
```bash
|
||||
echo $(( 1/3 ))
|
||||
# 0 (not 0.33)
|
||||
```
|
||||
|
||||
So work with decimals you should use `awk` or `bc` ("basic calculations").
|
||||
|
||||
Example of using `bc`:
|
||||
|
||||
```bash
|
||||
declare -i c=1
|
||||
declare -i d=3
|
||||
e=$(echo "scale=3; $c/$d" | bc)
|
||||
# 0.333
|
||||
```
|
||||
|
||||
## Random numbers
|
||||
|
||||
Generate a pseudo-random number between 1 and 20:
|
||||
|
||||
```bash
|
||||
echo $(( 1 + RANDOM % 10))
|
||||
# 18
|
||||
```
|
Loading…
Add table
Reference in a new issue