2022-06-30 Shell脚本入门

一、Shell脚本概述

  1. 脚本格式
    shell脚本以#!/bin/bash开头,用来指定解释器:
    #!/bin/bash
    
    # 下面是具体逻辑
    ...
    
    shell脚本的后缀名最好为.sh,看到便知道该文件为一个shell脚本。
  2. shell脚本的执行方式
    (1) 将shell脚本文件作为解释器的参数
    /bin/bash 脚本文件
    
    (2)赋予脚本可执行权限
    # 赋予执行权限
    chmod u+x 脚本文件
    # 执行,使用绝对路径或者相对路径指定要运行的shell脚本
    # 如果将shell脚本放置在了环境变量中,可以直接使用脚本文件名运行
    脚本文件
    

二、变量

  1. 定义变量:变量名=变量值
  2. 访问变量:$变量名
  3. 销毁变量:unset 变量名
  4. 双引号和单引号
    引号			说明
    ""			双引号中的一些特殊符号会被shell解析到
    ''			单引号中的所有内容都是字符串
    
  5. 常用系统变量
    系统变量			说明
    $HOME			当前登录用户的家目录
    $USER			当前登录用户名
    $SHELL			默认使用的解释器
    $PWD			当前工作目录
    $#				向shell脚本传入的参数个数
    $*				向shell脚本传入的所有参数,所有参数会被当做一个整体
    $@				向shell脚本传入的所有参数,所有番薯不会被当作一个整体
    $n				调用传入shell脚本的参数,$0是脚本名称,$1是第一个参数,当n超过9后,需要像${10}一样去使用参数
    $?				上一条命令执行后的返回值,0表示执行正常,非0表示执行失败;如果是条件,0表示true,1表示false
    
  6. 升级为系统变量:export 变量

三、数值运算

语法格式:$[算式],算式中如果使用到变量,需要每一个使用到的变量前加上$访问其值。

四、条件判断

  1. 语法格式为:[[ 条件表达式 ]],返回值为0或者1,0表示true1表示false
  2. 常用判断条件
    (1) 整数的判断
    # 如果要访问变量,需要前置$
    语法格式					说明
    [[ n1 -gt n2 ]]			大于
    [[ n1 -eq n2 ]]			等于
    [[ n1 -lt n2 ]]			小于
    [[ n1 -ne n2 ]]			不等于
    [[ n1 -ge n2 ]]			大于等于
    [[ n1 -le n2 ]]			小于等于
    
    (2)字符串的判断
    # 如果要访问变量,需要前置$
    # 字符串大小按照字典序比较
    语法格式					说明
    [[ s1 > s2 ]]			大于
    [[ s1 == s2 ]]			等于,不是简单的全等于,而是模式匹配
    [[ s1 < s2 ]]			小于
    [[ s1 != s2 ]]			不等于,不是简单的全部等于,而是模式匹配
    [[ s1 >= s2 ]]			大于等于
    [[ s1 <= s2 ]]			小于等于
    [[ -z s1 ]]				字符串为空
    
    (3) 文件判断
    # 如果要访问变量,需要前置$
    语法格式				说明
    [[ -r file ]]		文件存在且当前用户对该文件具有可读权限
    [[ -w file ]]		文件存在且当前用户对该文件具有写入权限
    [[ -x file ]]		文件存在且当前用户对该文件具有执行权限
    [[ -e file ]]		文件存在
    [[ -f file ]]		文件存在且为普通文件
    [[ -d file ]]		文件存在且为目录
    
    (4) 取反
    语法格式为:[[ ! condition ]]!置于最前
    (5) 组合条件判断:
    # 允许使用()来优先判断
    语法格式								说明
    [[ condition1 && condition2 ]]		逻辑并
    [[ condition1 || condition2 ]]		逻辑或
    

五、常用流程判断

  1. if
    # 语法格式为
    if [[ condition1 ]]
    then
    	...
    elif [[ condition2 ]]
    then
    	...
    elif [[ condition3 ]]
    then
    	...
    ...
    else
    	...
    fi
    
  2. case
    # 语法格式为,支持的是模式匹配
    case $v in
    s1)
    	...
    ;;
    s2)
    	...
    ;;
    ...
    *)
    	...
    ;;
    esac
    
  3. 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 提示信息] 变量名,可以使用$变量名来访问变量值

七、函数

  1. 系统函数
    语法格式						说明
    basename /root/hello.txt	获取最后一个/后的字符串:hello.txt
    dirname	 /root/hello/txt	获取最后一个/前的整个字符串:/root
    
  2. 自定义函数
    # 定义
    function function-name(){
    	# 可以通过$n的方式访问传入函数的参数
    	# 可以童工$var-name的方式访问函数外部和内部声明定义的变量
    	...
    }
    
    # 调用
    function-name arg1 arg2 ...
    

八、常用工具

  1. tr

    语法格式							说明
    其他命令的输出 | tr -s 字符		将指定的多个连续的字符变成一个
    
  2. cut

    # 语法为
    cut -d 分割字符 -f 列号 file
    
    # 列号书写方式
    # 单列:-f c
    # 多个不连续列:-f c1,c2
    # 多个连续列:-f c1-c2
    # 到最后一列:-f c1-
    
  3. 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
    
  4. sort
    (1) 语法:sort [选项] 文件名
    (2)常见选项

    选项				说明
    -n				对于数字字符串使用数值比较
    -r				反序
    -t				分割符
    -k				列号,使用哪一列作为比较的关键字
    

    (3)常见语法

    sort -nrt "c" -k 1 file
    sort -t "c" -k 2 file
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值