- 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 < [文件名]
- 把文件作为命令输入
- 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 白色
- echo -e "\e[1;31m abcd \e[0m"
- \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
- 系统提示符格式
- PATH
- 声明赋值
- 位置参数变量
-
$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
- PATH
- HOSTNAME
- HISTSIZE
- umask
- 调用/etc/profile.d/*.sh
- /etc/profile.d/*.sh
- /etc/bashrc
- PS1
- umask
- PATH
- 调用/etc/profile.d/*.sh
- /etc/profile
- 只对用户生效
- ~/.bash_profile
- 调用~/.bashrc
- ~/.bashrc
- ~/.bash_profile
- 用户登录时读取顺序
- /etc/profile
- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
- /etc/profile
- ~/.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