全篇转载自 https://forum-zh.obsidian.md/t/topic/435
作者obsidian论坛名-yikelee 成雙醬,感谢作者无私分享!
_TheLinuxCommandsHandbook_
《TheLinuxCommandsHandbook》结合视频 https://www.youtube.com/watch?v=ZtqBQ68cfJc 看的
Command意义#
更快,自动化,在任何Linux上工作,有些工作的基本需求
系统-Unix和Windows#
绿色-开源
红色-闭源
黄色-混合
图片中的Linux只是类Unix,而不是真正的Unix
FreeSoftware,开源#
GNU与Linux
Linux只是一个操作系统内核而已,而GNU提供了大量的自由软件来丰富在其之上各种应用程序。
绝大多数基于Linux内核的操作系统使用了大量的GNU软件,包括了一个shell程序、工具、程序库、编译器及工具,还有许多其他程序
我们常说的Linux,准确地来讲,应该是叫“GNU/Linux”。虽然,我们没有为GNU和Linux的开发做出什么贡献,但是我们可以为GNU和Linux的宣传和应用做出微薄的努力,至少我们能够准确地去向其他人解释清楚GNU、Linux以及GNU/Linux之间的区别。让我们一起为GNU/Linux的推广贡献出自己的力量!
内核,用来连接硬件和软件的
TrueUNIX#
Unix一开始是收费的,后面出现Unix-like(类Unix),和Unix标准兼容。
Linux不是真正的Unix,而是类Unix。
Linux本身只是一个内核,连接硬件和软件
LinuxDistributions,Linux发行版(1000多种)
Linux内核是一些GUN工具,文档,包管理器,桌面环境窗口管理,和系统一些其他东西组成的一个系统
有开源的和不开源的,Linux(LinuxGUN)完全开源
shell#
windows(powershell)
把命令交给系统
terminal(最古老时是一个硬件)–屏幕+带键盘的物理设备,如今是一个软件
默认情况下,Ubuntu和大多数Linux发行版是bashshell,还有zsh
setup and installing#
如果有Mac或者其他Linux发行版,则不需要额外操作。(作者在Mac里装了Ubuntu虚拟机)
WindowsSubsystem#
wsl --install
默认是Ubuntu
The Linux Handbook(电子书内容)#
Linux 手册
Preface#
前言
The Linux Handbook follows the 80/20 rule: learn in 20% of the time the 80% of a topic.
Linux 手册遵循 80/20 规则:用 20% 的时间学习某个主题的 80%。
基本知识
卷001周紀一_起戊寅(前四〇三)尽壬子(前三六九)凡三十五年
公元前五世纪
《资治通鉴》起于公元前五世纪九〇年代的前四〇三年,止于公元后十世纪五〇年代的九五九年,共记载一千三百六十二年史迹。在本世纪(前五世纪)中,只有三年篇幅,但却发生晋国被赵、魏、韩三大家族瓜分的大事。司马光认为那是一个巨变,《资治通鉴》即从该年开始。
公元前五世纪九〇年代(前四〇三—前四〇一年) 战国时代
公元前五世纪> ◎ 晋阳之围。 ◎ 智姓家族覆亡。 ◎ 三家分晋。 ◎ 盗杀楚十六任王芈当。
虽然楚幽王(芈当)即位和春申君被杀发生在公元前238年(这已经是公元前三世纪了),但柏杨在这里列出它,是因为他认为这是“战国乱世”逻辑下的同类事件——即**“臣下篡权/血腥政变”的延续。
資治通鑑卷第一
朝散大夫右諫議大夫權御史中丞充理檢使上護軍賜紫金魚袋臣
司马光 奉敕编集
後 學 天 台
胡三省 音 註
周紀一 起著雍攝提格(戊寅),盡玄黓困敦(壬子),凡三十五年。
爾雅:太歲在甲曰閼逢,在乙曰旃zhān蒙,在丙曰柔兆,在丁曰強圉,在戊曰著雍,在己曰屠維,在庚曰上章,在辛曰重光,在壬曰玄黓yì,在癸曰昭陽,是為歲陽。在寅曰攝提格,在卯曰單閼,在辰曰執徐,在巳曰大荒落,在午曰敦牂,在未曰協洽,在申曰涒tūn灘,在酉曰作噩,在戌曰掩茂,在亥曰大淵獻,在子曰困敦,在丑曰赤奮若,是為歲名。周紀分註「起著雍攝提格」,起戊寅也。「盡玄黓困敦」,盡壬子也。閼,讀如字;史記作「焉」,於乾翻。著,陳如翻。雍,于容翻。黓,逸職翻。單閼,上音丹,又特連翻;下烏葛翻,又于連翻。牂,作郎翻。涒,吐魂翻。灘,吐丹翻。困敦,音頓。杜預 世族譜曰:周,黃帝之苗裔,姬姓。后稷之後,封于邰;及夏衰,稷子不窋zhú竄於西戎。至十二代孫太王,避狄遷岐;至孫文王受命,武王克商而有天下。自武王至平王凡十三世,自平王至威烈王又十八世,自威烈王至赧王又五世。張守節曰:因太王居周原,國號曰周。地理志云:右扶風美陽縣岐山西北中水鄉,周太王所邑。括地志云:故周城一名美陽城,在雍州武功縣西北二十五里。紀,理也,統理眾事而系之年月。溫公系年用春秋之法,因史、漢本紀而謂之紀。邰,湯來翻。夏,戶雅翻。窋,竹律翻。在雍,於用翻。
威烈王#
名午,考王之子。諡法:猛以剛果曰威;有功安民曰烈。沈約曰:諸複諡,有諡人,無諡法。
二十三年(戊寅,前四零三)#
战国开篇君主在位情况表(基准年:公元前403年)
| 君主 | 公元前403年位次 | 剩余在位年数 | 总在位年数 | 预计去世/退位年份 |
|---|---|---|---|---|
| 周威烈王 | 二十三年 | 1年 | 24年 | 公元前402年 |
| 魏文侯 | 四十四年 | 7年 | 50年 | 公元前396年 |
| 韩景侯 | 六年 | 3年 | 9年 | 公元前400年 |
| 赵烈侯 | 六年 | 3年 | 9年 | 公元前400年 |
| 秦简公 | 十二年 | 3年 | 15年 | 公元前400年 |
| 宋悼公 | 元年 | 7年 | 8年 | 公元前396年 |
| 齐康公 | 二年 | 14年 | 16年 | 公元前389年 |
| 楚声王 | 五年 | 1年 | 6年 | 公元前402年 |
| 燕湣公 | 三十一年 | 13年 | 44年 | 公元前390年 |
| 鲁穆公 | 七年 | 26年 | 33年 | 公元前377年 |
| 郑繻公 | 二十年 | 7年 | 27年 | 公元前396年 |
| 卫慎公 | 十二年 | 30年 | 42年 | 公元前373年 |
| 晋烈公 | 十九年 | 14年 | 33年 | 公元前389年 |
说明:齐康公在公元前386年被田和放逐,姜齐实际统治结束;郑繻公(郑公)于前396年被杀。
16-18
向bash脚本添加参数#
basic#
─ ~/shellTest ly@vmmin 10:37:24
╰─❯ cat ./16myscript_cls.sh
#!/bin/bash
echo "You entered the argument: $1,$2,$3, and $4."结果
╭─ ~/shellTest 16s ly@vmmin 10:37:18
╰─❯ ./16myscript_cls.sh Linux1 Linux2
You entered the argument: Linux1,Linux2,, and .示例1#
╭─ ~/shellTest ly@vmmin 10:41:45
╰─❯ cat ./16myscript_cls.sh
#!/bin/bash
ls -lh $1
#echo "You entered the argument: $1,$2,$3, and $4."
╭─ ~/shellTest ly@vmmin 10:41:28
╰─❯ ./16myscript_cls.sh /etc
total 792K
-rw-r--r-- 1 root root 3.0K May 25 2023 adduser.conf
-rw-r--r-- 1 root root 44 Dec 17 15:26 adjtime
-rw-r--r-- 1 root root 194 Dec 23 22:38 aliases
drwxr-xr-x 2 root root 4.0K Dec 23 22:38 alternatives
drwxr-xr-x 2 root root 4.0K Dec 17 15:24 apparmor
drwxr-xr-x 8 root root 4.0K Dec 17 15:25 apparmor.d
drwxr-xr-x 9 root root 4.0K Dec 17 15:30 apt
-rw-r----- 1 root daemon 144 Oct 16 2022 at.deny
-rw-r--r-- 1 root root 2.0K Mar 30 2024 bash.bashrc示例2#
#!/bin/bash
lines=$(ls -lh $1 | wc -l) #行计数
echo "You hava $(($lines-1)) objects in the $1 directory."
#$(($lines-1))这里用到了子shell
#echo "You entered the argument: $1,$2,$3, and $4."╭─ ~/shellTest ly@vmmin 10:48:06
╰─❯ ls -lh logfiles
total 12K
-rw-r--r-- 1 ly ly 0 Dec 22 23:07 a.log
-rw-r--r-- 1 ly ly 120 Dec 22 23:17 a.log.tar.gz
-rw-r--r-- 1 ly ly 0 Dec 22 23:07 b.log
-rw-r--r-- 1 ly ly 121 Dec 22 23:17 b.log.tar.gz
-rw-r--r-- 1 ly ly 0 Dec 22 23:07 c.log
-rw-r--r-- 1 ly ly 121 Dec 22 23:17 c.log.tar.gz
-rw-r--r-- 1 ly ly 0 Dec 22 23:15 xx.txt
-rw-r--r-- 1 ly ly 0 Dec 22 23:15 y.txt
╭─ ~/shellTest ly@vmmin 10:48:10
╰─❯ ./16myscript_cls.sh logfiles
You hava 8 objects in the logfiles directory.head,表示前十行,可以看出total这些被算作一行了,所以上面的shell中-1
12-15
functions 函数#
以update这个脚本为基础编改
作用
- 减少重复代码
#!/bin/bash
release_file=/etc/os-release
logfile=/var/log/updater.log
errorlog=/var/log/updater_errors.log
check_exit_status(){
if [ $? -ne 0 ]
then
echo "An error occured,please check the $errorlog file."
fi
}
if grep -q "Arch" $release_file
then
sudo pacman -Syu 1>>$logfile 2>>$errorlog
check_exit_status
fi
if grep -q "Ubuntu" $release_file || grep -q "Debian" $release_file
then
sudo apt update 1>>$logfile 2>>$errorlog
check_exit_status
#默认yes
sudo apt dist-upgrade -y 1>>$logfile 2>>$errorlog
check_exit_status
fiCaseStatements#
脚本#
╭─ ~/shellTest ly@vmmin 22:32:52
╰─❯ cat ./13myscript_cls.sh
#!/bin/bash
finished=0
while [ $finished -ne 1 ]
do
echo "What is your favorite Linux distribution?"
echo "1 - Arch"
echo "2 - CentOS"
echo "3 - Debian"
echo "4 - Mint"
echo "5 - Something else.."
echo "6 - exit"
read distro;
case $distro in
1) echo "Arch is xxx";;
2) echo "CentOS is xbxxx";;
3) echo "Debian is bbbxx";;
4) echo "Mint is xxxxsss";;
5) echo "Something els.xxxxx";;
6) finished=1
echo "now will exit"
;;
*) echo "you didn't enter an xxxx choice."
esac
done
echo "Thanks for using this script."脚本执行#
╭─ ~/shellTest ly@vmmin 22:32:11
╰─❯ ./13myscript_cls.sh
What is your favorite Linux distribution?
1 - Arch
2 - CentOS
3 - Debian
4 - Mint
5 - Something else..
6 - exit
3
Debian is bbbxx
What is your favorite Linux distribution?
1 - Arch
2 - CentOS
3 - Debian
4 - Mint
5 - Something else..
6 - exit
u
you didn't enter an xxxx choice.
What is your favorite Linux distribution?
1 - Arch
2 - CentOS
3 - Debian
4 - Mint
5 - Something else..
6 - exit
6
now will exit
Thanks for using this script. ScheduleJobs#
作用#
脚本在特定时间运行
07-10
WhileLoops#
范例#
#!/bin/bash
myvar=1
#小于或者等于10
while [ $myvar -le 10 ]
do
echo $myvar
myvar=$(( $myvar + 1 ))
sleep 0.5
done运行
╭─ ~/shellTest ≡ ly@vmmin 12:10:33
╰─❯ ./71myscript_cls.sh
1
2
3
4
5
6
7
8
9
10数字会每隔0.5s就输出一次
对于myvar=$(( $myvar + 1 )) ,$((expression))形式表示算数运算,而且其中的空格是可以省略的
范例2#
#!/bin/bash
while [ -f ~/testfile ]
do
echo "As of $(date),the test file exists."
sleep 5
done
echo "As of $(date), the test ....has gone missing."用来测试文件是否存在,运行前先新建一下文件touch ~/testfile
运行一会后把文件删除,如图
06ExitCode
意义#
用来确定代码是否执行成功
例子#
ls -l /misc
echo $? #输出2
ls -l ~
echo $? #输出0$?用来显示最近一个命令的状态,零表示成功,非零表示失败
#!/bin/bash
#这个例子之前,作者用 sudo apt remove htop 命令把htop删除了
package=htop
sudo apt install $package
echo "The exit code for ....is $?"安装完毕后显示返回0
另一个示例
#!/bin/bash
package=notexist
sudo apt install $package
echo "The exit code for ....is $?"
#执行后显示
#Reading package lists... Done
#Building dependency tree... Done
#Reading state information... Done
#E: Unable to locate package notexist
#The exit code for ....is 100配合if语句#
基本功能#
#!/bin/bash
package=htop
sudo apt install $package
if [ $? -eq 0 ]
then
echo "The installation of $package success..."
echo "new comman here:"
which $package
else
echo "$package failed ..."
fi 之前前作者用sudo apt remove htop又把htop删除了,不过其实不删除也是走的 echo "The installation of ....."这个分支
结果:
05If
在shell中,零为真,非零为假。
if then fi#
mynum=200
#[和]前后都要有空格
if [ $mynum -eq 200 ]
then
echo "The condition is true."
fi
编辑之后,按ctrl + O 保存文件
ctrl + T + Z 保持在后台,fg+回车 恢复
#!/bin/bash
mynum=200
#[和]前后都要有空格
if [ $mynum -eq 200 ]
then
echo "The condition is true."
fi
if [ $mynum -eq 300 ]
then
echo "The variable does not equal 200."
fi
else if#
#!/bin/bash
mynum=300
#[和]前后都要有空格
if [ $mynum -eq 200 ]
then
echo "The condition is true."
else
echo "The variable does not equal>
fi
01-04
意义#
执行一系列命令
视频框架#
- 介绍,欢迎
- HelloWorld
- 变量
- 数学函数
- if语句
- 退出代码
- while循环
- 更新脚本,保持服务器最新状态
- for循环
- 脚本应该存储在文件系统哪个位置
- 数据流,标准输入、标准输出、标准错误输出
- 函数
- case语句
- 调度作业(SchedulingJobs)Part1
- 调度作业(SchedulingJobs)Part2
- 传递参数
- 备份脚本
准备#
需要一台运行Linux系统的计算机(或虚拟机)
一些基本操作#
新建或编辑脚本#
nano myscript.sh内容#

ctrl + o 保存,ctrl + x 退出
如何执行脚本#
权限#
#给脚本赋予执行的权限
sudo chmod +x myscript.sh执行#
执行前查看权限#

运行#
./myscript.sh查看脚本#
cat myscript.sh更多语句的脚本#
ls
pwd输出
shebang#
告诉系统哪个解释器准备运行脚本(不特别指定的情况),比如bash ./myscript.sh就特别指明了用bash运行脚本,所以这里指的是./myscript.sh这种情况使用的哪个默认解释器
#!/bin/bash
echo "Hello World!"
echo "My current working directory is:"
#结果中pwd会另取一行跟这里的显式换行没关系, 我猜是echo在最末尾加了\n换行符
pwd

