/*自定义导航栏*/

笔记8:Linux知识

linux学习笔记

1 Linux介绍

1.1 基本知识

  • 应用领域:服务器使用 LAMP(Linux + Apache + MySQL + PHP)或 LNMP(Linux + Nginx+ MySQL + PHP)组合。

  • linux启动:Linux系统的启动过程可以分为5个阶段:

    • 内核的引导。当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
    • 运行 init。init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init 程序首先是需要读取配置文件 /etc/inittab。/boot /init 进程
    • 系统初始化。在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。
    • 建立终端 。rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。
    • 用户登录系统。命令行登录、ssh登录、图形界面登录。
  • 运行级别:

    • 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
    • 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
    • 运行级别2:多用户状态(没有NFS)
    • 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
    • 运行级别4:系统未使用,保留
    • 运行级别5:X11控制台,登陆后进入图形GUI模式
    • 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
  • 窗口切换:默认登录就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 来切换它们。当你进入命令窗口界面后再返回图形界面只要按下Ctrl + Alt + F7 就回来了。

  • Linux关机:正确的关机流程为:sync > shutdown > reboot > halt

    sync 将数据由内存同步到硬盘中。
    shutdown –h now 立马关机
    shutdown –h 20:25 系统会在今天20:25关机
    shutdown –h +10 十分钟后关机
    shutdown –r now 系统立马重启
    shutdown –r +10 系统十分钟后重启
    
    reboot 就是重启,等同于 shutdown –r now
    halt 关闭系统,等同于shutdown –h now 和 poweroff
    
  • Linux 忘记密码:进入单用户模式更改一下root密码即可。

  • 远程登陆:Linux系统中是通过ssh服务实现的远程登录功能,默认ssh服务端口号为 22。Window系统上 Linux 远程登录客户端有SecureCRT, Putty, SSH Secure Shell等,本文以Putty为例来登录远程服务器。

    putty下载地址:http://www.putty.org/

1.2 Linux 系统目录结构

登录系统后,在当前命令窗口下输入命令ls /

  • /bin:目录存放着最经常使用的命令。
  • /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。
  • /dev :dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。
  • /etc:存放所有的系统管理所需要的配置文件和子目录。
  • /home:用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
  • /lib:这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
  • /media:linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。
  • /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
  • /opt: 这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
  • /proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
  • /root:该目录为系统管理员,也称作超级权限者的用户主目录。
  • /sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
  • /selinux: 这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
  • /srv: 该目录存放一些服务启动之后需要提取的数据。
  • /sys:该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。
  • /tmp:这个目录是用来存放一些临时文件的。
  • /usr: 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
  • /usr/bin:系统用户使用的应用程序。
  • /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序。
  • /usr/src:内核源代码默认的放置目录。
  • /var:这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
  • /run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

1.3 文件操作

文件基本操作

在Linux中第一个字符代表这个文件是目录、文件或链接文件等等。

  • 当为[ d ]则是目录
  • 当为[ - ]则是文件;
  • 若是[ l ]则表示为链接文档(link file);
  • 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
  • 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
[root@www /]# ls -l
total 64
dr-xr-xr-x   2 root root 4096 Dec 14  2012 bin
dr-xr-xr-x   4 root root 4096 Apr 19  2012 boot
……

1559529871695

文件属主和属组

[root@www /]# ls -l
total 64
drwxr-xr-x 2 root  root  4096 Feb 15 14:46 cron
drwxr-xr-x 3 mysql mysql 4096 Apr 21  2014 mysql
……
  • chgrp:更改文件属组,语法:-R:递归更改文件属组,该目录下的所有文件的属组都会更改。
chgrp [-R] 属组名 文件名
  • chown:更改文件属主,也可以同时更改文件属组,语法:
chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名

进入 /root 目录(~)将install.log的拥有者改为bin这个账号:

[root@www ~] cd ~
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

将install.log的拥有者与群组改回为root:

[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log
  • chmod:更改文件9个属性

Linux文件属性有两种设置方法,一种是数字,一种是符号。Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限。各权限的分数对照表如下:r:4,w:2,x:1

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是:

  • owner = rwx = 4+2+1 = 7
  • group = rwx = 4+2+1 = 7
  • others= --- = 0+0+0 = 0

所以等一下我们设定权限的变更时,该文件的权限数字就是770啦!变更权限的指令chmod的语法是这样的:xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。

 chmod [-R] xyz 文件或目录

举例来说,如果要将.bashrc这个文件所有的权限都设定启用,那么命令如下:

[root@www ~]# ls -al .bashrc
-rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc
[root@www ~]# chmod 777 .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc

那如果要将权限变成 -rwxr-xr-- 呢?那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754。

处理目录的常用命令

  • ls: 列出目录

    1559531095401

  • cd:切换目录

  • pwd:显示目前的目录

  • mkdir:创建一个新的目录

    1559531212661

  • rmdir:删除一个空的目录

    1559531236470

  • cp: 复制文件或目录

    1559531290707

  • rm: 移除文件或目录

  • mv: 移动文件与目录,或修改文件与目录的名称

    1559531408038

文件内容查看

  • cat 由第一行开始显示文件内容

    1559531491848

  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!

  • nl 显示的时候,顺道输出行号!

    1559531529930

  • more 一页一页的显示文件内容

    1559531593763

  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

    1559531636754

  • head 只看头几行

    1559531657325

  • tail 只看尾巴几行

1559531675195

1.4 用户和用户组

实现用户账号的管理,要完成的工作主要有如下几个方面:

  • 用户账号的添加、删除与修改。

    1559532594208

    # useradd –d /usr/sam -m sam
    

    1559532684797

    1559532723881

  • 用户口令的管理。用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。

    1559532783036

    1559532857097

  • 用户组的管理。用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

    1559532932405

    1559532947830

    1559532980763

1.5 磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题。Linux磁盘管理常用三个命令为df、du和fdisk。

  • df:列出文件系统的整体磁盘使用量,可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

    1559533232733

    1559533317162

  • du:检查磁盘空间使用量,Linux du命令是对文件和目录磁盘使用的空间的查看。

    1559533450382

    1559533508973

  • fdisk:用于磁盘分区

1559533520423

列出所有分区信息:fdisk -l

1.6 vim 编辑器

Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

img

基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode)输入模式(Insert mode)底线命令模式(Last line mode)。 这三种模式的作用分别是:

(1)命令模式

户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。以下是常用的几个命令:

  • i 切换到输入模式,以输入字符。
  • x 删除当前光标所在处的字符。
  • : 切换到底线命令模式,以在最底一行输入命令。

若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。

(2)输入模式

在命令模式下按下i就进入了输入模式。在输入模式中,可以使用以下按键:

  • 字符按键以及Shift组合,输入字符
  • ENTER,回车键,换行
  • BACK SPACE,退格键,删除光标前一个字符
  • DEL,删除键,删除光标后一个字符
  • 方向键,在文本中移动光标
  • HOME/END,移动光标到行首/行尾
  • Page Up/Page Down,上/下翻页
  • Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
  • ESC,退出输入模式,切换到命令模式

(3)底线命令模式

在命令模式下按下:(英文冒号)就进入了底线命令模式。底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。在底线命令模式中,基本的命令有(已经省略了冒号):

  • q 退出程序
  • w 保存文件

按ESC键可随时退出底线命令模式。简单的说,我们可以将这三个模式想成底下的图标来表示:

img

使用案例

  • 创建文件,按下i进入编辑模式,Esc回到一般模式,:wq保存且退出,:q退出

    $ vim runoob.txt
    
  • 常见按键

    1559556138575

    1559556195297

    1559556389935

    1559556462960

    1559556516010

1.7 yum 命令

yum( Yellow dog Updater, Modified)是一个Shell前端软件包管理器。可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。

1559556661249

  • 常见命令
    • 1.列出所有可更新的软件清单命令:yum check-update
    • 2.更新所有软件命令:yum update
    • 3.仅安装指定的软件命令:yum install <package_name>
    • 4.仅更新指定的软件命令:yum update <package_name>
    • 5.列出所有可安裝的软件清单命令:yum list
    • 6.删除软件包命令:yum remove <package_name>
    • 7.查找软件包 命令:yum search
    • 8.清除缓存命令:
      • yum clean packages: 清除缓存目录下的软件包
      • yum clean headers: 清除缓存目录下的 headers
      • yum clean oldheaders: 清除缓存目录下旧的 headers
      • yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的headers

1559557095809

1559557114442

1559557173383


2 Shell编程

2.1 基础知识

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 脚本(shell script),是一种为 shell 编写的脚本程序。shell 和 shell script 是两个不同的概念。新建一个文件 test.sh,扩展名为 sh(sh代表shell)保存为 test.sh,并 cd 到相应目录:

#!/bin/bash
echo "这是我的第一行shell命令"

(1)作为可执行程序运行

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

(2) 作为解释器参数运行

/bin/sh test.sh
/bin/php test.php
  • shell变量,变量名和等号之间不能有空格
your_name="runoob.com"
for file in `ls /etc`
或
for file in $(ls /etc)

1559612838299

以上语句将 /etc 下目录的文件名循环出来。

1559612950950

  • 定义只读变量
#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl

  • 删除变量
unset variable_name

  • 变量类型,运行shell时,会同时存在三种变量:
    • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
    • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
    • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
  • 拼接字符串
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

  • 获取字符串长度
string="abcd"
echo ${#string} #输出 4

  • 提取子字符串,第 2 个字符开始截取 4 个字符
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

  • 查找子字符串,查找字符 io 的位置(哪个字母先出现就计算哪个):
string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

  • shell数组,bash支持一维数组(不支持多维数组),没有限定数组大小。数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
array_name=(value0 value1 value2 value3)

​ 可以不使用连续的下标,而且下标的范围没有限制。

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

  • 读取数组,使用 @ 符号可以获取数组中的所有元素

    ${数组名[下标]}
    valuen=${array_name[n]}
    echo ${array_name[@]}
    
    
  • 获取数组长度

    # 取得数组元素的个数
    length=${#array_name[@]}
    # 或者
    length=${#array_name[*]}
    # 取得数组单个元素的长度
    lengthn=${#array_name[n]}
    
    
  • shell注释。每一行加一个 # 号设置多行注释,

1559614280694

2.2 Shell传参

向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

为脚本设置可执行权限,并执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

1559614484189

  • $* 与 $@ 区别:
    • 相同点:都是引用所有参数。
    • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

2.3 运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

1559614946450

(1)算数运算符:乘号(*)前边必须加反斜杠()才能实现乘法运算;if...then...fi 是条件语句.

1559614967566

(2)关系运算符

1559615100814

(3)布尔运算符

1559615157024

1559615213355

(4)字符串运算符

1559615236781

(5)文件测试运算符

1559615292229

2.4 echo

  • 换行

    1559615601528

  • 结果定向到文件

echo "It is a test" > myfile

  • 显示当前时间

    echo `date`
    
    

2.5 printf命令

1559615764913

1559615892869

%s %c %d %f都是格式替代符;%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。%-4.2f 指格式化为小数,其中.2指保留2位小数。

3 流程控制

3.1 if-else-fi

Python,Java、PHP等语言不一样,sh的流程控制不可为空.

1559616102009

1559616151228

1559616176332

1559616195479

3.2 for

1559616245494

3.3 while

1559616295148

使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量

3.4 case

1559616387575

取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。下面的脚本提示输入1到4,与每一种模式进行匹配:

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

3.5 break

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done

3.6 continue

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done

4 函数

4.1 函数的使用

1559618615873

#!/bin/bash
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

1559619851984

函数返回值在调用该函数后通过 $? 来获得。

4.2 函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 n 的形式来获取参数的值,例如,​$1表示第一个参数,$2表示第二个参数...

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

1559619919668

4.3 重定向

  • 输出重定向

1559619942639

1559620015166

$ echo "菜鸟教程:www.runoob.com" >> users
$ cat users
菜鸟教程:www.runoob.com
菜鸟教程:www.runoob.com
$

  • 输入重定向

    一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

    • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
    • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
    • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

    默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

$ command 2 > file

4.4 文件包含

1559620294296

test1.sh 代码如下:

#!/bin/bash
url="http://www.runoob.com"

test2.sh 代码如下:

#!/bin/bash
#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh
echo "菜鸟教程官网地址:$url"

接下来,我们为 test2.sh 添加可执行权限并执行:

$ chmod +x test2.sh 
$ ./test2.sh 
菜鸟教程官网地址:http://www.runoob.com

注:被包含的文件 test1.sh 不需要可执行权限

5 Nginx

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。在高连接并发的情况下,Nginx是Apache服务器不错的替代品。

posted @ 2019-06-13 10:21  伏草惟存  阅读(638)  评论(0编辑  收藏  举报