Linux和Shell学习记录

Linux和Shell学习记录

总结记录韩顺平老师《2021图解Linux》课程里面的内容,主要是基础部分。

课程链接:https://www.bilibili.com/video/BV1Sv411r7vd/

vim使用

进入vim编辑器

1
vim hello.txt

进入后模型是查看(一般)模式,此模式下可进行快捷操作例如:删除、复制、撤销等。键盘键入i即可进入编辑(插入)模式,此模型下可进行文本编辑。键盘键入ESC回到查看模式,在此基础上键入:进入命令行模式,进行文件的保存。

三种模式的切换示意图:

image-20220615160727673

快捷键

  1. 查看模式
    1. yy拷贝光标所在的行,此时移动光标至需要粘贴的位置,键入p粘贴;
      1. 5yy拷贝光标行及以下4行,同样键入p粘贴;
    2. dd删除光标所在的行;
      1. 5dd删除光标行及以下4行;
    3. u撤销上一次操作;
    4. gg将光标快速跳到文件最首行;
    5. G将光标快速跳到文件最末行;
      1. 20 shift+g,将光标跳到第20行;
    6. .单独的小数点,表示重复上一个动作;上一条指令是dd,则键入.代表删除光标所在行。
  2. 命令行模式
    1. 取消、显示行号
      1. 命令行模式下输入:set nu显示文件行号;
      2. 命令行模式下输入:set nonu关闭显示文件行号;
    2. 查找关键字符
      1. 键入/abc,并回车,向下查找文件中是否存在abc,默认返回字符的第一个位置,然后键入n继续查找下一个匹配的字符;
      2. 键入?abc,并回车,向上查找文件中是否存在abc,默认返回字符上面最近位置,然后键入n继续查找下一个匹配的字符;
    3. 保存及退出
      1. 命令行模式下键入:wq保存并退出文件;
      2. :wq!强制保存退出;
      3. :q!强制退出不保存;
      4. :q普通退出。

Linux 开关机和用户登录注销

关机和重启

  1. 关机

    1
    2
    3
    shutdown -h now # 立该进行关机
    shutdown -h 1 # "hello, 1 分钟后会关机了"
    halt # 立刻关机
  2. 重启

    1
    2
    shutdown -r now # 立即重启
    reboot # 立即重启
  3. 同步(将内存中的数据写到磁盘)

    1
    sync # 把内存的数据同步到磁盘.

    注:一般在关机或者重启前先执行一遍sync指令。

用户登录于注销

  1. 登录

    1
    su - root

    然后输入root账户的密码即可;从高权限用于切换到低权限用户不需要密码;反之则需要。

  2. 注销

    1
    logout

    退出当前登录的用户,一般在ssh连接时常用。

Linux 用户管理

添加、查看、切换、删除用户

只有root用户才能进行其它用户的管理。

  1. 添加用户

    1
    2
    useradd tom # 添加tom用户 ubuntu系统默认不创建家目录,但是CentOS会自动创建
    useradd -m tom # 添加tom用户,并创建tom的家目录
  2. 设置用户密码

    1
    passwd tom
  3. 查看用户

    1
    id tom

    查看tom用户所处的组

  4. 切换用户

    1
    su - tom
  5. 删除用户

    1
    2
    userdel tom # 只删除用户,保留用户文件
    userdel -r tom # 删除用户及其家目录文件

用户组管理——添加、修改、删除组

Linux内每个用户是以用户组来进行管理的,同组内的用户权限相同,因此可根据需要将不同用户放入不同的组中,然后给不同的组赋予不同的权限。

Linux在创建用户时,默认会创建与用户名一致的组,并把该用户放到该组中。如果需要在创建用户时指定对应的组,需使用-g参数。

useradd -g students -m tom # 创建tom,并将其移动到students组中

  1. 添加组

    1
    groupadd students # 添加 students 组
  2. 修改组成员

    1
    usermod -g students jack # 将jack移动到students组
  3. 删除组

    1
    groupdel students 

用户组管理——权限管理

在 linux 中的每个用户必须属于一个组,不能独立于组外。在 linux 中每个文件有所有者、所在组、其它组的概念。一般而言,用户创建了文件,这个文件的所有者就是该用户,同时用户所在的组就是文件在的所在组,而剩下的组就是该文件的其他组。所有者以及不同组,对文件的权限(读、写、可执行)一般不同。

  1. 修改文件的所有者

    1
    2
    chown jack apple.txt # 将apple.txt文件的所有者修改成jack
    chown -R jack /home/test # 将/home/test目录下所有的文件和目录的所有者都修改成 jack
  2. 修改文件/目录所在的组

    1
    2
    chgrp fruit orange.txt # 将orange.txt文件的所在组更改为fruit
    chgrp -R fruit /home/test # 将/home/test目录下所有的文件和目录的所在组都修改成 fruit
  3. 修改用户的初始登录文件夹

    1
    usermod -d tom2 tom # 将tom用户的文件夹由tom变为tom2

    注:用户需要有进入新目录的权限。

  4. 赋予用户root权限

    root账户登录,然后使用vim /etc/sudoers打开,在root下面添加一行一样的语句,即可赋予其他用户root权限。

    1
    2
    3
    ## Allow root to run any commands anywhere
    root ALL=(ALL) ALL
    tom ALL=(ALL) ALL

文件/目录权限介绍

键入ls -l查看目录内所含文件、子目录的详细信息

image-20220616094134969

第0位,确定文件类型:d、-、l、c、b

  • d——表示是一个目录
  • -——表示就是一个普通文件
  • l——表示是一个软连接(快捷方式)
  • c——字符串设备,鼠标、键盘等
  • b——块设备,硬盘等

第1-3位,确定文件所有者对该文件的权限

  • r——可读,可查看
  • w——可写,可修改
  • x——可执行

第4-6位,确定文件所在组成员对该文件的权限,同样是rwx,如果没有相应权限则用-代替

第7-9位,确定其他组成员对该文件的权限。

举例:drwxrwxr-x 4 hjy hjy 4096 6月 9 14:26 apps,表示这是一个目录,然后目录所有者hjy对该目录有rwx权限,目录所在组hjy也有rwx权限,最后其他组对该目录有rx权限,目录中有4个子文件或文件,最后修改时间是6月9日14:26,此目录名为apps

rwx权限:作用到目录和作用到文件

  1. 作用到文件
    1. r,读取,查看
    2. w,可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权 限,才能删除该文件。
    3. x,可以被执行
  2. 作用到目录
    1. r,可以读取,ls 查看目录内容
    2. w,可以修改, 对目录内创建+删除+重命名目录
    3. x,可以进入到该目录

chmod 修改文件权限

  1. 通过+ - = 变更权限

    u,所有者;g,所在组,o,表示其他组,a,表示所有

    1
    2
    3
    chmod u=rwx,g=rx,o=x my_task # 赋予所有者对my_task目录rwx的权限,赋予其它组成员对my_task可执行的权限。
    chmod o+r my_task # 给其他组成员赋予可读的权限
    chmod a-r my_task # 对所有成员都赋予可读权限
  2. 通过数字变更权限

    r=4,w=2,x=1,可读权限用4表示,可执行权限用2表示,因此下述两条语句等价

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
       chmod u=rwx,g=rx,o=x my_task
    chmod 751 my_task

    ### 用户管理相关的文件

    1. 用户配置文件——`/etc/passwd`

    `cat /etc/passwd `部分显示如下:

    <img src="https://imgbed2333.oss-cn-beijing.aliyuncs.com/hjy/image-20220615173659819.png" alt="image-20220615173659819" style="zoom:100%;" />

    每列含义:`用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录 Shell`

    2. 口令配置文件——`/etc/shadow`

    都是一些加密的信息,感觉没啥用。

    每列含义:`登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志`

    3. 组配置文件——`/etc/group`

    `cat /etc/group `部分显示如下:

    <img src="https://imgbed2333.oss-cn-beijing.aliyuncs.com/hjy/image-20220615174208846.png" alt="image-20220615174208846" style="zoom:100%;" />

    每列含义:`组名:口令:组标识号:组内用户列表`

    ## 设置、查看Linux运行级别

    1. 运行级别:

    1. `0`- 关机
    2. `1`- 单用户(用于找回root密码)
    3. `2`- 多用户状态没有网络服务
    4. `3`- 多用户状态有网络服务
    5. `4` - 系统未使用,保留给用户
    6. `5`- 图形界面
    7. `6`- 系统重启

    2. 查看运行级别

    ```shell
    systemctl get-default

    一般返回是graphical.target,代表上述的级别5-图形界面。

    1
    2
    3
    # 对应关系
    multi-user.target: analogous to runlevel 3
    graphical.target: analogous to runlevel 5

    设置为多用户有网络的级别:

    1
    systemctl set-default multi-user.target

Linux文件目录类指令

  1. pwd 指令

    显示当前工作目录的绝对路径。

    1
    pwd
  2. ls 和 ll 指令

    显示当前的路径中下的文件和目录。ls一般只显示可见的文件,且文件显示的信息较少;ll能够较全的显示文件、目录信息(包括修改时间、大小、权限等等。)

    ls选项参数:

    • -a——显示所有文件包括.xxx开头的隐藏文件;
    • -h——human表示显示信息以便于人类阅读的方式显示,主要为了将文件大小自动转换为KB,MB,GB的形式;
    • -l——用在ls命令后,以显示更全的信息。

    ll直接就是全信息显示,也会显示隐藏文件,只有一个-h参数。

    1
    2
    ls -ahl  # 带参数使用
    ll -h
  3. cd 指令

    切换到指定目录

    1
    2
    3
    4
    5
    cd ~ # 切换到home目录
    cd .. # 切换到上一级目录
    cd ../.. # 切换到上上级目录
    cd / # 切换到根目录
    cd /home/tom/downloads # 切换到tom的downloads目录
  4. mkdir 指令

    创建文件夹(目录)

    1
    2
    mkdir my_task # 创建文件夹
    mkdir -p my_task/task1 # 创建多级目录
  5. rm 指令

    删除文件或者文件夹

    1
    2
    rm task.zip # 删除文件
    rm -rf my_task # 递归删除文件夹(目录)

    -r,表示递归删除

    -f,表示直接删除不报告,不用确认删除过程。

  6. touch 指令

    生成普通文件

    1
    touch hello.txt
  7. cp 指令

拷贝文件

1
2
3
cp hello.txt /home/my_task # 拷贝hello.txt文件到my_task目录下
cp -r /home/my_task /home/my_test/ # 拷贝my_task目录至my_test目录下
# 进入my_test目录,可以看到有my_task子目录

-f,覆盖已经存在的目标文件而不给出提示。

  1. mv 指令

    移动文件或者目录,或者为其重命名

    1
    2
    3
    mv /home/task1 /home/task # 将task1目录移动到task目录下
    mv hello_copy.txt hello.txt # 相同目录下移动就是重命名,将hello_copy改为hello
    mv hello.txt /home/task # 将hello.txt移动到task目录下
  2. cat 指令

    查看文件内容,不能修改文件

    1
    2
    3
    cat /etc/profile # 查看profile文件,打印在终端
    cat -n /etc/profile # 查看profile文件并显示行号
    cat -n /etc/profile | more # 查看profile文件并交给more指令交互展示
  3. more 指令

    交互式显示文件内容

    1
    more /etc/profile # 交互式查看profile文件

    more 交互键说明:

    空格——下翻一页;

    Enter——向下翻一行;

    q——不再查看立即退出交互;

    =——显示当前行号;

    :f——输出文件名和当前行行号。

    注:q,=,:f这些指令在敲出来的时候都不会在终端上有显示,直接敲就行。

  4. less 指令

    less 和 more 类似都可以用来交互式查看文件,不过less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。

    1
    less /etc/profile

    less 交互键说明:

    空格——下翻一页;

    /abc——+ 回车,向下搜索abc字符,键入n查询下一个,键入N查询上一个;

    ?abc——+ 回车,向上搜索abc字符,键入n查询下一个,键入N查询上一个;

    q——退出查看。

  5. echo 指令

    相当于Python里面的print(),打印输出内容;主要还是在.sh文件内使用。

    1
    echo "hello world!"
  6. head 指令

查看文件前面几行的内容

1
2
head /etc/profile # 查看profile前10行的内容
head -n 20 /etc/profile # 查看profile前20行的内容
  1. tail 指令

    查看文件最后几行的内容

    1
    2
    3
    tail /etc/profile # 查看profile末尾10行的内容
    tail -n 20 /etc/profile # 查看profile末尾20行的内容
    tail -f /etc/profile # 实时监控profile文件的改动

    -f,参数指定后tail进程为一直占据终端窗口,可使用ctrl + c终止进程。

  2. > 指令和 >>指令

    >表示输出重定向,>>表示重定向追加

    1
    2
    3
    4
    ls -l > log.txt # 将当前目录下的文件和子目录以文本形式写入log.txt中
    ls -al >> log.txt # 将目录信息追加(补充)到log.txt中
    cat /etc/profile > my_profile # 将/etc/profile中的内容重定向到my_profile文件中
    echo "hello world!" >> my_log.txt
  3. ln 指令

    软连接,相当于Windows里面的快捷方式

    1
    2
    ln -s /root /home/myroot # 在/home目录下创建一个软连接myroot,连接到/root目录
    rm /home/myroot # 删除软链接
  4. history 指令

    查看已经执行过历史命令,也可以执行历史指令

    1
    2
    3
    history # 查看之前已执行的历史命令
    history 10 # 查看前10条已执行的历史命令
    !476 # 执行之前id为476的历史命令

Linux时间日期类指令

  1. date 显示与设置日期

    显示相关

    1
    2
    3
    4
    5
    date # 显示当前时间
    date +%Y # 显示当前年份
    date +%m # 显示当前月份
    date +%d # 显示当前天数
    date "+%Y-%m-%d %H:%M:%S" # 显示年月日时分秒

    设置相关

    1
    date -s "2020-11-03 20:02:10" # 设置时间 -s代表set
  2. cal 日历指令

    1
    2
    cal # 显示当前日历
    cal 2022 # 显示2022年日历

Linux搜索查找类指令

  1. find 指令

    1
    2
    3
    4
    find /home/tom -name hello.txt # 在/home/tom下通过文件名查找hello.txt
    find /home/tom -user tom # 在/home/tom下查找属于用户tom的文件
    find /home/tom -size +200M # 在/home/tom下查找大于200M的文件
    find /home/tom -size -200M # 在/home/tom下查找小于200M的文件
  2. locate 指令

    locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速 定位给定的文件。Locate 指令无需遍历整个文件系统,查询速度较快。

    1
    2
    updatedb # 先创建更新locate数据库
    locate hello.txt # 全局查找hello.txt文件,并返回文件路径
  3. grep 指令

    查找过滤文件,得到想看的字符内容

    1
    2
    cat -n /home/hello.txt | grep "yes" # 在hello.txt文件中,查找"yes"所在行,并且显示行号
    grep -n 'yes' /home/hello.txt # 在hello.txt文件中,查找"yes"所在行,并且显示行号

    -i,表示筛选时忽略大小写。

Linux压缩和解压指令

  1. gzip 和 gunzip 指令

    压缩和解压.gz后缀的文件

    1
    2
    gzip /home/my_task/hello.txt # 压缩hello.txt文件并存入my_task目录下
    gunzip /home/my_task/hello.txt.gz # 解压文件
  2. zip 和 unzip 指令

    压缩和解压.zip后缀的文件

    1
    2
    zip -r myhome.zip /home/ # 将home目录及其包含的文件和子文件夹都压缩
    unzip -d /opt/tmp /home/myhome.zip # 将myhome.zip解压到/opt/tmp目录下

    -d,指定解压目录

  3. tar 指令

    打包指令,用于处理.tar.gz后缀的文件

    -c,产生.tar打包文件

    -v,显示处理过程信息

    -f,指定打包压缩后的文件名

    -z,打包同时压缩

    -x,解包.tar文件

    1
    2
    3
    4
    tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt # 打包压缩多个文件
    tar -zcvf myhome.tar.gz /home/ # 将/home 的文件夹 压缩成 myhome.tar.gz
    tar -zxvf pc.tar.gz # 解压到当前目录
    tar -zxvf /home/myhome.tar.gz -C /opt/tmp # 解压到/opt/tmp目录

    -C,指定解压目录

Linux 磁盘挂载情况以及占用空间查看

  1. 使用 lsblk 或 lsblk -f 查看当前主机的磁盘挂载情况

    1
    lsblk -f 
  2. du -h 指令

    查询指定目录下磁盘的占用情况,默认为当前目录

    -h——human格式显示

    -a——包含文件和目录

    --max-depth=1——查询占用情况时使用的子目录深度,一般设定1即可

    -c——列出各文件明细的同时,增加汇总情况

    1
    du -hac --max-depth=1 /my_task # 查看my_task目录中一级子目录的磁盘占用情况
  3. 磁盘情况实用指令

    1
    2
    3
    4
    5
    ls -l /opt | grep "^-" | wc -l  # 统计/opt文件夹下文件的个数
    ls -lR /opt | grep "^-" | wc -l # 统计/opt文件夹下文件的个数,包括子文件夹里的
    ls -l /opt | grep "^d" | wc -l # 统计/opt文件夹下目录的个数
    ls -lR /opt | grep "^d" | wc -l # 统计/opt文件夹下目录的个数,包括子目录里的
    tree /home/my_task # 以树状图的形式显示my_task下的目录结构

Linux 进程管理

普通进程管理

  1. ps -aux 指令

    显示当前运行进程的所有信息,其中PID表示进程号,PPID表示其父进程号

    1
    ps -aux
    • -A 列出所有的进程

    • -w 显示加宽可以显示较多的资讯

    • -au 显示较详细的资讯

    • -aux 显示所有包含其他使用者的行程

  2. ps -ef 指令

    以全格式显示当前所有的进程的信息,包括其父进程;-e表示显示所有进程,-f表示全格式显示

  3. top 指令

    实时显示主机当前进程信息,默认以CPU使用率从高到低排序

    -d——动态更新间隔时间,默认是3秒

    -i——不显示闲置或者僵死进程

    -p——只监控指定pid的进程

    1
    top -p 1079 -d 1 # 只监控1079进程的变化情况,每隔一秒更新

    top交互指令:
    P——以CPU使用率排名,默认此项

    M——以内存使用率排名

    N——以PID序号排序

    u——+ tom 只查询tom用户相关的进程

    k——+ 11421 终止pid为11421的进程

    q——退出top

  4. kill 和 killall 指令

    终止某个进程

    1
    2
    3
    kill 11421 # 终止pid号为11421的进程
    kill -9 11421 # 强制终止pid号为11421的进程
    killall gedit # 终止所有名字为gedit的进程
  5. pstree 指令

    以树状图的结构显示进程信息

    -p,显示进程的pid;-u,指定查看属于某个用户的进程

服务进程管理

服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld, sshd 防火墙等),因此又可称为守护进程。

  1. 通过service管理服务

    1
    2
    service 服务名 [start | stop | restart | reload | status]
    service sshd start # 开启sshd服务
  2. 通过systemctl管理服务

    1
    2
    3
    4
    5
    6
    7
    8
    systemctl [start | stop | restart | status] 服务名
    systemctl start sshd

    systemctl list-unit-files # 查看服务是否开机自启
    systemctl list-unit-files | grep sshd # 查看sshd服务
    systemctl enable sshd # 设置服务开机启动
    systemctl disable sshd
    systemctl is-enabled sshd # 查询某个服务是否是自启动

Shell 介绍

Shell是一个命令行解释器,可以用 Shell 来启动、挂起、停止甚至是编写一些程序。

Shell 脚本格式要求:

  1. 脚本以#!/bin/bash开头
  2. 脚本需要有可执行权限

如果脚本.sh文件没有可执行权限也可以通过sh my_shell.sh进行执行。

Shell 变量

命名规则和一般脚本语言的规则一致,变量由字母、数字、下划线组成,但是不能以数字开头;Shell中的变量有系统变量和自定义变量之分,其中系统变量包括$HOME、$PWD、$SHELL、$USER 等等。

  1. 定义普通变量

    1
    2
    3
    4
    #!/bin/bash
    A=100 # 定义变量A
    echo A=$A # 输出A变量的值
    echo "A=$A" # 同上
  2. 撤销普通变量

    1
    2
    3
    #!/bin/bash
    A=100 # 定义变量A
    unset A # 撤销变量A
  3. 定义静态变量

    1
    2
    3
    #!/bin/bash
    readonly B=10
    # unset B # 静态变量不能被撤销
  4. 使用环境变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    echo "local_path=$PWD"

    # shell 多行注释 :<<! 注释内容 !
    :<<!
    C=`date`
    D=$(date)
    echo "C=$C"
    echo "D=$D"
    !
  5. 定义环境变量,供所有Shell脚本使用

    1
    2
    export A=100 # 定义A为环境变量(临时添加),在另一个.sh脚本中也能使用到A
    unset A # 撤销环境变量

    进入/etc/profile文件或者.bashrc文件,在文件末尾加入export A=100,并执行source /etc/profile或者source .bashrc则环境变量立即生效,并永久存在。

Shell 位置参数变量和预定义变量

位置参数变量用于获取执行.sh脚本时,附加的一些额外参数信息,预定义变量用于一些查询描述。

  1. $n,n可以为0-9是个数字,或者用${12}来表示两位数字。$0表示执行命令本身,$1表示.sh命令后接的第一个参数,$2表示命令后接的第二个参数,以此类推。
  2. $*,一次性获取命令后的所有参数,把所有参数看成一个整体
  3. $@,一次性获取命令后的所有参数,把每个参数区别对待
  4. $#,获取命令行后参数的个数
  5. $$,获取当前进程的PID号
  6. $!,后台运行的最后一个进程的PID号
  7. $?,判定上一条指令是否执行成功,如果成功,则返回0,返回非0则表示上条指令执行不成功。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
echo "pos 0 = $0, pos 1 = $1, pos 2 = $2"
echo "all augrements:$*"
echo "all : $@"
echo "count: $#"
echo "current pid : $$"
echo "$?"

# 输出
# 执行 sh test.sh 10 100 1000
:<<!
pos 0 = test.sh, pos 1 = 10, pos 2 = 100
all augrements:10 100 1000
all : 10 100 1000
count: 3
current pid : 89830
0
!

Shell 运算符和条件语句

运算符

基本表达式:$[运算式];运算符号:+ - * / %,加减乘除和取余

示例:

1
2
3
#!/bin/bash
RES1=$[(2+3)*4]
echo "res1=$RES1"

条件语句

基本语法:[ condition ],注condition前后有空格,如果非空则返回true

1
2
3
4
#!/bin/bash
[ hjy ] # 返回 true
[ ] # 返回 false
[ hjy ] && echo OK || echo No # 条件满足 输出 OK, 不满足 输出 No
  1. if判断

    语法格式:

    1
    2
    3
    4
    5
    6
    7
    if [ condition ]
    then
    coding
    elif [ condition ]
    then
    coding
    fi
  2. 常用判断字符

    1. 字符串比较:=
    2. 两个整数比较:-lt -le -eq -gt -ge -ne
    3. 按照文件权限判断:-r -w -x
    4. 按照文件类型判断:-f -e -d-f-d,表示文件存在且是一个文件或者目录

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/bin/bash
    if [ "ok" = "ok" ]
    then
    echo "equal"
    fi
    if [ 23 -ge 22 ]
    then
    echo "大于"
    fi
    if [ -f ./hello.txt ]
    then
    echo "存在"
    fi
    if [ -d ./hello.txt ]
    then
    echo "存在"
    else
    echo "不存在"
    fi

    输出:

    1
    2
    3
    4
    equal
    大于
    存在
    不存在
  3. case判断

    语法格式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    case $变量 in
    "情况1")
    coding
    ;;
    "情况2")
    coding
    ;;
    *) # 其它情况
    coding
    ;;
    esac

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/bin/bash
    case $1 in
    "1")
    echo "a"
    ;;
    "2")
    echo "b"
    ;;
    "3")
    echo "c"
    ;;
    *)
    echo "d"
    ;;
    esac

    # 执行 sh test.sh 1
    # 输出 a

循环

  1. for 循环

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #!/bin/bash
    for i in "$*"
    do
    echo "num is $i"
    done

    for i in "$@"
    do
    echo "num is $i"
    done

    # 输入: sh test.sh 10 20 30
    # 输出:
    # num is 10 20 30
    # num is 10
    # num is 20
    # num is 30

    SUM=0
    for(( i=1; i<=$1; i++))
    do
    SUM=$[$SUM+$i]
    done
    echo "sum is $SUM"
  2. while 循环

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    SUM=0
    i=0
    while [ $i -le $1]
    do
    SUM=$[$SUM+$i]
    i=$[$i+1]
    done
    echo "sum is $SUM"

控制台交互式输入

指令read,参数-p,提示语句,-t,读取参数时的等待时间(秒)。-t参数在Ubuntu里面貌似会报错。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
read -p "plase input num1=" num1
echo "num1=$num1"

read -p "plase input num2=" num2
echo "num2=$num2"

# 执行:sh test.sh
# 输入: 10 20
# 输出:
# plase input num1=10
# num1=10
# plase input num2=20
# num2=20

函数相关

  1. 系统函数

    1. basename——返回文件名;

      1
      basename /home/hello.txt # 打印hello.txt
    2. dirname——返回除去文件名后剩下的绝对路径

      1
      dirnaem /home/hello.txt # 打印/home
  2. 自定义函数

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/bin/bash
    funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
    }
    funWithReturn
    echo "输入的两个数字之和为 $? !"

    :<<!
    输出:
    这个函数会对输入的两个数字进行相加运算...
    输入第一个数字:
    1
    输入第二个数字:
    2
    两个数字分别为 1 和 2 !
    输入的两个数字之和为 3 !
    !

    apt相关指令

    sudo apt-get update ** 更新源**

    sudo apt-get install package 安装包

    sudo apt-get remove package 删除包

    sudo apt-cache search package 搜索软件包

    sudo apt-cache show package 获取包的相关信息:大小、说明、版本

    sudo apt-get install package --reinstall 重新安装包

    sudo apt-get -f install 修复安装

    sudo apt-get remove package --purge 删除包,包括配置文件等

    sudo apt-get build-dep package 安装相关的编译环境

    sudo apt-get upgrade 更新已安装的包

    sudo apt-get source package 下载该包的源代码