_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%。

基本知识

周朝君主世系图#

资治通鉴中#

周威烈王

完整世系图#

《资治通鉴》从周威烈王(图里是32,这个第几任好像各家的算法不一致,不必深究)开始

卷001周紀一_起戊寅(前四〇三)尽壬子(前三六九)凡三十五年

公元前五世纪

《资治通鉴》起于公元前五世纪九〇年代的前四〇三年,止于公元后十世纪五〇年代的九五九年,共记载一千三百六十二年史迹。在本世纪(前五世纪)中,只有三年篇幅,但却发生晋国被赵、魏、韩三大家族瓜分的大事。司马光认为那是一个巨变,《资治通鉴》即从该年开始。

公元前五世纪九〇年代(前四〇三—前四〇一年) 战国时代

公元前五世纪> ◎ 晋阳之围。 ◎ 智姓家族覆亡。 ◎ 三家分晋。 ◎ 盗杀楚十六任王芈当。 虽然楚幽王(芈当)即位和春申君被杀发生在公元前238年(这已经是公元前三世纪了),但柏杨在这里列出它,是因为他认为这是“战国乱世”逻辑下的同类事件——即**“臣下篡权/血腥政变”的延续。

資治通鑑卷第一

朝散大夫右諫議大夫權御史中丞充理檢使上護軍賜紫金魚袋臣

司马光 奉敕编集

胡三省 音  註

周紀一 起著雍攝提格(戊寅),盡玄黓困敦(壬子),凡三十五年。

爾雅:太歲在甲曰閼逢,在乙曰旃zhān蒙,在丙曰柔兆,在丁曰強圉,在戊曰著雍,在己曰屠維,在庚曰上章,在辛曰重光,在壬曰玄黓yì,在癸曰昭陽,是為歲陽。在寅曰攝提格,在卯曰單閼,在辰曰執徐,在巳曰大荒落,在午曰敦牂,在未曰協洽,在申曰涒tūn灘,在酉曰作噩,在戌曰掩茂,在亥曰大淵獻,在子曰困敦,在丑曰赤奮若,是為歲名。周紀分註「起著雍攝提格」,起戊寅也。「盡玄黓困敦」,盡壬子也。閼,讀如字;史記作「焉」,於乾翻。著,陳如翻。雍,于容翻。黓,逸職翻。單閼,上音丹,又特連翻;下烏葛翻,又于連翻。牂,作郎翻。涒,吐魂翻。灘,吐丹翻。困敦,音頓。杜預 世族譜曰:黃帝之苗裔,姓。后稷之後,封于;及衰,不窋zhú竄於西戎。至十二代孫太王,避;至孫文王受命,武王而有天下。自武王平王凡十三世,自平王威烈王又十八世,自威烈王赧王又五世。張守節曰:因太王周原,國號曰地理志云:右扶風美陽縣岐山西北中水鄉周太王所邑。括地志云:故周城一名美陽城,在雍州武功縣西北二十五里。紀,理也,統理眾事而系之年月。溫公系年用春秋之法,因本紀而謂之紀。邰,湯來翻。夏,戶雅翻。窋,竹律翻。在雍,於用翻。

威烈王#

考王之子。諡法:猛以剛果曰威;有功安民曰烈。沈約曰:諸複諡,有諡人,無諡法。

二十三年(戊寅,前四零三)#

周威烈王 二十三年

晋烈公 十九年

鲁穆公 七年

魏文侯 四十四年

秦简公 十二年

韩景侯 六年

郑公 二十年

赵烈侯 六年

宋悼公 元年

燕湣公 三十一年

楚声王 五年

卫慎公 十二年

齐康公 二年

上距春秋獲麟七十八年,距左傳趙襄子惎jì智伯事七十一年。惎,毒也,音其冀翻。

1初命‹府新田,山西侯马›大夫 ‹府安邑,山西夏县›‹府晋阳,山西太原›‹府平阳,山西临汾›為諸侯。此溫公書法所由始也。之先,畢公高後,與同姓;其苗裔曰畢萬,始封于,至魏舒,始為正卿;三世至之先,造父後;至叔帶,始自;至趙夙,始封于。至趙盾,始為正卿,六世至之先,出於周武王,至韓武子,封于韓原。至韓厥,為正卿;六世至。三家者,世為大夫,於則陪臣也。室既衰,盟,以尊王室,故命之為伯。三卿竊之權,暴蔑其君,剖分其國,此王法所必誅也。威烈王不惟不能誅之,又命之為諸侯,是崇獎奸名犯分之臣也,通鑑始於此,其所以謹名分歟!

〖译文〗 [1]周威烈王姬午初次分封晋国大夫魏斯、赵籍、韩虔为诸侯国君。

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
fi

CaseStatements#

脚本#

╭─ ~/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

意义#

执行一系列命令

视频框架#

  1. 介绍,欢迎
  2. HelloWorld
  3. 变量
  4. 数学函数
  5. if语句
  6. 退出代码
  7. while循环
  8. 更新脚本,保持服务器最新状态
  9. for循环
  10. 脚本应该存储在文件系统哪个位置
  11. 数据流,标准输入、标准输出、标准错误输出
  12. 函数
  13. case语句
  14. 调度作业(SchedulingJobs)Part1
  15. 调度作业(SchedulingJobs)Part2
  16. 传递参数
  17. 备份脚本

准备#

需要一台运行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

基础

环境#

  • 使用视频作者给出的示例,https://github.com/CoreyMSchafer/code_snippets/tree/master/Regular-Expressions
  • 使用sublimeText打开的文件,ctrl+f时要确认勾选正则及区分大小写

simple.txt-基础操作#

直接搜索#

任意字符#


这里默认不会显示所有,点击findAll才会出来

有些字符需要加反斜杠转义,比如 . (点)以及 \ (斜杠本身)#

/////,从左到右,和书写方向一致的叫做(正)斜杠。
反之,叫做反斜杠 \


一些元字符#

.       - Any Character Except New Line 除了换行符的任意字符
\d      - Digit (0-9) 数字
\D      - Not a Digit (0-9) 非数字
\w      - Word Character (a-z, A-Z, 0-9, _) 单词字符,大小写字母+数字+下划线
\W      - Not a Word Character 非单词字符
\s      - Whitespace (space, tab, newline) 空白字符,空格+tab+换行符
\S      - Not Whitespace (space, tab, newline) 非空白字符

\b      - Word Boundary 边界字符-单词边界
\B      - Not a Word Boundary 非单词边界(没有单词边界)
^       - Beginning of a String
$       - End of a String

[]      - Matches Characters in brackets
[^ ]    - Matches Characters NOT in brackets
|       - Either Or
( )     - Group

Quantifiers:
*       - 0 or More
+       - 1 or More
?       - 0 or One
{3}     - Exact Number
{3,4}   - Range of Numbers (Minimum, Maximum)


#### Sample Regexs ####

[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+

边界字符#