mirror of
https://codeberg.org/Mo8it/How_To_Linux.git
synced 2024-11-22 06:28:02 +00:00
Improve and plan rest of content of day 2
This commit is contained in:
parent
d92f748fe7
commit
0f0578ca26
4 changed files with 94 additions and 40 deletions
|
@ -9,6 +9,7 @@
|
||||||
- [Tasks](day_1/tasks.md)
|
- [Tasks](day_1/tasks.md)
|
||||||
- [Day 2](day_2/README.md)
|
- [Day 2](day_2/README.md)
|
||||||
- [Shell glue](day_2/glue.md)
|
- [Shell glue](day_2/glue.md)
|
||||||
|
- [Shell scripting](day_2/shell_scripting.md)
|
||||||
- [Tasks](day_2/tasks.md)
|
- [Tasks](day_2/tasks.md)
|
||||||
- [Day 3](day_3/README.md)
|
- [Day 3](day_3/README.md)
|
||||||
- [Notes](day_3/notes.md)
|
- [Notes](day_3/notes.md)
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
# Day 2
|
# Day 2
|
||||||
|
|
||||||
Coming soon...
|
In this chapter, we will learn how to glue commands together to benefit from their modularity. Later, we will write our own shell scripts to achieve some automation.
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# Shell glue
|
# Shell glue
|
||||||
|
|
||||||
When you run something in the terminal, then you are interacting with the so called `shell`.
|
When you run something in the terminal, then you are interacting with the so called _shell_.
|
||||||
|
|
||||||
The default shell on almost all Linux systems is `bash`. (We will learn about the `fish` shell later)
|
The default shell on almost all Linux systems is `bash`. (We will learn about the `fish` shell later 🐠)
|
||||||
|
|
||||||
The shell has the power to glue commands together to make the impossible possible! Lets use some gluing magic!
|
The shell has the power to glue commands together to make the impossible possible! Lets use some gluing magic!
|
||||||
|
|
||||||
|
@ -28,18 +28,18 @@ Lets count the number of lines of the html file of the homepage of this book:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ curl -s https://how-to-linux.mo8it.xyz | wc -l
|
$ curl -s https://how-to-linux.mo8it.xyz | wc -l
|
||||||
201
|
220
|
||||||
```
|
```
|
||||||
|
|
||||||
The option `-s` tells `curl` to be silent and not show progress information.
|
The option `-s` tells `curl` to be silent and not show progress information.
|
||||||
|
|
||||||
You can see that `wc` did count the number of lines. We did just combine two completely different tools with some pipes glue!
|
You can see that `wc` did count the number of lines. We did just combine two completely different tools with some pipes glue!
|
||||||
|
|
||||||
How about counting the number times the word "Linux" was mentioned on the homepage?
|
How about counting the number of lines that contain the word "Linux" on the homepage?
|
||||||
|
|
||||||
To do so, we will add a new pipe inbetween!
|
To do so, we will add a new pipe inbetween!
|
||||||
|
|
||||||
`grep` is a command that searches for matches of a specified pattern. Each match is printed in a new line.
|
`grep` is a command that searches for matches of a specified pattern. Each line with a match is printed in a new line.
|
||||||
|
|
||||||
To demonstrate `grep`, here is an usage example:
|
To demonstrate `grep`, here is an usage example:
|
||||||
|
|
||||||
|
@ -55,14 +55,14 @@ Back to the main example:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ curl -s https://how-to-linux.mo8it.xyz | grep "Linux" | wc -l
|
$ curl -s https://how-to-linux.mo8it.xyz | grep "Linux" | wc -l
|
||||||
6
|
7
|
||||||
```
|
```
|
||||||
|
|
||||||
You can see that you can use multiple pipes. This allows for almost infinite combinations!
|
You can see that you can use multiple pipes. This allows for almost infinite combinations!
|
||||||
|
|
||||||
Being able to combine commands is the reason why many commands are simple. They do one thing and do it well! To do more, combine them!
|
Being able to combine commands is the reason why many commands are simple. They do one thing and do it well! To do more, combine them!
|
||||||
|
|
||||||
This is much more flexible and powerful that a program that tries to do a lot of things.
|
This is much more flexible and powerful than a program that tries to do a lot of things.
|
||||||
|
|
||||||
## Input, output
|
## Input, output
|
||||||
|
|
||||||
|
@ -74,24 +74,24 @@ The standard output has the number 1 while the standard error has the number 2.
|
||||||
|
|
||||||
Normal output is sent to the standard output. Errors (and sometimes output that is not very important) are sent to the standard error.
|
Normal output is sent to the standard output. Errors (and sometimes output that is not very important) are sent to the standard error.
|
||||||
|
|
||||||
You can redirect the standard output or the standard error to a _stream_. Normally you will redirect the output to a file. Other stream forms are not relevant for now.
|
You can redirect the standard output or the standard error to a file!
|
||||||
|
|
||||||
## Redirections
|
## Redirections
|
||||||
|
|
||||||
Lets see how you can redirect the output of commands to a file.
|
Lets see how you can redirect the output of commands to a file.
|
||||||
|
|
||||||
If you just run `curl -s https://how-to-linux.mo8it.xyz`, you will the html file printed in the terminal. Lets redirect the output to a html file on your disk:
|
If you just run `curl -s https://how-to-linux.mo8it.xyz`, you will see the html file printed to the terminal. Lets redirect the output to a html file on your disk:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ curl -s https://how-to-linux.mo8it.xyz > how-to-linux.html
|
$ curl -s https://how-to-linux.mo8it.xyz > how-to-linux.html
|
||||||
```
|
```
|
||||||
|
|
||||||
Now view the content of the new file how-to-linux.html. You will be able to see the same output from the terminal without redirection.
|
Now view the content of the new file `how-to-linux.html`. You will see the same output from the terminal without redirection.
|
||||||
|
|
||||||
Now try this command:
|
Now try this command:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ curl https://not-existent-site.mo8it.xyz > test.html
|
$ curl https://non-existent-site.mo8it.xyz > test.html
|
||||||
curl: (60) SSL certificate problem: self-signed certificate
|
curl: (60) SSL certificate problem: self-signed certificate
|
||||||
More details here: https://curl.se/docs/sslcerts.html
|
More details here: https://curl.se/docs/sslcerts.html
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ You will see that the file is empty since `curl` did not find a page to show as
|
||||||
If you are using this command in a script, then it might be wise to redirect the error to a log file:
|
If you are using this command in a script, then it might be wise to redirect the error to a log file:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ curl https://not-existent-site.mo8it.xyz 2> curl.log
|
$ curl https://non-existent-site.mo8it.xyz 2> curl.log
|
||||||
$ cat curl.log
|
$ cat curl.log
|
||||||
curl: (60) SSL certificate problem: self-signed certificate
|
curl: (60) SSL certificate problem: self-signed certificate
|
||||||
More details here: https://curl.se/docs/sslcerts.html
|
More details here: https://curl.se/docs/sslcerts.html
|
||||||
|
@ -123,30 +123,3 @@ Did you notice the number 2 before the redirection symbol `2>`?
|
||||||
The last section did mention that the number of the standard error is 2. Therefore, 2 has to be specified to redirect the errors.
|
The last section did mention that the number of the standard error is 2. Therefore, 2 has to be specified to redirect the errors.
|
||||||
|
|
||||||
If you don't specify a number, then it is equivalent to 1 which stands for the standard output. This means that `>` is equivalent to `1>`.
|
If you don't specify a number, then it is equivalent to 1 which stands for the standard output. This means that `>` is equivalent to `1>`.
|
||||||
|
|
||||||
## Bash scripts
|
|
||||||
|
|
||||||
Lets write our first Bash script (also for some more demonstration of the two outputs):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
#!/usr/bin/bash
|
|
||||||
|
|
||||||
echo "What is your favorite operating system after reading this book?"
|
|
||||||
echo "1. Linux"
|
|
||||||
echo "2. Windows"
|
|
||||||
echo "3. Mac"
|
|
||||||
|
|
||||||
echo -n "Enter a number: "
|
|
||||||
read ANSWER
|
|
||||||
|
|
||||||
if [ "$ANSWER" == "1" ]
|
|
||||||
then
|
|
||||||
echo "Good choice!"
|
|
||||||
else
|
|
||||||
echo "Nah, that can't be right! It must be an error!" > /dev/stderr
|
|
||||||
fi
|
|
||||||
```
|
|
||||||
|
|
||||||
Copy this code into a file called `which-os.sh`.
|
|
||||||
|
|
||||||
Now run `chmod +x which-os.sh`. Then run `./which-os.sh`.
|
|
||||||
|
|
80
src/day_2/shell_scripting.md
Normal file
80
src/day_2/shell_scripting.md
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
# Shell scripting
|
||||||
|
|
||||||
|
Task automation requires multiple instructions that have to run on demand. To combine multiple instructions, we need to write a shell script.
|
||||||
|
|
||||||
|
Since `bash` is the default shell on most Linux distributions, we learn bash scripting.
|
||||||
|
|
||||||
|
## Bash scripts
|
||||||
|
|
||||||
|
Lets write our first Bash script (also for some more demonstration of the two output forms):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
echo "What is your favorite operating system after reading this book?"
|
||||||
|
echo "1. Linux"
|
||||||
|
echo "2. Windows"
|
||||||
|
echo "3. Mac"
|
||||||
|
|
||||||
|
echo -n "Enter a number: "
|
||||||
|
read ANSWER
|
||||||
|
|
||||||
|
if [ "$ANSWER" == "1" ]
|
||||||
|
then
|
||||||
|
echo "Good choice!"
|
||||||
|
else
|
||||||
|
echo "Nah, that can't be right! It must be an error!" > /dev/stderr
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
Copy this code into a file called `which-os.sh`.
|
||||||
|
|
||||||
|
Now run `chmod u+x which-os.sh`. Then run `./which-os.sh`.
|
||||||
|
|
||||||
|
<!-- TODO: Shebang -->
|
||||||
|
|
||||||
|
<!-- TODO: /usr/bin/python3 -->
|
||||||
|
|
||||||
|
<!-- TODO: Variables -->
|
||||||
|
|
||||||
|
<!-- TODO: $ -->
|
||||||
|
|
||||||
|
<!-- TODO: Escaping '$' -->
|
||||||
|
|
||||||
|
<!-- TODO: ${} -->
|
||||||
|
|
||||||
|
<!-- TODO: $() -->
|
||||||
|
|
||||||
|
<!-- TODO: read -->
|
||||||
|
|
||||||
|
<!-- TODO: if -->
|
||||||
|
|
||||||
|
<!-- TODO: test -->
|
||||||
|
|
||||||
|
<!-- TODO: if [ ! -f ] -->
|
||||||
|
|
||||||
|
<!-- TODO: else -->
|
||||||
|
|
||||||
|
<!-- TODO: else if -->
|
||||||
|
|
||||||
|
<!-- TODO: case -->
|
||||||
|
|
||||||
|
<!-- TODO: for -->
|
||||||
|
|
||||||
|
<!-- TODO: while -->
|
||||||
|
|
||||||
|
<!-- TODO: command | while read -->
|
||||||
|
|
||||||
|
<!-- TODO: math (( )) -->
|
||||||
|
|
||||||
|
<!-- TODO: Long command on multiple lines \ -->
|
||||||
|
|
||||||
|
<!-- TODO: Permissions -->
|
||||||
|
|
||||||
|
<!-- TODO: r,w,x -->
|
||||||
|
|
||||||
|
<!-- TODO: u,g,o -->
|
||||||
|
|
||||||
|
<!-- TODO: chmod codes -->
|
||||||
|
|
||||||
|
<!-- TODO: https://chmodcommand.com -->
|
Loading…
Reference in a new issue