什么是Shell?快速入门上手Shell!

Shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统内核。是一个功能强大的编程语言,易编写、易调试、灵活性高。
什么是Shell?快速入门上手Shell!_第1张图片
Linux提供的Shell解析器有六种:cat /etc/shells

  • /bin/sh
  • /bin/bash,在CentOS中默认解析器为bash
  • /sbin/nologin
  • /bin/dash
  • /bin/tcsh
  • /bin/csh

脚本格式

  • 脚本以#!/bin/bash开头

    #!/bin/bash
    
    echo "hello world"
    
  • 运行脚本文件可通过:sh xx.shbash xx.sh./xx.sh(注意需要.sh具备执行权限[x],chmod 777)

  • 通过touch xx.sh创建脚本文件,通过vim xx.sh编辑脚本文件。

系统变量

  • $HOME,当前登录用户的home目录
  • $PWD,当前所在目录路径
  • $SHELL,默认shell解析器
  • $USER,当前登录用户

自定义变量

  • 基本语法
    • 定义变量:变量=值
    • 撤销变量:unset 变量名
    • 声明静态变量:readonly 变量名,注意不能撤销静态变量,重启即无效。
    • 变量定义规则:字母、数字、下划线组成,不能以数字开头,建议环境变量大写。
    • 等号左右无空格,严格要求
    • 变量默认为字符串类型,无法直接进行数值运算。
    • 变量的值若有空格,需要用引号括起来
    • 将脚本中的局部变量,提升为全局变量:export 变量名

特殊变量

  • $n

    • 功能描述:n为数字。$0,代表该脚本名称;$1-$9,代表第一到第九个参数;第十以上的参数需要用${10}表示。

      touch partmeter.sh

      vim partmeter.sh

      #!/bin/bash
      
      echo "$0 $1 $2"
      

      bash partmeter.sh p1 p2

      partmeter.sh p1 p2

  • $#

    • 功能描述:获取所有输入参数个数,常用于循环

      #!/bin/bash
      
      echo "$#"
      

      bash partmeter.sh p1 p2

      2

  • $*

    • 功能描述:获取命令行中所有的参数,将所有入参看做一个整体

      #!/bin/bash
          
      echo "$*"
      

      bash partmeter.sh p1 p2
      p1 p2

  • $@

    • 功能描述:获取命令行中所有的参数,将所有入参区分对待

      #!/bin/bash
      
      echo "$@"
      

      bash partmeter.sh p1 p2
      p1 p2

  • $?

    • 功能描述:最后一次执行命令的返回状态。若变量值为0,证明上一次命令执行正确;若变量值为非零,证明上一个命令执行出现错误。

运算符

  • 基本语法
    • $((运算式))$[运算式]
    • expr 运算(运算符之间必须有空格
      • +,加
      • -,减
      • \*,乘
      • /,除
      • %,取余
      • 运算执行符号:`expr 2 + 3

条件判断

  • 基本语法
    • [ condition ]注意表达式前后需要有空格
    • [ test ],条件非空即为true;[],条件为空即为false;
  • 常用判断条件
    • = 字符串比较
    • -lt,小于
    • -le,小于等于
    • -eq,等于
    • gt,大于
    • ge,大于等于
    • ne,不等于
    • -r,有读的权限
    • -w,有写的权限
    • -x,有执行的权限
    • -f,文件存在且是一个常规文件file
    • -e,文件存在
    • -d,文件存在且是一个目录directory
  • 多条件判断
    • &&,前一条命令执行成功时,才执行后一条命令
    • ||,前一条命令执行失败时,才执行后一条命令

流程控制

if
  • 基本语法:if后要有空格,条件表达式[]前后必须有空格;elif,代表else if;fi结尾。

    #!/bin/bash
    
    if [ condition1 ];then
        content1
    elif [ condition2 ]
    then
        content2
    fi
    
case
  • 基本语法:case $变量名 in value)格式,;;case结尾,类似break;*)代表default分支;esac结尾;

    #!/bin/bash
    
    case $1 in
    1)
    	content1
    	;;
    2)
    	content2
    	;;
    3)
    	content3
    	;;
    *)
    	content4
    	;;
    esac
    
for
  • 基本语法1:for((初始值;循环控制条件;变量变化))格式;do方法体;done结尾;具体累加1-100的和:

    #!/bin/bash
    
    s=0
    for((i=1;i<=100;i++))
    do
    	s=$[$s+$i]
    done
    
    echo $s
    
  • 基本语法2:for 变量 in value1 value2 value3格式;$@区分处理每个入参,$*入参为整体进行处理

    #!/bin.bash
    
    for i in "$*"
    do
    	echo "ceshi * $*"
    done
    
    for j in "$@"
    do 
    	echo "ceshi @ $@"
    done
    

    bash ceshi.sh zs ls

    输出结果为:

    ceshi * zs ls

    ceshi @ zs

    ceshi @ ls

while
  • 基本语法:while [ condition ]格式;do方法体;done结尾;具体累加1-100的和:

    #!/bin/bash
    
    s=0
    i=0
    while [ $i -le 100]
    do
    	s=$[$s+$i]
    	i=$[$i+1]
    done
    

Read读取控制台输入

  • 基本语法:read(选项)(参数)

    • 选项
      • -p,指定读取值时的提示符
      • -t,指定读取值时等待的时间(秒)
    • 参数
      • 变量:指定读取值的变量名
  • 举例:七秒内在控制台上输入name

    #!/bin/bash
    
    read -t 7 -p "input your name in 7 seconds" name
    
    echo $name
    

函数

系统函数
  • basename [string/pathname][suffix],截取指定路径下的文件名称
  • dirname 文件绝对路径,从给定包含绝对路径的文件名中取出文件的所在路径
自定义函数
  • 基本语法

    // 声明函数
    function funname[()]{
    	action;
    	[return int;]
    }
    funname // 执行函数
    

Shell工具

cut命令
  • 从文件的每一行剪切字节、字符和字段,并将这些字节、字符、字段输出。

  • 基本用法

    • cut [选项参数] filename

    • 选项参数

      • -f,列号,提取第几列
      • -d,分隔符,按照指定分隔符分割列,默认分割符为制表符\t
    • 举例:以空格为分割符,切割文件内容第二列及以后内容输出

      cut -d " " -f 2- cut.txt

sed
  • 流编辑器,一次处理一行内容。处理行内容时,把当前的行内容存储在临时缓存区中,称为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后将内容输出。接着处理下一行,直到文末末尾。

  • 基本用法

    • sed [选项参数] "命令功能" filename

    • 选项参数

      • -e,直接在指定列模式上进行sed的动作编辑
    • 命令功能(常用)

      • a,新增
      • d,删除
      • s,查找并替换
    • 举例:

      • 在文件第二行添加内容:add content

        sed "2a add contend" filename

      • 删除文件中包含wo的行

        sed "/wo/d" filename

      • 用ni替换文件中的wo

        sed "s/wo/ni/g" filenameg代表全局替换

      • 删除文件第二行并用ni替换文件中的wo

        sed -e "2d" -e "s/wo/ni/g" filename

awk
  • 文本分析工具,把文件逐行读入,默认以空格为分隔符将每行切片,切开的部分可在进行分析处理。

  • 基本用法:awk [选项参数] 'pattern1{action1} pattern2{action2} ...' filenamepattern匹配正则表达式;action匹配内容符合时所执行的命令。

    • 选项参数

      • -F,指定输入文件分隔符
      • -v,复制一个用户定义变量
    • 内置变量

      • FILENAME,文件名
      • NR,已读记录数
      • NF,浏览记录的域的个数(切割后,列的个数)
    • 举例:搜索文件以root开头的所有行,并输出该行的第七列

      awk -F : '/^root/{print $7}' filename

sort
  • 文件排序,并按照排序结果标准输出

  • 基本用法

    • sort(选项)(参数)

      • 选项

      • -n,按照数值大小排序

      • -r,以相反的顺序排序

      • -t,设置排序的所用分割字符

      • -k,指定需要排序的列

      • 参数

        • 指定待排序的文件列表
      • 举例:文件按照冒号分割,第三列倒序排序

        sort -t : -nrk 3 filename

你可能感兴趣的:(shell,bash,linux)