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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349