Linux——Shell

  • Shell是一个命令行解释器,实现命令和机器码互转
  • Shell是一门编程语言,是一种解释执行的脚本语言

分类

  • Bourne Shell
    • sh
    • ksh
    • Bash
    • psh
    • zsh
  • C Shell
    • csh
    • tcsh
  • /etc/shells 查看支持的shell

Bash操作

  • bash 进入bash
  • exit 退出bash
  • \ 命令换行
  • 历史命令
    • 上下箭头调出历史命令
    • 单击Tab键补全,双击Tab键列出所有相似
    • ![num] 重复执行第num条命令
    • !! 重复执行上一条
  • 快捷键
    • 快捷键传送门
    • ctrl+c 中断
    • ctrl+l 清屏,clear命令清屏
    • ctrl+u 剪切光标之前的命令
    • ctrl+y 粘贴
    • ctrl+r 历史命令中搜索
    • ctrl+d 结束符,退出当前终端
    • ctrl+a 移到行首
    • ctrl+e 移到行尾
    • ctrl+z 暂定,放入后台
    • ctrl+s 暂停屏幕输出
    • ctrl+q 恢复屏幕输出

脚本基础

  • 文件后缀 .sh
  • 文件头 #!/bin/bash
  • # 注释
  • 执行脚本
    • bash xxx.sh
    • 赋予权限执行
      • chmod 755 xxx.sh
      • ./xxx.sh

标准输入输出

设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出
  • 输出重定向
    • [命令] >[文件] 保存正确结果,覆盖模式
    • [命令] >>[文件] 保存正确结果,追加模式
    • [命令] 2>[文件] 保存错误信息,覆盖模式
    • [命令] 2>>[文件] 保存错误信息,追加模式
    • [命令] > [文件] 2>&1 保存正确和错误,覆盖模式
    • [命令] >> [文件] 2>&1 保存正确和错误,追加模式
    • [命令] &>[文件] 保存正确和错误,覆盖模式
    • [命令] &>>[文件] 保存正确和错误,追加模式
    • [命令] >> [文件1] 2>>[文件2] 正确追加到文件1,错误追加到文件2
  • 输入重定向
    • wc < [文件名]
      • 把文件作为命令输入

多命令

  • ; 连接多个命令
  • && 逻辑与,命令1成功,执行命令2
  • || 逻辑或,命令1失败,执行命令2
  • | 管道符,命令1的正确输出作为命令2的操作对象
    • ll /etc | more
    • netstat -an | grep [keywords]
  • & 任务在后台执行

通配符和特殊字符

  • 通配符
    • ? 一个任意字符
    • * 0或多个任意字符
    • [] 中括号中任意一个字符
    • [-] 中括号中任意一个字符,-代表范围
    • [^] 不是中括号中的字符
  • 特殊字符
    • '' 单引号中所有特殊字符都没有特殊含义,原样输出
    • "" 双引号中所有特殊字符都没有特殊含义
      • 但是以下除外
      • $ 调用变量的值
      • ` 反引号,引用命令
      • \ 转义符
    • $() 引用系统命令
    • `` 反引号扩起来的内容是系统命令,和$()作用一样
    • # 代表注释
    • & 后台执行
      • find / -name xxx.sh &
    • \ 转义字符,在\之后的特殊符号将时区特殊含义,变为普通字符

命令

  • echo [内容]
    • 输出字符
    • -e 转义字符
      • \ 输出\
      • \a 警告音
      • \b 退格键
      • \c 取消行末换行符
      • \e escape键
        • echo -e "\e[1;31m abcd \e[0m"
          • 30m 黑色
          • 31m 红色
          • 32m 绿色
          • 33m 黄色
          • 34m 蓝色
          • 35m 洋红
          • 36m 青色
          • 37m 白色
      • \f 换页
      • \n 换行
      • \r 回车键
      • \t 制表符,tab键
      • \v 垂直制表符
      • \0nnn 八进制ASCII码
      • \xhh 十六进制ASCII码
    • echo -e "a\tb\tc"
  • dos2unix [文件]
    • windows编码转换为Linux编码
    • 2 two to
    • 4 four for
  • history
    • 查看历史命令
      • 默认保存1000条,/etc/profile,HISTSIZE
    • -c 清空历史命令
    • -w 把缓存中的历史命令写入历史命令保存文件
      • ~/.bash_history
  • alias
    • 查看别名
  • alias [别名]=[command]
    • 设置别名,临时生效
    • /root/.bashrc
  • unalias [别名]
    • 删除别名

变量

  • 分类
    • 用户自定义变量/本地变量
    • 环境变量,系统操作环境相关的数据
      • 环境变量建议大写
    • 位置参数变量,脚本参数
    • 预定义变量
  • 用户自定义变量/本地变量
    • 声明赋值
      • [变量名]=[变量值]
      • name=zhangsan
      • name="zhang san"
      • name="$date"
      • name=$(date)
    • 连接
      • info=hello"$name"
      • info=hello${name}
    • 调用
      • $name
    • 查看所有变量
      • set
    • 删除
      • unset name
  • 环境变量
    • 声明赋值
      • export [变量名]=[变量值]
      • export [本地变量]
    • 查询
      • env
    • 调用
      • $[变量名]
    • 删除
      • unset [变量名]
    • 常见环境变量
      • PATH
        • 系统查找命令的路径
        • echo $PATH
        • PATH="$PATH":/xxx 追加
      • PS1
        • 系统提示符格式 [root@localhost ~]#
          • $ root提示#,普通用户提示$
        • echo $PS1
  • 位置参数变量
    • $n 命令行参数传递给脚本
      • $0 命令本身
      • $1-$9 第1到9个参数
      • ${10} 10个以上参数
      • bash xxx.sh zhangsan 18
        • $0 xxx.sh
        • $1 zhangsan
        • $2 18
    • $* 所有参数,一个字符
    • $@ 所有参数,字符数组
    • $# 参数个数
  • 预定义变量
    • $? 最后一次执行命令的返回状态
      • 0 执行正确
      • 非0 执行不正确
    • $$ 当前进程的PID
    • $! 最后一个后台进程的PID
  • read [变量名]
    • 接受键盘输入
    • -p [提示信息] 提示信息
    • -t [描述] 等待用户输入,等待时间
    • -n [字符数] 只接受指定字符数
    • -s 隐藏输入的数据

数值运算与运算符

  • declare [+/-][选项] [变量名]
    • 声明变量类型
    • - 为变量设定类型属性
    • + 取消变量的类型属性
    • -i 整型
    • -x 环境变量
    • -p 显示变量的类型
      • declare -p [变量名]
  • 数值运算
#! /bin/bash

num1=$1
num2=$2
declare -i sum=$num1+$num2
echo "方式一:$sum"

echo "方式二:$(expr $num1 + $num2)"

echo "方式三:$(($num1+$num2))"
echo "方式三:$[$num1+$num2]"
  • 运算符
    • + - * / % && ||

环境变量配置文件

  • source [配置文件]
    • 使配置文件生效,另一种写法 . [配置文件]
  • 配置文件
    • 所有用户生效
      • /etc/profile
        • USER
        • LOGNAME
        • MAIL
        • PATH
        • HOSTNAME
        • HISTSIZE
        • umask
        • 调用/etc/profile.d/*.sh
      • /etc/profile.d/*.sh
      • /etc/bashrc
        • PS1
        • umask
        • PATH
        • 调用/etc/profile.d/*.sh
    • 只对用户生效
      • ~/.bash_profile
        • 调用~/.bashrc
      • ~/.bashrc
    • 用户登录时读取顺序
      • /etc/profile
        • /etc/profile.d/*.sh
      • ~/.bash_profile
        • ~/.bashrc
      • /etc/bashrc
    • ~/.bash_logout
      • 注销时读取
    • ~/.bash_history
      • 命令历史
    • /etc/issue
      • 本地终端欢迎信息
    • /etc/issue.net
      • 远程终端欢迎信息
    • /etc/motd
      • 登录后欢迎信息

正则表达式

  • 在文件中匹配符合条件的字符串
    • grep awk sed 支持正则表达式
  • * 前一个字符匹配0次或任意多次
  • . 匹配除了换行符外任意一个字符
  • ^ 匹配行首
  • $ 匹配行尾
  • [] 匹配中括号中任意一个字符
  • [^] 匹配中括号字符意外的任意一个字符
  • \ 转义符
  • {n} 前面的字符出现n次
  • {n,} 前面的字符至少出现n次
  • {n,m} 前面的字符至少出现n次,最多出现m次

字符处理

  • cut [文件名]
    • 列提取
    • -f [第几列,..] 获取列信息
    • -d [分隔符] 指定分隔符,默认制表符
    • cut -f 1 -d : /etc/passwd
  • printf '[输出格式][输出类型]' [输出内容]
    • 格式化输出
    • 类型
      • $ns 字符串
      • %ni 整数
      • %m.nf 小数
        • %8.2 输出8位,6位整数,2位小数
    • 格式
      • \a 警告音
      • \b 退格键
      • \f 清屏
      • \n 换行
      • \r 回车
      • \t 水平制表符
      • \v 垂直制表符
    • printf '%s %s\n' 1 2 3 4 5 6
  • awk [选项] '条件{动作}...' [文件名]
    • 文本分析工具
    • 选项
      • -F[分隔符] 指定分隔符
    • 条件
      • 关系表达式
    • 动作
      • 格式化输出
      • 流程控制语句
    • df -h | awk '{print $1 "\t" $3}'
      • print 输出,行尾换行
      • 打印第一列和第三列信息
  • sed [选项] '[动作]' [文件名]
    • 流编辑器,对数据进行选取、替换、删除、新增
    • 选项
      • -n 将sed处理的结果输出到屏幕
      • -e 允许对输入数据进行多条sed命令编辑,用;分隔
      • -i sed修改的结果保存到文件,默认不会修改文件,修改的是输出
    • 动作
      • a [数据] \ 追加,除最后一行,每行用\结尾
      • c [数据] \ 行替换,除最后一行,每行用\结尾
      • i [数据] \ 插入,除最后一行,每行用\结尾
      • d 删除
      • p 打印
      • s/[旧字符串]/[新字符串]/g 字符串替换
    • sed -n '2p' xxx
      • 输出第2行
    • sed '2,4d' xxx
      • 删除第2到4行
    • sed '2a hello ' xxx
      • 第二行追加hello
  • sort [文件名]
    • 排序
    • -f 忽略大小写
    • -n 以数值型进行排序,默认使用字符串型排序
    • -r 反向排序
    • -t [分隔符] 指定分隔符,默认是制表符
    • -k [n,m] 指定字段排序,-k [2,2] 指定第二个字段排序
  • wc [文件名]
    • -c 统计字节数
    • -w 统计单词数
    • -l 统计行数

条件判断

  • 文件类型
    • -d 文件是否存在,存在且为目录,则真
    • -e 文件是否存在
    • -f 文件是否存在,存在且为普通文件,则真
    • -L 文件是否存在,存在且为符号链接文件,则真
  • 文件权限
    • -r 文件是否存在,存在且有读权限,则真
    • -w 文件是否存在,存在且有写权限,则真
    • -x 文件是否存在,存在且有执行权限,则真
  • 文件间比较
    • [文件1] -nt [文件2] 文件1修改时间是否比文件2新
    • [文件1] -ot [文件2] 文件1修改时间是否比文件2旧
    • [文件1] -ef [文件2] 文件1是否和文件2的inode一致,是否为同一文件
  • 两个整数之间比较
    • num1 -eq num2 等于
    • num1 -ne num2 不等于
    • num1 -gt num2 大于
    • num1 -lt num2 小于
    • num1 -ge num2 大于等于
    • num1 -le num2 小于等于
  • 字符串判断
    • -z 字符串 是否为空
    • -n 字符串 是否非空
    • str1 == str2
    • str1 != str2
  • 检查条件
    • test -f 文件[-f 文件]

流程控制

  • 单分支if条件语句
if [ 条件判断 ];then
...
fi
if [ 条件判断 ]
    then
        ...
fi
  • 多分支if条件语句
if [ 条件判断 ]
    then
        ...
elif [ 条件判断 ]
    then
        ...
else
    ...
fi
  • exit

    • 退出脚本
    • exit [num]
  • 多分枝case条件语句

    • 只能判断一种条件
case $变量 in
    "值")
        ...
        ;;
    "值")
        ...
        ;;
    *)
        ...
        ;;
esac
  • for循环
for 变量 in 值1 值2...
    do
        ...
    done
for ((i=1;i<=100;i=i+1))
    do
        ...
    done
  • while循环
    • 不定循环,条件成立则循环
while [ 条件判断 ]
    do
        ...
    done
  • until循环
    • 不定循环,条件不成立则循环
while [ 条件判断 ]
    do
        ...
    done

实例

  • 远程下载文件输出内容到屏幕
#!/bin/bash

if [ ! -d "./downloads/" ];then
        mkdir downloads
fi

cd downloads

wget http://xxx.com/xxx.zip
echo 下载完成

unzip xxx.zip
echo 解压完成

rm -f xxx.zip

content=$(cat xxx.txt)
echo ===输出开始===
echo -e "\e[1;32m$content\e[0m"
echo ===输出结束===

rm -f xxx.txt

你可能感兴趣的:(Linux——Shell)