一、Shell脚本概述
- 脚本格式
shell脚本以#!/bin/bash
开头,用来指定解释器:
shell脚本的后缀名最好为#!/bin/bash # 下面是具体逻辑 ...
.sh
,看到便知道该文件为一个shell脚本。 - shell脚本的执行方式
(1) 将shell脚本文件作为解释器的参数
(2)赋予脚本可执行权限/bin/bash 脚本文件
# 赋予执行权限 chmod u+x 脚本文件 # 执行,使用绝对路径或者相对路径指定要运行的shell脚本 # 如果将shell脚本放置在了环境变量中,可以直接使用脚本文件名运行 脚本文件
二、变量
- 定义变量:
变量名=变量值
- 访问变量:
$变量名
- 销毁变量:
unset 变量名
- 双引号和单引号
引号 说明 "" 双引号中的一些特殊符号会被shell解析到 '' 单引号中的所有内容都是字符串
- 常用系统变量
系统变量 说明 $HOME 当前登录用户的家目录 $USER 当前登录用户名 $SHELL 默认使用的解释器 $PWD 当前工作目录 $# 向shell脚本传入的参数个数 $* 向shell脚本传入的所有参数,所有参数会被当做一个整体 $@ 向shell脚本传入的所有参数,所有番薯不会被当作一个整体 $n 调用传入shell脚本的参数,$0是脚本名称,$1是第一个参数,当n超过9后,需要像${10}一样去使用参数 $? 上一条命令执行后的返回值,0表示执行正常,非0表示执行失败;如果是条件,0表示true,1表示false
- 升级为系统变量:
export 变量
三、数值运算
语法格式:$[算式]
,算式中如果使用到变量,需要每一个使用到的变量前加上$
访问其值。
四、条件判断
- 语法格式为:
[[ 条件表达式 ]]
,返回值为0或者1,0
表示true
,1
表示false
- 常用判断条件
(1) 整数的判断
(2)字符串的判断# 如果要访问变量,需要前置$ 语法格式 说明 [[ n1 -gt n2 ]] 大于 [[ n1 -eq n2 ]] 等于 [[ n1 -lt n2 ]] 小于 [[ n1 -ne n2 ]] 不等于 [[ n1 -ge n2 ]] 大于等于 [[ n1 -le n2 ]] 小于等于
(3) 文件判断# 如果要访问变量,需要前置$ # 字符串大小按照字典序比较 语法格式 说明 [[ s1 > s2 ]] 大于 [[ s1 == s2 ]] 等于,不是简单的全等于,而是模式匹配 [[ s1 < s2 ]] 小于 [[ s1 != s2 ]] 不等于,不是简单的全部等于,而是模式匹配 [[ s1 >= s2 ]] 大于等于 [[ s1 <= s2 ]] 小于等于 [[ -z s1 ]] 字符串为空
(4) 取反# 如果要访问变量,需要前置$ 语法格式 说明 [[ -r file ]] 文件存在且当前用户对该文件具有可读权限 [[ -w file ]] 文件存在且当前用户对该文件具有写入权限 [[ -x file ]] 文件存在且当前用户对该文件具有执行权限 [[ -e file ]] 文件存在 [[ -f file ]] 文件存在且为普通文件 [[ -d file ]] 文件存在且为目录
语法格式为:[[ ! condition ]]
,!
置于最前
(5) 组合条件判断:# 允许使用()来优先判断 语法格式 说明 [[ condition1 && condition2 ]] 逻辑并 [[ condition1 || condition2 ]] 逻辑或
五、常用流程判断
if
# 语法格式为 if [[ condition1 ]] then ... elif [[ condition2 ]] then ... elif [[ condition3 ]] then ... ... else ... fi
case
# 语法格式为,支持的是模式匹配 case $v in s1) ... ;; s2) ... ;; ... *) ... ;; esac
for
# 命令替换:$(cmd) # $(cmd) <==> 执行cmd后得到的结果 # 序列生成命令:seq 首数 [增量] 尾数 for i in $(seq 1 1 100) do ... done for arg in $@ do ... done for file in $(ls) do ... done
六、read读取输入
语法格式:read [-p 提示信息] 变量名
,可以使用$变量名
来访问变量值
七、函数
- 系统函数
语法格式 说明 basename /root/hello.txt 获取最后一个/后的字符串:hello.txt dirname /root/hello/txt 获取最后一个/前的整个字符串:/root
- 自定义函数
# 定义 function function-name(){ # 可以通过$n的方式访问传入函数的参数 # 可以童工$var-name的方式访问函数外部和内部声明定义的变量 ... } # 调用 function-name arg1 arg2 ...
八、常用工具
-
tr
语法格式 说明 其他命令的输出 | tr -s 字符 将指定的多个连续的字符变成一个
-
cut
# 语法为 cut -d 分割字符 -f 列号 file # 列号书写方式 # 单列:-f c # 多个不连续列:-f c1,c2 # 多个连续列:-f c1-c2 # 到最后一列:-f c1-
-
awk
(1) 语法格式:awk [选项] '[条件]{动作} [条件]{动作} ...' file
项目 说明 条件 用来指定awk处理哪些记录(行) 动作 对记录(行)的处理逻辑,最简单、最常见的是print,动作内部支持数值直接运算
(2)常见选项
选项 说明 -F 指定分隔符,分割符可以指定多个:[分隔符1分隔符2...];分割符也可以是字符串 -v 定义变量、为awk内置变量取值,如果要指定多个变量,就空格隔开写多次
(3)常用条件
语法 说明 BEGIN 读取之前执行,只执行一次 /正则/ 正则匹配行 !/正则/ 取反正则匹配行 数据~/正则/ 特定数据正则匹配行,特定数据可以是列、内置变量 !数据~/正则/ 取反特定数据匹配行 n==m 数值相等、字符串精准匹配 n>m 数值大于 n>=m 数值大于等于 n<m 数值小于 n<=m 数值小于等于 END 读取之后执行,只执行一次
(4)子条件组合
语法 说明 子条件1 && 子条件2 逻辑并 子条件1 || 子条件2 逻辑或
(5)常见内置变量
内置变量 说明 FILENAME 读取行的文件名 NR 读取内容的行号 FNR 每一个文件内读取内容的行号 NF 列数 FS 字段分隔符 RS 读取内容每一行的分隔符 OFS 输出字段的分隔符 ORS 输出行的分隔符 $0 读取的整行内容 $n n != 1,第n个字段的内容
(6)
-v
选项配合print
常见用法# 结合内置变量使用,达到指定各种分隔符的目的 # 只处理第四行内容,且第四行内容的第一列正则匹配"hia", 指定输出各字段的分隔符 # print输出的各字段使用,分割,实际字段分隔符由-v OFS="-"来指定 # print中如果需要拼接字符串,直接把字符串放在""内,拼接到前或者后就可以 awk -vOFS='-' -F "," 'FNR==4&&$1~/hia/{print "f1:"$1,"f2:"$2}' ... file
-
sort
(1) 语法:sort [选项] 文件名
(2)常见选项选项 说明 -n 对于数字字符串使用数值比较 -r 反序 -t 分割符 -k 列号,使用哪一列作为比较的关键字
(3)常见语法
sort -nrt "c" -k 1 file sort -t "c" -k 2 file