Linux编程基础

一、基础

1. 文件与目录结构

Linux系统中一切皆文件,根目录为/,在下面有/root、/bin、/boot、/dev、/usr等目录,各目录的作用如下:

fbeffb9c5eac725de241005d22f72bbe.png

/bin 是Binary的缩写,存放最常使用的二进制命令。
/sbin 是系统级的二进制命令,存放的是系统管理员可以用的命令。
/lib 是库目录,存放跟文件系统中的程序运行所需要的共享库及内核模块。
/lib64 lib用于32位系统,lib64用于64位系统。
/boot 存放的是Linux的启动文件和内核。
/dev 存放Linux系统中使用的外部设备,Linux将所有设备认成是一个文件。
/etc 存放系统主要的配置文件,如用户的账号密码文件等。
/home 宿主目录,一个用户登录系统,所处的位置就是/home,home下没有root用户。
/root root用户的目录。
/opt 是主机额外安装软件所摆放的目录。
/media 连接可移动媒体(如U盘)时,通过此目录访问可移动媒体的内容。
/mnt 与/media目录类似,需要系统管理员手动挂载文件系统。
/proc 该目录包含有关当前正在运行的进程和内核参数的信息。
/srv 该目录包含系统提供的服务的数据。
/sys 存放系统硬件信息。
/tmp 临时目录,用于临时存放数据。
/var 程序存储运行时信息的地方,比如系统日志、用户跟踪等。
/usr 该目录中保存所有可执行文件、库和大多数系统程序的源代码。
2. vi/vim编辑器

vim是vi的升级版,vim有三种常见的模式:

  1. 正常模式

    在正常模式下, 我们可以使用快捷键。

    以vim打开一个文档就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用『上下左右』 按键来移动光标, 你可以使用『删除字符』 或『删除整行』 来处理档案内容, 也可以使用『复制、 贴上』 来处理你的文件数据.

  2. 编辑模式

    在模式下, 程序员可以输入内容。
    按下 i, I, o, O, a, A, r, R 等任何一个字母之后才会进入编辑模式, 一般来说按 i 即可。

  3. 命令行模式

    在这个模式当中, 可以提供你相关指令, 完成读取、 存盘、 替换、 离开 vim 、 显示行号等的动作则是在此模式中达成的!

    vim常用命令

3. 网络配置

网络常用配置:

  1. 查看所有网络接口的配置信息
ifconfig 显示所有网络接口的配置信息
root@VM-4-8-ubuntu:/etc# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.4.8  netmask 255.255.252.0  broadcast 10.0.7.255
        inet6 fe80::5054:ff:fe24:cc03  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:24:cc:03  txqueuelen 1000  (Ethernet)
        RX packets 14800582  bytes 1857437496 (1.8 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 15571445  bytes 4575245503 (4.5 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1403230  bytes 2947650466 (2.9 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1403230  bytes 2947650466 (2.9 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  1. 测试网络连通性
ping www.bai.com
  1. 查看tcp连接状态
netstat

netstat是在内核中访问网络连接状态及其相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。

(base) ➜  ~ netstat
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  macbook-pro-yue.58849  ta-in-f95.1e100..https SYN_SENT   
tcp4       0      0  localhost.31181        localhost.58848        ESTABLISHED
tcp4       0      0  localhost.58848        localhost.31181        ESTABLISHED
tcp4       0      0  macbook-pro-yue.58815  ta-in-f95.1e100..https SYN_SENT   
tcp4       0      0  localhost.31181        localhost.58814        ESTABLISHED
tcp4       0      0  localhost.58814        localhost.31181        ESTABLISHED
tcp4       0      0  macbook-pro-yue.58701  ta-in-f95.1e100..https SYN_SENT   
tcp4       0      0  localhost.31181        localhost.58700        ESTABLISHED
tcp4       0      0  localhost.58700        localhost.31181        ESTABLISHED
tcp4       0      0  macbook-pro-yue.58587  116.207.137.26.https   ESTABLISHED
tcp4       0      0  localhost.31181        localhost.58586        ESTABLISHED
tcp4       0      0  localhost.58586        localhost.31181        ESTABLISHED
tcp4       0      0  macbook-pro-yue.58553  42.194.252.127.https   ESTABLISHED
tcp4       0      0  macbook-pro-yue.58517  14.18.175.36.https     ESTABLISHED
tcp4       0      0  macbook-pro-yue.58372  116.207.137.26.https   ESTABLISHED
tcp4       0      0  localhost.31181        localhost.58371        ESTABLISHED
tcp4       0      0  localhost.58371        localhost.31181        ESTABLISHED
tcp4       0      0  localhost.31181        localhost.58369        FIN_WAIT_2 
tcp4      31      0  localhost.58369        localhost.31181        CLOSE_WAIT 
tcp4       0      0  macbook-pro-yue.58367  14.215.177.39.https    ESTABLISHED
tcp4       0      0  localhost.31181        localhost.58366        FIN_WAIT_2 
tcp4      31      0  localhost.58366        localhost.31181        CLOSE_WAIT 
tcp4       0      0  macbook-pro-yue.58365  14.215.177.39.https    ESTABLISHED
tcp4       0      0  localhost.31181        localhost.58355        ESTABLISHED
tcp4       0      0  localhost.58355        localhost.31181        ESTABLISHED
tcp4       0      0  localhost.31181        localhost.58354        ESTABLISHED
tcp4       0      0  localhost.58354        localhost.31181        ESTABLISHED
tcp4       0      0  macbook-pro-yue.58324  14.215.177.39.https    ESTABLISHED
tcp4       0      0  localhost.31181        localhost.58323        ESTABLISHED
tcp4       0      0  localhost.58323        localhost.31181        ESTABLISHED
tcp4       0      0  macbook-pro-yue.58290  ta-in-f95.1e100..https SYN_SENT   
tcp4       0      0  localhost.31181        localhost.58289        CLOSE_WAIT 
tcp4       0      0  localhost.58289        localhost.31181        FIN_WAIT_2 
tcp4       0      0  macbook-pro-yue.58288  119.100.50.33.https    ESTABLISHED
tcp4       0      0  macbook-pro-yue.58287  119.100.50.33.https    ESTABLISHED
tcp4       0      0  macbook-pro-yue.58286  119.100.50.33.https    ESTABLISHED
tcp4       0      0  macbook-pro-yue.58285  119.100.50.33.https    ESTABLISHED
tcp4       0      0  localhost.31181        localhost.58284        ESTABLISHED
tcp4       0      0  localhost.58284        localhost.31181        ESTABLISHED
tcp4       0      0  localhost.31181        localhost.58283        ESTABLISHED
tcp4       0      0  localhost.58283        localhost.31181        ESTABLISHED
tcp4       0      0  localhost.31181        localhost.58282        ESTABLISHED
tcp4       0      0  localhost.58282        localhost.31181        ESTABLISHED
4. 系统管理
  1. service(CentOS 6)

    计算机中,一个正在执行的程序或命令,被叫做“进程”(process)。 启动之后一只存在、常驻内存的进程,一般被称作“服务”(service)。

    service 服务名 start | stop |· restart | status
    
    # 查看网络服务状态
    service network status
    # 停止网络服务
    service network stop
    # 启动网络服务
    service network start
    # 重启网络服务
    service network restart
    
  2. chkconfig(CentOS 6)

    设置后台服务的开机自启

    # 查看所有服务器自启配置
    chkconfig
    # 关掉指定服务的自动启动
    chkconfig 服务名 off
    # 开启指定服务的自动启动
    chkconfig 服务名 on
    # 查看开机启动状态
    chkconfig 服务名 --list
    
  3. systemctl(CentOS 7)

    systemctl start | stop | restart | status 服务名
    
    # 查看防火墙状态
    systemctl status firewalld
    # 停止防火墙
    systemctl stop firewalld
    # 启动防火墙
    systemctl start firewalld
    # 重启防火墙
    systemctl restart firewalld
    
    systemctl list-unit-files 查看服务开机启动状态
    systemctl disable service_name 关掉指定服务的自动启动
    systemctl enable service_name 开启指定服务的自动启动
    
  4. 关机重启命令

    在 linux 领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机。

    # 将数据由内存同步到硬盘中 
    sync
    # 重启
    reboot
    # 停机(不断电) 
    halt
    # 计算机将在 1 分钟后关机,并且会显示在登录用户的当前屏幕中 
    shutdown -h 1 ‘This server will shutdown after 1 mins’
    # 立马关机(等同于 poweroff) 
    shutdown -h now
    # 系统立马重启(等同于 reboot)
    shutdown -r now
    
5. 远程登录

通常在工作过程中,公司中使用的真实服务器或者是云服务器,都不允许除运维人员之外的员工直接接触,因此就需要通过远程登录的方式来操作。所以,远程登录工具就是必不可缺的,目前,比较主流的有 Xshell, SSH Secure Shell, SecureCRT,FinalShell, Termius等,同学 们可以根据自己的习惯自行选择.

二、实操

Shell 可以看作是一个命令解释器,为我们提供了交互式的文本控制台界面。我们可以通过终端控制台来输入命令,由 shell 进行解释并最终交给内核执行。下面是常用的shell命令。

1. 文件目录
pwd 查看当前工作目录的绝对路径
ls 列出目录的内容
cd 切换路径
mkdir 创建目录
rmdir 删除空目录
touch 创建文件
cp 复制文件或目录
rm 删除文件或目录
mv 移动文件与目录或重命名
cat 查看文件内容
more 文件内容分屏查看
less 分屏显示文本内容
echo 输出内容到控制台
head 显示文件头部内容
tail 显示文件尾部内容
ls -l > a.txt 列表的内容写入a.txt文件中(覆盖写)
ls -l >> a.txt 列表的内容写入a.txt文件中(追加写)
echo hello >> a.txt

软连接:软链接也称为符号链接,类似于 windows 里的快捷方式,有自己的数据块,主要存放了链接其他文件的路径。

ln -s [原文件或目录][软连接名]
history 查看历史命令
2. 时间日期
data 查看当前时间
cal 查看日历
3. 用户管理
  1. useradd 添加新用户

    useradd 用户名 # 添加新用户
    useradd -g 组名 用户名 # 添加新用户到某个组)
    
  2. passwd 设置用户密码

    passwd 用户名 # 设置用户密码
    
  3. id 查看用户是否存在

    id 用户名 # 查看用户是否存在
    
  4. cat /etc/passwd 查看创建了哪些用户

    cat /etc/passwd
    
  5. su 切换用户

    su 用户名称 # 切换用户,只能获得用户的执行权限,不能获得环境变量
    su -用户名称 # 切换到用户并获得该用户的环境变量及执行权限量
    
  6. userdel 删除用户

    userdel 用户名 # 删除用户但保留用户主目录
    userdel -r 用户名 # 删除用户和用户主目录
    
  7. who 查看登录用户信息

    whoami # 显示自身用户名称
    who am i # 显示登录用户的用户名以及登陆时间
    
  8. sudo 设置普通用户具有root权限

    # 创建一个普通用户
    useradd user1
    passwd user1
    # 修改配置文件
    vim /etc/sudoers
    
    ## Allow root to run any commands anywhere
    root       ALL=(ALL)     ALL
    user1   ALL=(ALL)     NOPASSWD:ALL
    
    # 普通用户user1可以使用sudo
    sudo mkdir module
    
  9. usermod 修改用户

    usermod -g 用户组 用户名
    
4. 文件权限

Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。 为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做 了不同的规定。在Linux中我们可以使用ll或者ls -l命令来显示一个文件的属性以及文件所属 的用户和组。

  1. 查看文件权限
root@VM-4-8-ubuntu:/etc# ls -l
total 968
drwxr-xr-x 3 root root    4096 Nov  9 19:28 acpi
-rw-r--r-- 1 root root    3028 Apr 23  2020 adduser.conf
drwxr-xr-x 2 root root    4096 Mar 25 14:18 alternatives
drwxr-xr-x 3 root root    4096 Jan  4  2021 apache2
drwxr-xr-x 3 root root    4096 Nov  9 17:01 apparmor
drwxr-xr-x 7 root root    4096 Nov  9 17:01 apparmor.d
drwxr-xr-x 3 root root    4096 Nov  9 17:02 apport
drwxr-xr-x 7 root root    4096 Nov 15 14:30 apt
-rw-r----- 1 root daemon   144 Nov 13  2018 at.deny
-rw-r--r-- 1 root root    2371 Mar 24 23:56 bash.bashrc
-rw-r--r-- 1 root root      45 Jan 26  2020 bash_completion
drwxr-xr-x 2 root root    4096 Nov  9 17:02 bash_completion.d
drwxr-sr-x 2 root bind    4096 Nov  9 17:01 bind
-rw-r--r-- 1 root root     367 Apr 15  2020 bindresvport.blacklist
1. 0首位表示类型,-代表文件,d代表目录,l代表链接文档。
2. 第1-3位确定属主(该文件的所有者)拥有该文件的权限。---User
3. 第4-6位确定属组(所有者的同组用户)拥有该文件的权限,---Group
4. 第7-9位确定其他用户拥有该文件的权限 ---Other
  1. 改变文件权限
# 方式一
chmod {u/g/o/a} {+/-/=} {r/w/x} 文件或目录
# 含义
u: user; g: group; o: other; a: all
r: read; w: write; x: execute
# 实例
chmod u+x a.sh
chmod a+r a.sh
chmod o-r, u-w a.sh
# 方式二
chmod [mode=421] 文件或目录
# 含义
r=4 w=2 x=1 rwx = 4+2+2 = 7
第一位为用户权限、第二位为组权限、第三位为其他用户权限
# 实例
chmod 777 a.txt
  1. 改变文件所有者chown
chown user1 a.sh
  1. 改变所属组chgrp
chown group1 a.sh
5. 搜索查找
  1. find查找文件或者目录

    find 指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件显示在终端。

    # 按照名称寻找
    find local/ -name "*.txt"
    # 按照用户寻找
    find / -user user1
    # 按照文件大小查找
    find /home -size +204800
    
  2. locate快速定位文件路径

    locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给 定的文件。Locate 指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新 locate 时刻。

    # 查询文件夹
    updatedb
    locate tmp
    
  3. grep过滤查找及“|”管道

    管道符,“|”,表示将前一个命令的处理结果输出传递给后面的命令处理。

    # grep 选项 查找内容 源文件
    ls | grep -n a.txt
    
6. 压缩解压缩
gzip/gunzip # 压缩解压缩,不能压缩目录、不保留原文件
zip/unzip # 压缩解压缩,在linux/windows通用,可以压缩目录且保留原文件
tar [选项] xxx.tar.gz # 打包目录,压缩后的文件格式.tar.gz
-c 产.tar打包文件
-v 显示详细信息
-f 执行压缩后的文件名
-z 打包同时压缩
-x 解压.tar文件
-C 解压到执行目录
7. 磁盘分区
  1. 查看文件和目录占用的磁盘空间-du

    du 目录/文件 # 显示目录下每个子目录的磁盘使用情况
    
  2. 查看磁盘空间使用情况-df

    df 选项 # 列出文件系统的整体磁盘使用量,检查文件系统的磁盘空间占用情况
    
    root@VM-4-8-ubuntu:/etc# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    udev            1.9G     0  1.9G   0% /dev
    tmpfs           394M  736K  393M   1% /run
    /dev/vda2        79G  4.3G   72G   6% /
    tmpfs           2.0G   24K  2.0G   1% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
    tmpfs           394M     0  394M   0% /run/user/0
    
  3. 查看设备挂载情况-lsblk

    lsblk # 查看设备挂载情况
    
  4. 查看分区-fdisk

    fdisk -l # 查看磁盘分区详情
    fdisk 硬盘设备名 # 对新增硬盘进行分区操作
    
8. 进程管理
  1. 查看当前系统进程状态-ps

    ps aux | grep xxx # 查看系统中所有进程
    ps -ef | grep xxx # 查看父子进程之间的关系
    
    a # 列出所有用户进程
    x # 列出当前用户所有进程
    u # 面向用户友好的显示风格
    -e # 列出所有进程
    -u # 列出某个用户关联的所有进程
    -f # 显示完整格式的进程列表
    

    如果想查看进程的 CPU 占用率和内存占用率,可以使用aux; 如果想查看进程的父进程ID可以使用ef;

  2. 终止进程-kill

    kill [选项]进程号 # 通过进程号杀死进程
    killall 进程名称 # 通过进程名称杀死进程,也支持通配符,这在系统负载很大而变慢是很有用
    
  3. 查看进程树-pstree

    pstree [选项]
    
  4. 实时监控系统进程状态-top

    top - 16:12:33 up 39 days,  2:31,  1 user,  load average: 0.00, 0.00, 0.00
    Tasks: 117 total,   1 running, 113 sleeping,   3 stopped,   0 zombie
    %Cpu(s):  0.5 us,  0.2 sy,  0.0 ni, 99.2 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
    MiB Mem :   3931.2 total,    899.2 free,    880.6 used,   2151.4 buff/cache
    MiB Swap:      0.0 total,      0.0 free,      0.0 used.   2767.3 avail Mem 
    
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                                                   
      61695 root      20   0 1096980 111956  30860 S   1.0   2.8 376:05.73 YDService                                                                                                                                 
        960 root      20   0   24600  10060   7132 S   0.3   0.2  63:55.84 tat_agent                                                                                                                                 
      50395 root      20   0 3705852 606064  30928 S   0.3  15.1  73:05.02 java                                                                                                                                      
     511515 root      20   0  494272  16860   4356 S   0.3   0.4  75:20.75 barad_agent                                                                                                                               
          1 root      20   0  168504  12580   8348 S   0.0   0.3   0:33.43 systemd                                                                                                                                   
          2 root      20   0       0      0      0 S   0.0   0.0   0:01.51 kthreadd                                                                                                                                  
          3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                                                                                                                                    
          4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp                                                                                                                                
          6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H                                                                                                                              
          9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq                                                                                                                              
         10 root      20   0       0      0      0 S   0.0   0.0   0:09.97 ksoftirqd/0                                                                                                                               
         11 root      20   0       0      0      0 I   0.0   0.0   3:06.57 rcu_sched                                                                                                                                 
         12 root      rt   0       0      0      0 S   0.0   0.0   0:11.47 migration/0                                                                                                                               
         13 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/0                                                                                                                             
         14 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0                                                                                                                                   
         15 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1                                                                                                                                   
         16 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/1                                                                                                                             
         17 root      rt   0       0      0      0 S   0.0   0.0   0:10.40 migration/1                                                                                                                               
         18 root      20   0       0      0      0 S   0.0   0.0   0:10.34 ksoftirqd/1                                                                                                                               
         20 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/1:0H-kblockd                                                                                                                      
         21 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kdevtmpfs                                                                                                                                 
         22 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 netns             
    
  5. 查看网络状态和端口号占用信息-netstat

    netstat -anp | grep 进程号 # 查看该进程网络信息
    netstat -nlp | grep 端口号 # 查看网络端口号占用情况
    
    -a # 显示所有正在监听和未监听的套接字
    -n # 拒接显示别名,能显示数字的全部转化为数字
    -l # 仅列出在监听的服务状态
    -p # 表示显示哪个进程在调用
    
  6. 系统定时任务

    crontab [选项]
    
    -e # 编辑crontab定时任务
    -l # 查询crontab任务
    -r # 删除当前用户所有的crontab任务
    
9. IO情况
  1. 查看磁盘IO读写情况

    iotop
    iostat
    

三、软件包管理

1. RPM

RPM(RedHat Package Manager),RedHat软件包管理工具,类似windows里面的setup.exe 是Linux这系列操作系统里面的打包安装工具,它虽然是RedHat的标志,但理念是通用的。

RPM包的名称格式 Apache-1.3.23-11.i386.rpm

- “apache” 软件名称
- “1.3.23-11”软件的版本号,主版本和此版本
- “i386”是软件所运行的硬件平台,Intel 32位处理器的统称
- “rpm”文件扩展名,代表RPM包
  1. RPM查询命令

    rpm -qa | grep rmp软件包 # 查看安装的rpm软件包
    
  2. RPM卸载

    rpm -e RPM软件包 # 卸载软件包并检查依赖
    rpm -e --nodeps 软件包 # 卸载软件包不检查依赖
    
  3. RPM安装

    rpm -ivh RPM包全名
    
    rpm -ivh firefox-45.0.1-1.el6.centos.x86_64.rpm
    
2. YUM

YUM(全称为 Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包 并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次 次下载、安装。

YUM类似于Java开发中的Maven工具,可以从镜像网站上下载应用进程,并直接安装。

yum [选项][参数]
-y # 对所有提问都回答yes
install # 安装rpm软件包
update # 更新rpm软件包
check-update # 检查是否有可更新的rpm软件包
remove # 删除指定的rpm软件包
list # 显示软件包信息
clean # 清理过期的缓存
deplist # 显示yum软件包的所有依赖关系
yum -y install firefox

修改yum源

默认的系统 YUM 源,需要连接国外 apache 网站,网速比较慢,可以修改关联的网络

YUM 源为国内镜像的网站,比如网易163,aliyun 等。

# 安装wget,用wget来下载文件
yum install wget
# 在/etc/yum.repos.d/目录下,备份默认的repos文件
cd /etc/yum.repos.d
cp CentOS-Base.repo CentOS-Base.repo.backup
# 下载阿里云的repos文件
wget http://mirros.aliyun.com/repo/Centos-7.repo
# 替换repos文件
mv Centos-7.repo CentOS-Base.repo
# 清理就缓存数据,缓存新数据
yum clean all
yum makecache
四、Shell编程
1. 入门

创建一个脚本,并执行。

touch test.sh
vim test.sh
#!/bin/bash
echo "helloworld"
bash ./test.sh

也可以直接执行,但是要先授予权限

chmod +x test.sh
test.sh
2. 变量
  1. 常用系统变量

    H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER等

  2. 案例实操

    echo $HOME
    # 显示当前shell中所有变量:set
    set
    
  3. 自定义变量

    定义变量:变量名=变量值

    撤销变量:unset 变量名

    声明静态变量:readonly 变量,注意:不能 unset

    # 声明A变量并重新赋值,撤销
    A=5
    echo $A
    5
    
    A=8
    echo $A
    8
    
    unset A
    echo $A
    
    # 变量默认类型都是字符串
    C=1+2
    echo $C
    1+2
    
    # 变量的值如果有空格,需要使用双引号或单引号括起来
    D='I love you'
    echo $D
    I love you
    
    # 可以把变量提升为全局环境变量,可供其他shell程序使用
    export 变量名
    
  4. 特殊变量、参数传递

    n 、 n、 n#、 ∗ 、 *、 @、$?

    $n (功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以
    上的参数,十以上的参数需要用大括号包含,如${10}).
    
    $# (功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及
    加强脚本的健壮性).
    
    $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
    $@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
    
    $? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
    ./test.sh
    echo $?
    0
    
3. 运算符

基本语法: ( ( 运 算 式 ) ) 或 ((运算式))或 (())[运算式]

# 计算(2+3)* 4
S=$[(2+4)*4]
echo $S
4. 条件控制

基本语法:test condition或[ condition ]

常用判断条件

# 两个正数之间比较
-eq equal
-lt less than
-gt greater than
-ne not equal
-le less equal
-ge greater equal
# 按照文件权限进行判断
-r 
-w
-x
# test.sh是否有执行权限
[ -x test.sh ]
echo $?
# 按照文件类型判断
-e 文件存在
-f 文件存在并且是一个常规的文件
-d 文件存在并且是一个目录
5. 流程控制
  1. if

    if condition1
    then
        command1
    elif condition2 
    then 
        command2
    else
        commandN
    fi
    
  2. case

    casein
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac
    
  3. for

    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
        commandN
    done
    
  4. while

    while condition
    do
        command
    done
    
6. 函数

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

shell中函数的定义格式如下:

[ function ] funname [()]

{

    action;

    [return int;]

}

实例

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

(1)必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一

样先编译。

(2)函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将

以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)

7. 正则表达式

正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文 本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中,grep, sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配。

  1. 常规匹配

    一串不包含特殊字符的正则表达式匹配它自己,如匹配所有包含user1的行:

    cat /etc/passwd | grep user1
    
  2. 常用特殊字符

    # ^ 匹配一行的开头
    cat /etc/passwd | grep ^a # 匹配所有以a开头的行
    # $ 匹配一行的结束
    cat /etc/passwd | grep t$ # 匹配所有t结尾的行
    # . 匹配一个任意字符
    cat /etc/passwd | grep r..t # 匹配如rabt, rbbt, rxdt, root等所有的行
    # * 匹配上一个字符0次或多次
    cat /etc/passwd | grep ro*t # 匹配rt,rot, root, rooot等所有行
    
  3. 字符区间

    []表示匹配某个范围内的一个字符
    [6,8] -- 匹配6或者8
    [0-9] -- 匹配一个0-9的数字
    [0-9]* -- 匹配任意长度的数字字符串
    [a-z] -- 匹配一个a-z之间的字符
    [a-z]* -- 匹配任意长度的字母字符串
    
  4. 转义字符\

    \表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配
    某一特殊字符本身时(例如,我想找出所有包含 ‘$’ 的行),就会碰到困难。此时我们就要
    将转义字符和特殊字符连用,来表示特殊字符本身,例如

    cat /etc/passwd | grep 'a\$b'
    

    会匹配所有包含a$b的行,需要使用单引号将表达式括起来。

8. 文本处理
  1. cut

    cut命令用于显示每行从开头算起 num1 到 num2 的文字。

    cut  [-bn] [file]
    cut [-c] [file]
    cut [-df] [file]
    
    -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
    -c :以字符为单位进行分割。
    -d :自定义分隔符,默认为制表符。
    -f :与-d一起使用,指定显示哪个区域。
    -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除
    
  2. awk

    一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

    awk        [选项参数]    ‘/pattern1/{action1}        /pattern2/{action2}...’    filename 
    pattern:表示  awk  在数据中查找的内容,就是匹配模式
    action:在找到匹配内容时所执行的一系列命令
    
    -F fs or --field-separator fs
    指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
    -v var=value or --asign var=value
    赋值一个用户定义变量。
    -f scripfile or --file scriptfile
    从脚本文件中读取awk命令。
    -mf nnn and -mr nnn
    对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
    -W compact or --compat, -W traditional or --traditional
    在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
    -W copyleft or --copyleft, -W copyright or --copyright
    打印简短的版权信息。
    -W help or --help, -W usage or --usage
    打印全部awk选项和每个选项的简短说明。
    -W lint or --lint
    打印不能向传统unix平台移植的结构的警告。
    -W lint-old or --lint-old
    打印关于不能向传统unix平台移植的结构的警告。
    -W posix
    打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
    -W re-interval or --re-inerval
    允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
    -W source program-text or --source program-text
    使用program-text作为源代码,可与-f命令混用。
    -W version or --version
    打印bug报告信息的版本。
    

参考手册:https://www.runoob.com/linux/linux-tutorial.html

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值