Mini completion of the bash tutorial
This commit is contained in:
parent
61a9aed48b
commit
856bab763d
137
CCNA/readme.md
137
CCNA/readme.md
|
@ -293,6 +293,143 @@ exit
|
||||||
waldek@helloworld:~$
|
waldek@helloworld:~$
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Using variables to store the output of command
|
||||||
|
|
||||||
|
Bash only really knows *characters*, both for sending and receiving.
|
||||||
|
We can temporarily store the output of a command using variables.
|
||||||
|
The syntax is a bit tricky at first but quickly becomes quite natural.
|
||||||
|
We can try this out on the command line.
|
||||||
|
Next we'll write a small script to leverage the power of variables and pipes.
|
||||||
|
|
||||||
|
```
|
||||||
|
waldek@metal:~$ grep $USER /etc/passwd
|
||||||
|
waldek:x:1000:1000:waldek,,,:/home/local/waldek:/bin/zsh
|
||||||
|
waldek@metal:~$ my_name=$(grep $USER /etc/passwd)
|
||||||
|
waldek@metal:~$ echo $my_name
|
||||||
|
waldek:x:1000:1000:waldek,,,:/home/local/waldek:/bin/zsh
|
||||||
|
waldek@metal:~$
|
||||||
|
```
|
||||||
|
|
||||||
|
A little but more complicated.
|
||||||
|
|
||||||
|
```
|
||||||
|
waldek@metal:~$ count=$(grep "/home" /etc/passwd | wc -l)
|
||||||
|
waldek@metal:~$ msg="there are $count users on this machine"
|
||||||
|
waldek@metal:~$ echo $msg
|
||||||
|
there are 4 users on this machine
|
||||||
|
waldek@metal:~$
|
||||||
|
```
|
||||||
|
|
||||||
|
Now a small script.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
FULLNAME="wouter gordts"
|
||||||
|
CITY="Brussels"
|
||||||
|
|
||||||
|
echo "this script was written by $FULLNAME in $CITY"
|
||||||
|
|
||||||
|
IP=$(ip a | grep -v "127.0.0.1" | grep -o -E "[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\/[[:digit:]]{1,3}")
|
||||||
|
TIME=$(date +%X)
|
||||||
|
DAY=$(date +%A)
|
||||||
|
YEAR=$(date +%Y)
|
||||||
|
|
||||||
|
echo "this computer has $IP as IP address"
|
||||||
|
echo "it is $TIME and we are a $DAY in $YEAR"
|
||||||
|
```
|
||||||
|
|
||||||
|
Which if we run it gives us the following output.
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
waldek@metal:~$ bash test.sh
|
||||||
|
this script was written by wouter gordts in Brussels
|
||||||
|
this computer has 10.1.12.53/24 as IP address
|
||||||
|
it is 02:17:02 PM and we are a Tuesday in 2022
|
||||||
|
waldek@metal:~$
|
||||||
|
```
|
||||||
|
|
||||||
|
### Getting input into the script
|
||||||
|
|
||||||
|
#### With `read`
|
||||||
|
|
||||||
|
Observe the output of the following *program*.
|
||||||
|
It's not really complicated but it will demonstrate we can do arithmetic in bash scripts as well!
|
||||||
|
|
||||||
|
```
|
||||||
|
waldek@metal:~$ bash test.sh
|
||||||
|
In which year where you born?
|
||||||
|
1986
|
||||||
|
your are probably around 36...
|
||||||
|
waldek@metal:~$
|
||||||
|
```
|
||||||
|
|
||||||
|
The output above was generated with the following code.
|
||||||
|
The **two** things to notice are the `read year` line and the `$(( $this_year - $year ))`.
|
||||||
|
The former offers the possibility to **prompt** the user for input, the latter performs a mathematical calculation with two numbers.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "In which year where you born?"
|
||||||
|
read year
|
||||||
|
this_year=$(date +%Y)
|
||||||
|
echo "your are probably around $(( $this_year - $year ))..."
|
||||||
|
waldek@metal:~$
|
||||||
|
```
|
||||||
|
|
||||||
|
#### With command line arguments
|
||||||
|
|
||||||
|
We can create a similar behaviour but with command line arguments.
|
||||||
|
By doing so we don't have to answer any questions the script poses at runtime.
|
||||||
|
If we create a script that will run for a long time, it doesn't require any interaction mid way!
|
||||||
|
All necessary information is supplied by at execution time.
|
||||||
|
|
||||||
|
```
|
||||||
|
waldek@metal:~$ bash test.sh 1986
|
||||||
|
your are probably around 36...
|
||||||
|
waldek@metal:~$
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
year=$1
|
||||||
|
this_year=$(date +%Y)
|
||||||
|
echo "your are probably around $(( $this_year - $year ))..."
|
||||||
|
```
|
||||||
|
|
||||||
|
The magic behind is the `$1` variable.
|
||||||
|
This variable represents the *first* argument on the command line.
|
||||||
|
Knowing this, what would `$4` mean?
|
||||||
|
Indeed, the *fourth* argument...
|
||||||
|
|
||||||
|
# Coding Challenge - output the exact output below
|
||||||
|
|
||||||
|
```
|
||||||
|
waldek@metal:~$ bash test.sh hello world 1986 35 foo bar linux rulez...
|
||||||
|
hello waldek, my name is test.sh
|
||||||
|
you supplied 8 arguments on the command line...
|
||||||
|
here are all of them on one line: hello world 1986 35 foo bar linux rulez...
|
||||||
|
waldek@metal:~$
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Spoiler warning!</summary>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "hello $USER, my name is $0"
|
||||||
|
echo "you supplied $# arguments on the command line..."
|
||||||
|
echo "here are all of them on one line: $@"
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### What is a Bash Script - What are they, how do they work and how to run them.
|
### What is a Bash Script - What are they, how do they work and how to run them.
|
||||||
|
|
||||||
[Ryan's tutorials](https://ryanstutorials.net/bash-scripting-tutorial/bash-script.php)
|
[Ryan's tutorials](https://ryanstutorials.net/bash-scripting-tutorial/bash-script.php)
|
||||||
|
|
Loading…
Reference in New Issue