知识

【Linux基础】基础命令使用及简单shell编程(centos7)

0x01 基础命令

菜鸟教程 :

https://www.runoob.com/linux/linux-tutorial.html

1. 压缩命令

  • 基本命令

    这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。
    -c: 建立压缩档案
    -x:解压
    -t:查看内容
    -r:向压缩归档文件末尾追加文件
    -u:更新原压缩包中的文件

下面的参数是根据需要在压缩或解压档案时可选的。
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出

参数-f是必须的
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

  • 常用方法

    tar -jcvf XX//压缩为.tar.bz2格式
    tar -jxvf XX.tar.bz2//解压.tar.bz2格式文件
    tar -zcvf XX//先将文件打包为.tar格式,再压缩为.gz格式,最终为.tar.gz文件
    tar -zxvf XX.tar.gz//解压.tar.gz格式文件

2. 链接命令ln

ln -s [原文件] [目标文件]
ln-->link
-s //创建软链接

3. mount挂载命令

  • 查询与自动挂载

    mount //查询已经挂载的设备
    mount -a //依据/etc/fstab配置文件的内容,自动挂载

  • 挂载命令格式

    mount [-t 文件系统] [-o 特殊设备] 设备文件名 挂载点

  • 挂载光盘

    mkdir /mnt/cdrom //建立挂载点
    mount -t iso9660 /dev/cdrom /mnt/cdrom/ //挂载光盘

  • 卸载命令

    umount 设备文件名或挂载点

  • 挂载U盘

    fdisk -l //查看U盘设备文件名
    mount -t vfat /dev/sdb1 /mnt/usb/

    4. 帮助命令

  • man

    1: 查看命令的帮助
    2:查看可被内核调用的函数的帮助
    3:查看函数和函数库的帮助
    4:查看特殊文件的帮助(主要是/dev目录下的文件)‘
    5:查看配置文件的帮助
    6:查看游戏的帮助
    7:查看其它杂项的帮助
    8:查看系统管理员可用命令的帮助
    9:查看和内核相关文件的帮助

  • 查看命令拥有哪个级别的帮助

    man -f 命令
    或whatis 命令
    eg man -5 passwd

  • 选项帮助

    命令 --help//获取命令选项的帮助

  • shell内部命令帮助

    help shell内部命令//获取shell内部命令的帮助
    whereis cd//确定cd是否为shell内部命令
    help cd//获取内部命令帮助

  • 详细命令帮助info

    info 命令

    • 回车 //进入子帮助页面(带有*号标记)
    • u //进入上层页面
    • n //进入下一个帮助小节
    • p //进入上一个帮助小节
    • q //退出

5. 查找用户

  • 查看登录用户信息

who 用户名
命令输出:

  • 用户名
  • 登录终端
  • 登录时间(登录来源IP)
  • W查看登录用户信息
    w 用户名

命令输出:

  • USER:登录的用户名
  • TTY: 登录终端
  • FROM:来源IP
  • LOGIN@:登录时间
  • IDLE:用户闲置时间
  • JCPU: 指的是和该终端连接的所有进程占用的时间。这个时间不包括过去的后台作业时间,但却包括当前正在运行的后台作业所占用的时间
  • PCPU:指当前进程所占用的时间
  • WHAT:当前正在运行的命令
  • 查询当前登录和过去登录的用户信息

    last
    last命令默认读取/var/log/wtmp文件的数据
    命令输出

    • 用户名
    • 登录终端
    • 登录IP
    • 登录时间
    • 退出时间(在线时间)
  • 查看所有用户的最后一次登录时间

    lastlog
    last命令默认读取/var/log/lastlog文件的数据
    命令输出

    • 用户名
    • 登录终端
    • 登录IP
    • 最后一次登录时间

6. 别名

  • alias

    查看系统中所有命令的别名
    alias 别名 = '原命令'//设定别名

  • 别名永久生效与删除别名

    vi ~/.bashrc //写入环境变量配置文件
    unalias 别名//删除别名
    source .bashrc//生效

  • 命令生效顺序

    第一顺位执行用绝对路径或相对路径执行的命令
    第二顺位执行别名
    第三顺位执行bash的内部命令
    第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令

7. 常用快捷键

  • ctrl + c //强制终止当前命令
  • ctrl + l //清屏
  • ctrl + a //光标移到命令行首
  • ctrl + e //光标移到命令行尾
  • ctrl + u //从光标所在位置删除到行首
  • ctrl + z //把命令放入后台
  • ctrl + r //在命令历史中搜索
    Tab键 //命令与文件名补齐

8. 历史命令

  • history [选项] [历史命令保存文件]

    -c : 清空历史命令
    -w : 把缓存中的历史命令写入历史命令保存文件~/.bash_history

  • 历史命令调用

    使用上下箭头调用以前的历史命令
    使用"!n" 重复执行第n条历史命令
    使用"!!"重复执行上一条命令
    使用"!字符串" 重复执行最后一条以该字符串开头的命令

9. 输出重定向

  • 标准输入输出
设备 设备文件名 文件描述符 类型
键盘 /dev/stdin/ 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出
  • 输出重定向

    正确输出和错误输出同时保存
    命令 > 文件 2>&1//以覆盖的方式,把正确输出和错误输出都保存到同一个文件
    命令 >> 文件 2>&1//以追加的方式,把正确输出和错误输出都保存到同一个文件
    命令 &> 文件//以覆盖的方式,把正确输出和错误输出都保存到同一个文件
    命令 &>>文件//以追加的方式,把正确输出和错误输出都保存到同一个文件
    命令 >>文件1 2>>文件2 //把正确的输出追加到文件1,把错误的输出追加到文件2
    eg: ls &>/dev/null //输出到垃圾桶

10. 输入重定向

wc [选项] [文件名]
选项:

 -c 统计字节数
 -w 统计单词数
 -l 统计行数

命令 < 文件 //把文件作为命令的输入
命令 <<标识符 //把标识符之间的内容作为命令的输入

11. 管道符

  • 多命令执行
多命令执行符 格式 作用
; 命令1; 命令2 多命令顺序执行
&& 命令1&&命令2 逻辑与:当命令1正确执行,则命令2才会执行;当命令1执行不正确,则命令2不会执行
|| 命令1||命令2 逻辑或:当命令1执行不正确,则命令2才会执行;当命令1正确执行,则命令2不会执行
  • 管道符

    命令1 | 命令2 //命令1的正确输出作为命令2的操作对象

12. 通配符

  • 通配符
通配符 作用
匹配一个任意字符
* 匹配0个或任意多个字符,也可以是匹配任何内容
[] 匹配中括号中任意一个字符,如[abc]
[-] 匹配中括号中任意一个字符,如[a-z]
[^] 逻辑非,表示匹配不是中括号内的一个字符。如[^0-9]代表匹配一个不是数字的字符
  • bash中其他特殊符号
符号 作用
' ' 单引号。在单引号中所有的特殊符号,如$、`(反引号) 都没有特殊含义
" " 双引号:在双引号中特殊字符无特殊含义,除了$、`(反引号)和\(反斜杠),拥有调用变量的值、引用命令和转义符的特殊含义
\ \ 反引号:括起来的内容是系统命令,在bash中会先执行它。和$()作用一样
$() 和反引号作用一样,用来引用系统命令
# 在shell脚本中,#开头的行代表注释
$ 用于调用变量的值,如需要PATH的值时,需要用$PATH的方式得到变量的值
| 转义符如\$将输出$符号,而不是变量引用
  • 值调用

    echo \ls\
    echo $(date)

13. 网络信息

  • 查看本机启用的端口

    netstat -an
    选项:
    -a :查看所有连接和监听的端口
    -n :显示IP地址和端口号,而不显示域名和服务名

  • ifconfig:查看与配置网络状态命令

    ifconfig eth0 192.168.1.200 netmask 255.255.255.0
    //临时配置eth0网卡的IP地址与子网掩码

  • 网卡信息文件

    vi /etc/sysconfig/network-scripts/ifcfg-eth0

  • 主机名文件

    vi /etc/sysconfig/network
    hostname [主机名]//查看与临时设置主机名

  • DNS配置文件

    vi /etc/resolv.conf

  • ping [选项] ip或域名

    -c 次数:指定ping包的次数
    探测指定IP或域名的网络状况

  • 启动网卡

    vi /etc/sysconfig/network-scripts/ifcfg-eth0
    把ONBOOT=no改为ONBOOT=yes
    service network restart//重启网络服务

  • 修改UUID

    1)vi /etc/sysconfig/network-scripts/ifcfg-eth0
    //删除MAC地址行
    2)rm -rf /etc/udev/rules.d/70-persistent-net.rules
    //删除网卡和MAC地址绑定绑定文件
    3)重启系统

  • 关闭与启动网卡

    ifdown 网卡设备名//禁用该网卡设备
    ifup 网卡设备名//启用该网卡设备

  • 查询网络状态

    netstat 选项
    选项:

     -t :列出所有TCP协议端口
     -u :列出所有UDP协议端口
     -n :不使用域名与服务名,而使用IP地址和端口号
     -l :仅列出在监听状态的网络服务
     -a :列出所有网络连接

    netstat -rn
    选项-r :列出路由列表,和route命令一致

  • route命令

    route -n//查看路由列表(可见网关)
    route add default gw 192.168.1.1//临时设定网关

  • telnet 命令

    telnet [域名或IP] [端口]//远程管理与端口探测命令
    telnet 192.168.0.252 80

  • traceroute

    traceroute [选项] IP或域名//路由跟踪命令
    -n 使用IP,不使用域名,更快

  • wget

    wget [选项] url //下载命令
    -O:下载文件到对应目录,并且修改文件名称

  • tcpdump

    tcpdump -i eth0 -nnX port 21
    -i: 指定网卡接口
    -nn:将数据包中的域名与服务转为IP和端口
    -X:以十六进制和ASCii码显示数据包内容
    port:指定监听端口

  • SSH命令

    ssh 用户名@ip//远程管理指定Linux服务器
    scp [-r] 用户名@ip:文件路径 本地路径 //下载文件
    scp [-r] 本地文件 用户名@ip:上传路径 //上传文件

14. 环境变量

  • 环境变量与用户自定义变量的区别

    用户自定义变量只在当前的shell中生效
    环境变量在当前shell和这个shell的所有的子shell中生效

  • 设置环境变量

export 变量名 = 变量值
或变量名 = 变量值,export 变量名

  • 查看环境变量

set //查看所有变量
env //查看环境变量

  • 常用环境变量

HOSTNAME:主机名
SHELL:当前的shell
TERM:终端环境
HISTSIZE:历史命令条数
SSH_CLIENT:当前操作环境是用SSH连接,记录客户端IP
SSH_TTY:ssh连接的终端pts/1
USER:当前登录的用户

  • PATH

PATH:系统查找命令的路径
echo $PATH//查看PATH环境变量
PATH="$PATH:/root/sh"//增加PATH的值

  • PS1环境变量

PS1变量:命令提示符设置
\d:显示日期,格式为“星期 月 日”
\H:显示完整的主机名
\t:显示24小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\$:提示符。如果是root用户会显示提示符为"#",如果是普通用户会显示提示符为"$"

15. 语系查询

  • 当前语系查询

    locale //查询当前系统语系

    • LANG:定义系统主语系的变量
    • LC_ALL:定义整体语系的变量
  • 语系变量LANG

echo $LANG//查看系统当前语系
locale -a | more//查看Linux支持的所有语系

  • 查询系统默认语系

cat /etc/sysconfig/i18n

16. source命令

  • source

    source 配置文件

    .配置文件

  • 配置文件

第一组

/etc/profile
/etc/profile.d/*.sh

第二组

~/.bash_profile
~/.bashrc

/etc/bashrc

  • /etc/profile的作用

USER变量
LOGNAME变量
MAIL变量
PATH变量
HOSTNAME变量
HISTSIZE变量
umask
调用/etc/profile.d/*.sh文件

  • umask权限

umask//查看系统默认权限
文件最高权限为666
目录权限最高为777
umask定义的权限,是系统默认权限中准备丢弃的权限

17. 正则表达式

  • 正则表达式与通配符

正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令支持正则表达式。
通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配。

  • 基础正则表达式
元字符 作用
. 匹配除了换行符外一个任意字符
* 前一个字符匹配0次或任意多次
^ 匹配行首。如^test会匹配以test开头的行
$ 匹配行尾。如test$会匹配以test结尾的行
[] 匹配中括号中任意一个字符,如[abc]
[^] 逻辑非,表示匹配不是中括号内的一个字符。如[^0-9]代表匹配一个不是数字的字符
\|转义符。用于取消特殊符号的作用
\{n\} 表示前面的字符刚好出现n次。如[0-9]\{4\}匹配4位数字
\{n,\} 表示前面字符出现不少于n次。如[0-9]\{2,\}表示2位及以上数字
\{n,m\} 表示前面字符出现至少n次,至多m次。如[a-z]\{6,8\}匹配6到8位小写字母

"*"前一个字符匹配0次,或任意多次

a*//匹配所有内容,包括空白行
aa*//匹配至少包含一个a的行
aaa*//匹配至少包含两个连续a的字符串
aaaaa*//匹配至少包含4个连续a的字符串

"^"匹配行首,"$"匹配行尾

^M//匹配以大写M开头的行
n$//匹配以小写n结尾的行
^$//匹配空白行

转义符

.$//匹配使用"."结尾的行

18. 查找命令

  • grep

格式及主要参数
    grep [options]
    主要参数:  grep --help可查看
        -c:只输出匹配行的计数。
        -i:不区分大小写。
        -h:查询多文件时不显示文件名。
        -l:查询多文件时只输出包含匹配字符的文件名。
        -n:显示匹配行及 行号。
        -s:不显示不存在或无匹配文本的错误信息。
        -v:显示不包含匹配文本的所有行。
        --color=auto :可以将找到的关键词部分加上颜色的显示。
    pattern正则表达式主要参数:
    \: 忽略正则表达式中特殊字符的原有含义。
    ^:匹配正则表达式的开始行。
    $: 匹配正则表达式的结束行。
    \<:从匹配正则表达式的行开始。
    \>:到匹配正则表达式的行结束。
    [ ]:单个字符,如[A]即A符合要求 。
    [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
    .:所有的单个字符。
    *:所有字符,长度可以为0。
grep "/bin/bash" /etc/passwd | grep -v "root"//查找root以外的普通用户

  • find

    转载于https://www.cnblogs.com/onelikeone/p/7582808.html
    find命令的一般形式
    find命令的常用形式:
    find [path] [expression]
    path:find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录
    expression:expression可以分为——“-options [-print -exec -ok ...]”
    -options,指定find命令的常用选项,下节详细介绍
    -print,find命令将匹配的文件输出到标准输出
    -exec,find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格
    find ./ -size 0 -exec rm {} \; 删除文件大小为零的文件 (还可以以这样做:rm -i \find ./ -size 0\ 或 find ./ -size 0 | xargs rm -f &)
    为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中:find . -type f -exec ls -l { } \;
    在/logs目录中查找更改时间在5日以前的文件并删除它们:find /logs -type f -mtime +5 -exec rm { } \;
    -ok,和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
    find . -name "*.conf" -mtime +5 -ok rm { } \; 在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示
    也有人这样总结find命令的结构:
    find start_directory test options criteria_to_match action_to_perform_on_results
    find命令的常用选项及实例
    -name
    按照文件名查找文件。
    find /dir -name filename 在/dir目录及其子目录下面查找名字为filename的文件
    find . -name "*.c" 在当前目录及其子目录(用“.”表示)中查找任何扩展名为“c”的文件
    -perm
    按照文件权限来查找文件。
    find . -perm 755 –print 在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件
    -prune
    使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
    find /apps -path "/apps/bin" -prune -o –print 在/apps目录下查找文件,但不希望在/apps/bin目录下查找
    find /usr/sam -path "/usr/sam/dir1" -prune -o –print 在/usr/sam目录下查找不在dir1子目录之内的所有文件
    -user
    按照文件属主来查找文件。
    find ~ -user sam –print 在$HOME目录中查找文件属主为sam的文件
    -group
    按照文件所属的组来查找文件。
    find /apps -group gem –print 在/apps目录下查找属于gem用户组的文件
    -mtime -n +n
    按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。
    find / -mtime -5 –print 在系统根目录下查找更改时间在5日以内的文件
    find /var/adm -mtime +3 –print 在/var/adm目录下查找更改时间在3日以前的文件
    -nogroup
    查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
    find / –nogroup -print
    -nouser
    查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
    find /home -nouser –print
    -newer file1 ! file2
    查找更改时间比文件file1新但比文件file2旧的文件。
    -type
    查找某一类型的文件,诸如:
    b - 块设备文件。
    d - 目录。
    c - 字符设备文件。
    p - 管道文件。
    l - 符号链接文件。
    f - 普通文件。
    find /etc -type d –print 在/etc目录下查找所有的目录
    find . ! -type d –print 在当前目录下查找除目录以外的所有类型的文件
    find /etc -type l –print 在/etc目录下查找所有的符号链接文件
    -size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
    find . -size +1000000c –print 在当前目录下查找文件长度大于1 M字节的文件
    find /home/apache -size 100c –print 在/home/apache目录下查找文件长度恰好为100字节的文件
    find . -size +10 –print 在当前目录下查找长度超过10块的文件(一块等于512字节)
    -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
    find / -name "CON.FILE" -depth –print 它将首先匹配所有的文件然后再进入子目录中查找
    -mount:在查找文件时不跨越文件系统mount点。
    find . -name "*.XC" -mount –print 从当前目录开始查找位于本文件系统中文件名以XC结尾的文件(不进入其他文件系统)
    -follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
    find与xargs
    在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
    find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
    在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
    而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
    来看看xargs命令是如何同find命令一起使用的,并给出一些例子。
    find . -type f -print | xargs file 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
    find / -name "core" -print | xargs echo "" >/tmp/core.log 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:
    find . -type f -print | xargs grep "hostname" 用grep命令在所有的普通文件中搜索hostname这个词
    find ./ -mtime +3 -print|xargs rm -f –r 删除3天以前的所有东西(find . -ctime +3 -exec rm -rf {} \;)
    find ./ -size 0 | xargs rm -f & 删除文件大小为零的文件
    find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

  • cut

cut [选项] 文件名
选项:
-f 列号:提取第几列
-d 分割符:按照指定分隔符分割列
eg:
cut -f 2 info.txt
cut -f 2,4 info.txt
cut -d ":" -f 1,3 /etc/passwd

  • printf

printf '输出类型 输出格式' 输出内容
输出类型

%ns:输出字符串。n是数字指代输出几个字符
%ni:输出整数。n是数字指代输出几个字符
%m.nf:输出浮点数。m和n是数字,指代输出的整数位数和小数位数如%8.2f代表共输出8位数,其中2位小数,6位是整数。

输出格式

\a:输出警告音
\b:输出退格键
\f:清除屏幕
\n:换行
\r:回车
\t:水平输出退格符,tab键
\v:垂直输出退格符,tab键

在awk命令的输出中支持print和printf命令

print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需手动加入。

awk '条件1{动作1}条件2{动作2}...' 文件名
条件

一般使用关系表达式作为条件
x>10

动作

格式化输出
流程控制语句

eg:

awk '{printf $2 "\t" $4 "\n" }' test.txt
df -h | awk '{print $1 "\t" $3}'

  • sed

sed [选项] '[动作]' 文件名
选项

-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理过的行输出到屏幕
-e:允许对输入数据应用多条sed命令编辑
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

动作

a:追加
c:行替换,用c后面的字符串替换原始数据行
i:插入,在当期行前插入一行或多行。
d:删除,删除指定的行
p:打印,输出指定的行
s:字串替换,用一个字符串替换另一个字符串。格式为"行范围s/旧字符串/新字符串/g"

eg:

sed '3s/60/99/g' test.txt//把第三行的60替换为99
sed -i '3s/60/99/g' test.txt//sed操作的数据直接写入文件
sed -e 's/test1//g;s/test2//g' test.txt//同时把test1与test2替换为空

19. 排序与比较判断

  • sort

    sort [选项] 文件名
    选项
    -f:忽略大小写
    -n:以数值型进行排序,默认使用字符串型排序
    -r:反向排序
    -t:指定分隔符,默认是分隔符是制表符
    -k n[,m]:按照指定的字段范围排序。从第n字段开始,m字段结束。默认到行尾结束
    eg:
    soet -t ":" -k 3,3 /etc/passwd //指定分隔符为:,用第三字段开始与结束。

  • wc

wc [选项] 文件名
选项:
-l:只统计函数
-w:只统计单词数
-m;只统计字符数

  • 判断
测试选项 作用
-b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件 判断该文件是否存在,并且是否为目录文件(是目录文件为真)
-e 文件 判断该文件是否存在(存在为真)
-f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件 判断该文件是否存在,并且是否为符号链接文件(是则为真)
-p 文件 判断该文件是否存在,并且是否为管道文件(是则为真)
-s 文件 判断该文件是否存在,并且是否为非空(是则为真)
-S 文件 判断该文件是否存在,并且是否为套接字文件(是则为真)
  • 按文件权限进行判断
测试选项 作用
-r 文件 判断该文件是否存在,并且是否拥有读权限(有则为真)
-w 文件 判断该文件是否存在,并且是否拥有写权限(有则为真)
-x 文件 判断该文件是否存在,并且是否拥有执行权限(有则为真)
-u 文件 判断该文件是否存在,并且是否拥有SUID权限(有则为真)
-g 文件 判断该文件是否存在,并且是否拥有SGID权限(有则为真)
-k 文件 判断该文件是否存在,并且是否拥有SBit权限(有则为真)
  • 两个文件之间进行比较
测试选项 作用
文件1 -nt 文件2 判断文件1的修改时间是否比文件2新(如果是则为真)
文件1 -ot 文件2 判断文件1的修改时间是否比文件2旧(如果是则为真)
文件1 -ef 文件2 判断文件1和文件2的lnode号是否一致,即是否为同一文件,可用于判断硬链接
  • 两个整数之间的比较
测试选项 作用
整数1 -eq 整数2 判断整数1是否和整数2相等(相等为真)
整数1 -ne 整数2 判断整数1是否和整数2不相等(不相等为真)
整数1 -gt 整数2 判断整数1是否大于整数2(大于为真)
整数1 -lt 整数2 判断整数1是否小于整数2(小于为真)
整数1 -ge 整数2 判断整数1是否大于等于整数2(大于等于为真)
整数1 -le 整数2 判断整数1是否小于等于整数2(小于等于为真)
  • 字符串比较
测试选项 作用
-z 字符串 判断字符串是否为空(为空返回真)
-n 字符串 判断字符串是否为非空(为非空返回真)
字符串1 == 字符串2 判断字符串1是否等于字符串2(相等返回真)
字符串1 != 字符串2 判断字符串1是否不等于字符串2(不相等返回真)
  • 多重条件判断
测试选项 作用
判断1 -a 判断2 逻辑与,两个判断都成立,结果才为真
判断1 -o 判断2 逻辑或,两个判断有一个成立,结果为真
!判断 逻辑非,使原始的判断式取反

20. 源码包安装

  • RPM包命令规则

httpd-2.2.15-15.el6.centos.1.i686.rpm
httpd:软件包名
2.2.15:软件版本
15:软件发布的次数
el6.centos:适合的Linux平台
i686:适合的硬件平台
rpm:包拓展名

  • 包全名与包名

包全名:操作的包是没有安装的软件包时,使用包全名。而且要注意路径
包名:操作已经安装的软件包时,使用包名,是搜索/var/lib/rpm/中的数据库

  • rpm安装

    rpm -ivh 包全名
    选项:
    -i(install)安装
    -v(verbose)显示详细信息
    -h(hash)显示进度
    --nodeps不检测依赖性

  • rpm包升级

    rpm -Uvh 包全名
    -U(upgrade)升级

  • 卸载

    rpm -e 包名
    -e(erase)卸载
    -- nodeps不检查依赖性

  • 查询包是否安装

    rpm -q 包名
    -q:查询(query)
    rpm -qa //查询所有已经安装的rpm包

  • 查询软件包的详细信息

    rpm -qi 包名
    -i:查询软件信息
    -p:查询未安装包信息

  • 查询包中文件的安装位置

rpm -ql 包名
-l:列表(list)
-p:查询未安装包信息(package)

  • 查询系统文件属于哪个RPM包

rpm -qf 系统文件名
-f:查询系统文件属于哪个软件包(file)

  • 查询软件包的依赖性

rpm -qR 包名
-R:查询软件包的依赖性(requires)

21. yum安装

  • 常用yum命令

    查询

    yum list //查询所有可用软件包列表
    yum search 关键字//搜索服务器上所有和关键字相关的包

安装

yum -y install 包名

升级

yum -y update 包名

卸载

yum -y remove 包名

  • yum软件组管理命令

    yum grouplist//列出所有可用的软件列表
    yum groupinstall 软件组名//安装指定软件组
    yum groupremove 软件组名//卸载指定软件组名

22. 权限

  • 文件系统

    -rw-r--r--
    -:文件类型(-文件,d 目录,l 软链接文件)
    u所有者:rw-,g所属组:r--,o其他人:r--
    r:读,w:写,x:执行

  • chmod命令

chmod [选项] 模式 文件名
选项:-R:递归
模式:
[ugoa] [+-=] [rwx]
[mode=421]

  • 修改权限的方式

    chmod u+x test.av
    chmod g+w,o+w t2.av
    chmod a=rwx t3.av
    chmod 755 t4.av

  • 权限的数字表示

r---4,w---2,x---1
rwxr-xr-x:755

  • 权限对文件的作用

r:读取文件的内容(cat more head tail)
w:编辑、新增、修改文件内容(vi echo)
x:可执行

  • 权限对目录的作用

r:可以查询目录下的文件名(ls)
w:具有修改目录结构的权限。如新建文件和目录,删除此目录下的文件和目录,重命名此目录下的文件和目录,剪切(touch rm mv cp)
x:可以进入目录(cd)

  • 修改文件所有者

chown 用户名 文件名

  • 修改文件所属组

chgrp 组名 文件名

  • 查看默认权限命令

umask//查看默认权限
0022
第一个0:文件特殊权限
022:文件默认权限

  • 文件的默认权限

文件默认不能建立为执行文件,必须手工赋予执行权限
所以文件默认权限最大为666
默认权限需要换算成字母再相减
建立文件之后的默认权限为666减去umask值
eg:
文件默认最大权限666 umask值022
-rw-rw-rw- 减去 -----w--w-等于-rw-r--r--

  • 目录的默认权限

目录的默认最大权限为777
默认权限计算方式同文件

  • 修改umask值

umask 0002//临时修改
vi /etc/profile//永久修改

23. ACL权限

  • 查看分区ACL权限是否开启

    dumpe2fs -h /dev/sda5//dumpe2fs命令是查询指定分区详细文件系统信息的命令
    选项:-h:仅显示超级块中的信息,而不显示磁盘块组的详细信息

  • 临开启分区ACL权限

mount -o remount,acl /
重新挂载根分区,并加入ACL权限

  • 永久开启分区ACL权限

vi /etc/fstab //加入ACL
mount -o remount / 重新挂载文件系统使ACL生效

  • 查看ACL命令

getfacl 文件名//查看ACL权限

  • 设定ACL权限命令

setfacl 选项 文件名
选项:
-m 设定ACL权限
-x 删除指定的ACL权限
-b 删除所有的ACL权限
-d 设定默认的ACL权限
-k 删除默认ACL权限
-R 递归设定ACL权限
eg:
useradd zs
setfacl -m u:zs:rx /av #给用户zs赋予r-x权限,使用"u:用户名:权限"格式

  • 给用户组设定ACL权限

groupadd zs2
setfacl -m g:zs2:rwx /av #给用户组zs2赋予rwx权限,使用"u:用户组名:权限"格式

  • 最大游戏权限mask

    mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和mask权限相与才能得到用户真正的权限

  • 删除ACL权限

setfacl -x u:用户名 文件名//删除指定用户的ACL权限
setfacl -x g:用户组名 文件名//删除指定用户组的ACL权限
setfacl -b 文件名//删除所有ACL权限

  • 递归ACL权限

父目录在设定ACL权限时,所有子目录与子文件也会拥有相同的ACL权限
setfacl -m u:用户名:权限 -R 文件名
默认ACL权限:父目录设定默认ACL权限,新建的子文件与子目录会继承父目录的ACL权限
setfacl -m d:u:用户名:权限 目录名

24. sudo命令

  • sudo权限

    root把本来只能是超级用户执行的命令赋予普通用户执行
    sudo的操作对象是系统命令

  • sudo使用

visudo
实际修改/etc/sudoers文件

root ALL=(ALL) ALL
用户名 被管理主机的地址=(可使用身份)授权命令(绝对路径)

# %gname ALL=(ALL) ALL
%组名 被管理主机的地址=(可使用身份)授权命令(绝对路径)

eg:
- user1 ALL=/sbin/shtdown -r now

25. SetUID SetGID

  • SetUID的功能

    只有可以执行的二进制程序才能设定SUID权限
    命令执行者要对该程序拥有x(执行)权限
    命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
    SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

  • 设定SetUID的方法

4代表SUID
chmod 4755 文件名
chmod u+s 文件名

  • 取消SetUID的方法

    chmod 0755 文件名
    chmod u-s 文件名

  • 危险的SetUID

关键目录应严格控制写权限。比如“/"、“/usr"等
用户的密码设置要严格遵守密码三原则
对系统中默认应该具有 SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限

  • SetGID针对文件的作用

只有可执行的二进制程序才能设置SGID权限
命令执行者要对该程序拥有x(执行)权限
命令执行在执行程序的时候,组身份升级为该程序文件的属组
SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效

  • SetGID针对目录的作用

    普通用户必须对此目录拥有r和ⅹ权限,才能进入此目录
    普通用户在此目录中的有效组会变成此目录的属组
    若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组

  • 设定SetGID的方法

2代表SUID
chmod 2755 文件名
chmod g+s 文件名

  • 取消SetGID的方法

chmod 0755 文件名
chmod g-s 文件名

  • SBT粘着位作用

    着位目前只对目录有效
    普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
    如果没有粘着位,因为普通用户拥有w权限,所以可以删 除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件

  • charrr命令格式

    chattr [+-=] [选项] 文件或目录名

    +:增加权限
    -:删除权限
    =:等于某权限

选项包括i和a,a等于append,i等于insert

i:如果对文件设置属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。
a:如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除

26. 运行级别

  • 运行级别
运行级别 含义
0 关机
1 单用户模式,可以想象为 windows的安全模式,主要用于系统修复
2 不完全的命令行模式,不含NFS服务
3 完全的命令行模式,就是标准字符界面
4 系统保留
5 图形模式
6 重启动
  • 命令

    runlevel//查看运行级别命令
    init 运行级别//修改运行级别命令

  • 系统默认运行级别

    vim /etc/inittab

27. 服务

  • 查询已安装的服务

chkconfig --list//查看服务自启动状态及所有rpm包安装的服务
服务安装位置一般在/usr/local/下

  • 查询系统中开启的服务

netstat -tlunp
选项:
t列出tcp数据
u列出udp数据
l列出正在监听的网络服务(不包含已经连接的网络服务)
n用端口号来显示服务,而不是用服务名
p列出该服务的进程ID(PID)

  • 常用位置

/etc/init.d/:启动脚本位置
/etc/sysconfig/:初始化环境配置文件位置
/etc/:配置文件位置
/etc/ xinetd.conf: xinetd配置文件
/etc/ xinetd.d/:基于xinetd服务的启动脚本
/var/lib/:服务产生的数据放在这里
/var/log/:日志

  • 独立服务启动、自启动

/etc/init.d/独立服务名 start|stop|status|restart
service 独立服务名 start|stop|status|restart
自启动:
chkconfig[--evel 运行级别] [独立服务名] [on|off]
修改/etc/rcd/ rc.local文件
使用 ntsysv命令管理自启动

  • 源码包安装服务启动与自启动

    使用绝对路径,调用启动脚本来启动。不同的源码包的启动脚本不同。可以查看源码包的安装说明,查看启动脚本的方法。
    usr/local/apache2/bin/apachectl start|stop
    自启动:
    vi /etc/rc.d/rc.local
    加入 /usr/local/apache 2/bin/apachectl start
    让源码包服务被服务管理命令识别
    让源码包的 apache服务能被 service命令管理启动
    ln-s /usr/local/apache2/bin/apachectl /etc/init.d/apache
    让源码包的apache服务能被 chkconfig与 ntsysv命令管理自启动
    vi /etc/init.d/apache
    chkconfig: 35 86 76
    指定httpd本可以被chkconfig命令管理。格式是:chkconfig :运行级别 启动顺序 关闭顺序
    description: source package apache
    说明,内容随意
    chkconfig --add apache
    把源码包apache加入chkconfig命令

28. 进程

  • 查看所有进程

    ps aux
    查看系统中所有进程,使用BSD操作系统格式
    ps -le
    查看系统中所有进程,使用Linux标准命令格式
    选项
    -a:显示一个终端的所有进程,除了会话引线
    -u:显示进程的归属用户及内存的使用情况
    -x:显示没有控制终端的进程
    -1:长格式显示。显示更加详细的信息
    -e:显示所有进程,和-A作用一致

  • PS命令的输出

USER:该进程是由哪个用户产生的;
PID:进程的|D号;
%CPU:该进程占用CPU资源的百分比,占用越高,进程越耗费资源;
%MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源;
VSZ:该进程占用虚拟内存的大小,单位KB;
RSS:该进程占用实际物理内存的大小,单位KB
TTY:该进程是在哪个终端中运行的。其中ty1-tty7代表本地控制台终端,tty1-tty6是本地的字符界面终端,tty7是图形终端。pts/0-255代表虚拟终端。
STAT:进程状态。常见的状态有:
R:运行
S:睡眠
T:停止状态
s:包含子进程
+:位于后台

START:该进程的启动时间
TIME:该进程占用CPU的运算时间,注意不是系统时间
COMMAND:产生此进程的命令名

  • 查看进程树

pstree [选项]
选项
-p:显示进程pid
-u:显示进程的所属用户

29. 查看系统健康状态

top [选项]
选项:
-d秒数:指定top命令每隔几秒更新。默认是3秒
-b:使用批处理模式输出。一般和“-n"选项合用
-n次数:指定top命令执行的次数。一般和“-b选项合用

在top命令的交互模式当中可以执行的命令:
?或h:显示交互模式的帮助
P:以CPU使用率排序,默认就是此项
M:以内存的使用率排序
N:以PID排序
q:退出top

30. 进程kill命令

  • kill命令

kill -l//查看可用进程的信号

信号代号 信号名称 说明
1 SIGUP 该信号让进程立即关闭,然后重新读取配置文件之后重启。
2 SIGINT 程序终止信号,用于终止前台进程。相当于输出ctr+c快捷键
8 SIGFPE 在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等其它所有的算术的错误。
9 SIGKILL 用来立即结束程厅的运行。本信号不能被阻塞、处理和忽略。一般用于强制终止进程。
14 SIGALRM 时钟定时信号,计算的是实际的时间或时钟时间。alarm函数使用该信号。
15 SIGTERM 正常结束进程的信号,kill命令的默认信号。有时如果进程已经发生问题,这个信号是无法正常终止进程的,我们才会尝试 SIGKILL信号,也就是信号9
18 SIGCONT 该信号可以让暂停的进程恢复执行,本信号不能被阻断。
19 SIGSTOP 该信号可以暂停前台进程,相当于输入ctr+z快捷键。本信号不能被阻断。

kill -1 2333 //重启进程
kill -9 2333 //强制杀死进程

  • killall命令

killall [选项][信号] 进程名 //按照进程名杀死进程
选项:
-i:交互式,询问是否杀死某个进程
-I:忽略进程名大小写

  • pkill命令

pkill [选项][信号] 进程名 //按照进程名终止进程
选项:
-t:终端号:按照终端号踢出用户

31. nice优先级

  • nice命令

nice [选项] 命令
nice命令可以给新执行的命令直接赋予NI值,但是不能修改已经存在进程的NI值
选项
-n NI值:给命令赋予N值。
例如 nice -n -5 service httpd start

  • 修改NI值时有几个注意事项

NI的值的范围是-20到19;
普通用户调整NI值的范围是0到19,而且只能调整自己的进程
普通用户只能调高NI值,而不能降低,如原本NI值为0,则只能调整为大于0;
root用户才能设定进程NI值为负值,而且可以调整任何用户的进程。
PRI(最终值)=PRI(原始值)+NI
用户只能修改NI的值,不能直接修改PRI
PRI代表 Priority,NI代表Nice。这两个值都是优先级,数字越小代表该进程优先级越高。

  • renice命令

    renice [优先级] PID
    renice命令是修改已经存在进程的NI值得命令
    renice -10 2333

32. 后台任务

  • 把进程放入后台

./helloworld.sh & //把命令放入后台,并在后台执行
top //按下ctrl+z快捷键,放入后台暂停

  • 查看后台的工作

jobs [-l]
选项:-l:显示工作的pid
注:“+”号代表最近一个放入后台的工作,也是工作恢复时,默认恢复的工作。“-”号代表倒数第二个放入后台的工作

  • 将后台暂停的工作恢复到前台执行

fg %工作号

  • 把后台暂停的工作恢复到后台执行

bg %工作号
注:后台恢复执行的命令,是不能和前台有交互的,否则不能恢复到后台执行

  • 后台命令脱离登陆终端执行的方法

第一种方法是把需要后台执行的命令加入/etc/rc.local文件
第二种方法是使用系统定时任务,让系统在指定的时间执行某个后台命令
第三种方法是使用nohup命令

33. 系统资源信息查看

  • vmstat [刷新延时 刷新次数]

    eg:vmstat 1 3
    procs:进程信息字段

    r:等待运行的进程数,数量越大,系统越繁忙。
    b:不可被唤醒的进程数量,数量越大,系统越繁忙。

memory:内存信息字段

swpd:虚拟内存的使用情况,单位KB。
free:空闲的内存容量,单位KB
buff:缓冲的内存容量,单位KB。
cache:缓存的内存容量,单位KB

swap:交换分区的信息字段

si:从磁盘中交换到内存中数据的数量,单位KB。
so:从内存中交换到磁盘中数据的数量,单位KB。
此两个数越大,证明数据需要经常在磁盘和内存之间交换,系统性能越差。

io:磁盘读写信息字段

bi:从块设备读入数据的总量,单位是块。
bo:写到块设备的数据的总量,单位是块。
此两个数越大,代表系统的I/O越繁忙。

system:系统信息字段

in:每秒被中断的进程次数
cs:每秒钟进行的事件切换次数。
此两个数越大,代表系统与接口设备的通信非常繁忙。

CPU:CPU信息字段

-us:非内核进程消耗CPU运算时间的百分比。
sy:内核进程消耗CPU运算时间的百分比
id:空闲CPU的百分比。
wa:等待I/O所消耗的CPU百分比
st:被虚拟机所盗用的CPU占比。

  • dmesg开机时内核检测信息

dmesg | grep cpu

  • free查看内存使用状态

free [-b|-k|-m|-g]
选项:
-b:以字节为单位显示
-k:以KB为单位显示,默认就是以KB为单位显示
-m:以MB为单位显示
-g:以GB为单位显示

  • 查看cpu信息

    cat /proc/cpuinfo

  • uptime命令

    uptime //显示系统的启动的间和平均负载,也就是top命令的第一行。W命令也可以看到这个数据。

  • 查看系统与内核相关信息

uname [选项]
选项:
-a:查看系统所有相关信息
-r:查看内核版本
-s:查看内核名称

  • 判断当前系统的位数

file /bin/ls

  • 查询当前Linux系统的发行版本

lsb_release -a

  • 列出进程打开或使用的文件信息

lsof [选项]
列出进程调用成打开的文件的信息
选项:
-c 字符串:只列出以字符串开头的进程打开的文件
-u 用户名:只列出某个用户的进程打开的文件
-p pid:列出某个PID进程打开的文件
lsof | more 查询系统中所有进程调用的文件
lsof /sbin/init 查询某个文件被哪个进程调用
lsof -c httpd 查看httpd进程调用了哪些文件
lsof -u root 按照用户名,查询某用户的进程调用的文件名

34. 定时计划任务at

  • 确定at安装

chkconfig --list | grep atd
service atd restart

  • at的访问控制

如果系统中有/etc/at.alloy文件,那么只有写入/etc/at.allow文件(白名单)中的用户可以使用at命令(/etc/at.deny文件会被忽略)
如果系统中没有/etc/at.allow文件,只有/etc/at.deny文件 ,那么写入/etc/at.deny文件(黑名单)中的用户不能使用at 命令。对root不起作用
如果系统中这两个文件都不存在,那么只有root用户可以使用at命令

  • at命令

at [选项] 时间
选项:
-m:当at工作完成后,无论是否命令有输出,都用emai通知执行at命令的用户
-c 工作号:显示该at工作的实际内容
时间:
HH: MM 例如:02:30
HH: MM YYYY-MM-DD 例如02:30 2013-07-25
HHMM[am|pm][ month] [date]例如02:30 July 25
HH: MM[am|pm] + [minutes|hours|days|weeks] 例如now+5 minutes
eg:
at now + 2 minutes
at> /root/test.sh >>/dev/null

35. 周期性任务cron

  • crond服务管理与访问控制

service crond restart
chkconfig crond on
访问控制:
当系统中有/etc/cron.allow文件时,只有写入此文件的用户可以使用crontab命令,没有写入的用户不能使用crontab命 令。同样如果有此文件,/etc/cron.deny文件会被忽略,/etc/ cron.allow文件的优先级更高
当系统中只有/etc/cron.deny文件时,则写入此文件的用户不能使用crontab命令,没有写入文件的用户可以使用 crontab命令

  • 运行方法

crontab -e

项目 含义 范围
第一个"* " 一小时当中的第几分钟 0-59
第二个"* " 一天当中的第几小时 0-23
第三个"* " 一个月当中的第几天 1-31
第四个"* " 一年当中的第几月 1-12
第五个"* " 一周当中的星期几 0-7(0和7都代表星期日)
特殊符号 含义
* 代表任何时间。比如第一个“*”就代表一小时中每分钟都执行1次的意思。
, 代表不连续的时间。比如“0 8,12,16***命令”,就代表在每天 的8点0分,12点0分,16点0分都执行一次命令
- 代表连续的时间范围。比如“0 5**1-6命令”,代表在周一到周 六的凌晨5点0分执行命令
*/n 代表每隔多久执行一次。比如“*/10****命令”,代表每隔10 分钟就执行一遍命令

eg:
5 5 2 /sbin/shutdown -r now

  • 常用命令

    crontab -l//查看root用户的crontab任务
    crontab -r//删除root用户的crontab任务

  • 执行系统的定时任务的方法

第一种是把需要定时执行的脚本复制到 /etc/cron.{ daily, weekly, monthly}目录中的任意一个
第二种是修改/etc/crontab配置文件

  • anacron检测周期

nacron会使用一天,七天,一个月作为检测周期
在系统的/var/spool/anacron/目录中存在cron.(daily, weekly, monthly}文件,用于记录上次执行cron的时间
和当前时间做比较,若果两个时间的差值超过了anacron的指定时间差值,证明有cron任务被执行

  • anacron配置文件

vi /etc/anacrontab
RANDOM DELAY=45 最大随机延迟
START HOURS_RANGE=3-22
anacron的执行的时间范围是3:00-22:00
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
天数 强制延迟(分) 工作名称 实际执行的命令

0x02 shell编程

1. 变量

  • 变量命令规则

    变量名必须以字母或下划线开头,名字中间只能由字母、数字和下划线组成
    变量名的长度不得超过255个字符
    变量名在有效的范围内必须是唯一的
    在bash中,变量默认都是字符串型

  • 变量分类

用户自定义变量
环境变量:这种变量中主要保存和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用固定的
位置参数变量:这种变量主要用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用固定
预定义变量:是bash中已经定义好的变量,变量名不能自定义,作用固定

  • 变量叠加

x=123
x="$x"456
x=${x}789

  • 变量查看

    set
    选项
    -u //设定此选项,调用未声明变量时会报错

  • 变量删除

unset 变量名

  • 位置参数变量
位置参数变量 作用
$n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上要用大括号如${10}
$* 这个变量代表命令行所有的参数,$*把所有参数看成一个整体
$@ 这个变量也代表命令行所有的参数,不过$@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数
  • 预定义变量
预定义变量 作用
$? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
  • 接收键盘输入

read [选项] [变量名]
选项:
-p:提示信息:在等待read输入时,输出提示信息
-t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数:read命令只接受指定的字符数,就会执行
-s:隐藏输入的数据,适用于机密信息的输入

  • declare声明变量类型

    declare [+/-] 选项 变量名
    选项
    -:给变量设定类型属性
    +:取消变量的类型属性
    -a:将变量声明为数组型
    -i:将变量声明为整数型
    -x:将变量声明为环境变量
    -r:将变量声明为只读变量
    -p:显示指定变量的被声明的类型

  • 声明数组变量

(1) 定义数组
movie[0]=zp
movie[1]=tp
declare -a movie[2] = live
(2) 查看数组
echo ${movie}
echo ${movie[2]}
echo ${movie[*]}

2. 运算

  • 数值运算

    方法1
    aa=11
    bb=22
    declare -i cc=$aa+$bb//给变量cc赋值

    方法2:expr或let数值运算工具
    aa=11
    bb=22
    dd=$(expr $aa + $bb)//+号左右两侧必须有空格

    方法3:$((运算式))或$[运算式]
    e=$(($aa + $bb))
    f=$[$aa + $bb]

  • 运算符

优先级 运算符 说明
13 -,+ 单目负,单目正
12 !,~ 逻辑非,按位取反或补码
11 * ,/,% 乘,除,取模
10 +,- 加,减
9 <<,>> 按位左移,按位右移
8 <=,>=,<,> 小于等于,大于等于,小于,大于
7 ==,!= 等于,不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1 =,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>= 赋值、运算且赋值

aa = $(( (11+3)*3/2 ))//使用小括号改变优先级
cc = $((1&&0))//逻辑与只有两边都是1,结果才是1,否则结果为0

3.脚本格式

  • 控制字符
控制字符 作用
\a 输出警告音
\b 退格键,向左删除键
\n 换行键
\r 回车键
\t 制表符,tab键
\v 垂直制表符
\0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数
\xhh 按照十六进制ASCII码表输出字符,hh是两位十六进制数
  • 脚本格式

    vi test.sh
    #!/bin/bash
    #the test
    echo -e "\e[1;34m the test! \e[0m"

  • 脚本执行

    chmod 755 test.sh//赋予执行权限
    ./test.sh //直接执行
    bash test.sh//通过bash调用执行

4. 条件语句

  • 单分支if条件语句
if [ 条件判断式 ];then
  code
fi

or
if [ 条件判断式 ]
  then
     code
fi

注:
if语句使用fi结尾
[ 条件判断式 ]使用test命令进行判断,所以中括号和条件判断式之间必须有空格
eg:

\#!/bin/bash
统计根分区使用率
rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f1)
\#把使用率赋值给变量rate
if [ $rate -ge 80 ]#大于等于80
then
   echo "Warning!"
fi
  • 双分支条件
if [ 条件判断式 ]
  then
     code
  else
     code
fi

\#eg:判断apache服务是否启动
\#!/bin/bash
test=$(ps aux | grep httpd | grep -v grep)
\#截取httpd进程,把结果赋值给test
if [ -n "$test" ]
\#如果test值不为空执行then后命令
  then
     echo "$(date) httpd is running" >> /tmp/autostart-acc.log
  else
     /etc/rc.d/init.d/httpd start &> /dev/null
     echo "$(date) restart httpd service" >> /tmp/autostart-err.log
  fi
  • 多条件语句
if [ 条件判断式1 ]
  then
     code
elif [ 条件判断式2 ]
  then
     code
else
   code#所有条件都不成立时执行
fi
  • case条件语句
case $变量名 in
  值1)
  \#如果变量值等于值1,则执行程序1
  ;;
  值2)
  \#如果变量值等于值1,则执行程序1
  ;;
  \#...省略其他
  *)
  \#如果变量的值都不是以上的值,执行此程序
  ;;
esac

5.循环语句

  • for循环
    
    \#语法1:
    for 变量 in 值1 值2 值3...
    do
    code
    done

eg:
#!/bin/bash
cd /root/test
ls *.tar.gz > ls.log
for i in $(cat ls.log)
do
tar -zxf $i &>/dev/null
done
rm -rf ./ls.log

#语法2:
for ((初始值;循环控制条件;变量变化))
do
code
done

#eg:
#!/bin/bash
#批量添加指定数量的用户
read -p "Please input username" -t 30 name
read -p "Please input the number of users" -t 30 num
read -p "Please input the password of users" -t 30 pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
then
y=$(echo $num | sed 's/[0-9]//9')
if [ -z "$y" ]
then
for ((i=1;i<=$num;i=i+1))
do
/usr/sbin/useradd $name$i &>/dev/null
echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
done
fi
fi

#!/bin/bash
#删除用户
for i in $(cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f1)
do
userdel -r $i
done


- while循环

#!/bin/bash
i=1
s=0
while [ $i -le 100 ]
#如果变量i的值小于等于100,则执行循环
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s"


- until循环

#!/bin/bash
i=1
s=0
until [ $i -gt 100 ]
#如果变量i的值大于100,停止循环
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s"

三色堇
我还没有学会写个人说明!
查看“三色堇”的所有文章 →

相关推荐