shell命令进阶总结

目录

1. shell内置变量

1.1 和脚本文件有关

1.2 字符串精确截取

1.3 默认值相关

2. 表达式

2.1 测试语句

2.2 条件表达式

2.3 计算表达式

3. linux常见符号

3.1 重定向符号

3.2 管道符 |

3.3 其他符号

4. 常见命令详解

4.1 grep命令详解

4.2 sed命令详解

4.3 awk命令详解

4.4 find命令详解

5 简单流程控制语句

5.1 单分支if语句

5.2 双分支if语句

5.3 多分支if语句

5.4 case选择语句

5.5 for循环语句

5.6 while循环语句

5.7 until循环语句

6. 复杂流程控制语句

6.1 函数基础知识

6.2 函数实践


1. shell内置变量

1.1 和脚本文件有关

符号             意义

        $0    获取当前执行的shell脚本文件名,包括脚本路径

        $n    获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大       括号括起来${10}

        $#    获取当前shell命令行中参数的总个数

        $?    获取执行上一个指令的返回值(0为成功,非0为失败)

1.2 字符串精确截取

格式:${变量名:起始位置:截取长度}

        ${file:0:5}     从第1个字符开始,截取5个字符

        ${file::5}      从第1个字符开始,截取5个字符

        ${file:5:5}     从第6个字符开始,截取5个字符

        ${file:5}       从第6个字符开始,截取后面所有的字符

        ${file:0-5}     从倒数第5个字符开始,截取后面所有的字符

        ${file:0-6:3}   从倒数第6个字符开始,截取之后的3个字符

1.3 默认值相关

场景一:  

   变量a如果有内容,那么就输出a的变量值

   变量a如果没有内容,那么就输出默认的内容

   格式:

      ${变量名:-默认值}

场景二:

   无论变量a是否有内容,都输出默认值

   格式:

      ${变量名+默认值}

2. 表达式

2.1 测试语句

测试语句形式

        A: test 条件表达式

        B: [ 条件表达式 ]

格式注意:

        以上两种方法的作用完全一样,后者为常用。

        但后者需要注意方括号[、]与条件表达式之间至少有一个空格。

        test跟 [] 的意思一样

        条件成立,状态返回值是0

        条件不成立,状态返回值是1

操作注意:

        []两侧为什么要有空格

root@ubuntu:~# [-x /bin/bash ]

[-x: command not found

可以看到:两侧没有空格,就会报错,为什么呢?因为你不合规范

2.2 条件表达式

逻辑表达式

逻辑表达式一般用于判断多个条件之间的依赖关系。

常见的逻辑表达式有:   &&  和  ||

&&   

   命令1  &&  命令2

      如果命令1执行成功,那么我才执行命令2      -- 夫唱妇随

      如果命令1执行失败,那么命令2也不执行

   示例:

# [ 1 = 1 ] && echo "条件成立"

条件成立

# [ 1 = 2 ] && echo "条件成立"

#

||

   命令1 || 命令2

      如果命令1执行成功,那么命令2不执行       -- 对着干

      如果命令1执行失败,那么命令2执行           

   示例:

# [ 1 = 2 ] || echo "条件不成立"

条件不成立

# [ 1 = 1 ] || echo "条件不成立"

#

文件表达式

-f    判断输入内容是否是一个文件

   示例:

# [ -f weizhi.sh ] && echo "是一个文件"

是一个文件

# [ -f weizhi.sddh ] || echo "不是一个文件"

不是一个文件

-d    判断输入内容是否是一个目录

-x    判断输入内容是否可执行

数值操作符

主要根据给定的两个值,判断第一个与第二个数的关系,如是否大于、小于、等于第二个数。常见选项如下:

n1 -eq n2            相等

n1 -gt n2             大于

n1 -lt n2              小于

n1 -ne n2           不等于

字符串比较

str1 == str2        str1和str2字符串内容一致

str1 != str2        str1str2字符串内容不一致,!表示相反的意思

判断字符是否内容一致

root@ubuntu:~# [ a == a ]

root@ubuntu:~# echo $?

0

root@ubuntu:~# [ a != a ]

root@ubuntu:~# echo $?

1

2.3 计算表达式

定义:

计算表达式,简单来说就是对具体的内容进行算数计算

格式:

方式一:

$(())        $(( 计算表达式 ))

方式二:

let          let 计算表达式

注意:$(())中只能用+-*/和()运算符,并且只能做整数运算

3. linux常见符号

3.1 重定向符号

在shell脚本中有两种常见的重定向符号 >  和 >>

> 符号

作用:

> 表示将符号左侧的内容,以覆盖的方式输入到右侧文件中

 >> 符号

作用:

>> 表示将符号左侧的内容,以追加的方式输入到右侧文件的末尾行中

3.2 管道符 |

 | 这个就是管道符,传递信息使用的

使用格式:

命令1 | 命令2

管道符左侧命令1 执行后的结果,传递给管道符右侧的命令2使用

命令演示:

查看当前系统中的全局变量SHELL

admin-1@ubuntu:~$ env | grep SHELL

SHELL=/bin/bash

3.3 其他符号

后台展示符号 &

定义:& 就是将一个命令从前台转到后台执行

使用格式:命令 &

全部信息符号 2>&1

符号详解:

        1 表示正确输出的信息

        2 表示错误输出的信息

        2>&1 代表所有输出的信息

综合演练示例

脚本内容

#!/bin/bash

echo '下一条错误命令'

dsfsafsafdsa

脚本执行效果

admin-1@ubuntu:~# bash ceshi.sh

下一条错误命令

ceshi.sh: line 3: dsfsafsafdsa: command not found

1 和 2 综合演练

admin-1@ubuntu:~# bash ceshi.sh 1>> ceshi-ok 2>> ceshi-err

admin-1@ubuntu:~# cat ceshi-ok

下一条错误命令

admin-1@ubuntu:~# cat ceshi-err

ceshi.sh: line 3: dsfsafsafdsa: command not found

全部信息演练

admin-1@ubuntu:~# bash ceshi.sh >> ceshi-all 2>&1

admin-1@ubuntu:~# cat ceshi-all

下一条错误命令

ceshi.sh: line 3: dsfsafsafdsa: command not found

linux系统垃圾桶

        /dev/null 是linux下的一个设备文件,

        这个文件类似于一个垃圾桶,特点是:容量无限

4. 常见命令详解

4.1 grep命令详解

grep命令是我们常用的一个强大的文本搜索命令。

命令格式详解

grep [参数] [关键字] <文件名>

注意:

我们在查看某个文件的内容的时候,是需要有<文件名>

grep命令在结合|(管道符)使用的情况下,后面的<文件名>是没有的

可以通过 grep --help 查看grep的帮助信息

参数详解

  • -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  • -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -c 或 --count : 计算符合样式的列数。
  • -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
  • -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
  • -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
  • -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
  • -i 或 --ignore-case : 忽略字符大小写的差别。
  • -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
  • -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
  • -o 或 --only-matching : 只显示匹配PATTERN 部分。
  • -v 或 --invert-match : 显示不包含匹配文本的所有行。

4.2 sed命令详解

sed 文件编辑工具。因为它编辑文件是以为单位的。

命令格式详解

命令格式:

sed [参数] '<匹配条件> [动作]' [文件名]

注意:可以通过 sed --help 查看grep的帮助信息

参数详解:

        参数为空   表示sed的操作效果,实际上不对文件进行编辑

        -i        表示对文件进行编辑

注意:mac版本的bash中使用 -i参数,必须在后面单独加个东西: -i ''

匹配条件:

        匹配条件分为两种:数字行号或者关键字匹配

        关键字匹配格式:

                '/关键字/'

        注意:隔离符号 / 可以更换成 @、#、!等符号

        根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可。

动作详解

  •         -a    在匹配到的内容下一行增加内容
  •         -i    在匹配到的内容上一行增加内容
  •         -d    删除匹配到的内容
  •         -s    替换匹配到的内容

注意:上面的动作应该在参数为-i的时候使用,不然的话不会有效果

替换命令演示

关于替换,我们从三个方面来学习:

行号、列号、全体

命令格式:

sed -i [替换格式] [文件名]

注意:替换命令的写法:'s###'  --->  's#原内容##' ---> 's#原内容#替换后内容#'

常见替换格式:

模板文件内容

admin-1@ubuntu:~$ cat sed.txt

nihao sed sed sed

nihao sed sed sed

nihao sed sed sed

替换每行首个匹配内容:

sed -i 's#原内容#替换后内容#' 文件名

示例:替换首每行的第1个sed为SED

admin-1@ubuntu:~$ sed -i 's#sed#SED#' sed.txt

admin-1@ubuntu:~$ cat sed.txt

nihao SED sed sed

nihao SED sed sed

nihao SED sed sed

替换全部匹配内容:

sed -i 's#原内容#替换后内容#g' 文件名

示例:替换全部sed为des

admin-1@ubuntu:~$ sed -i 's#sed#SED#g' sed.txt

admin-1@ubuntu:~$ cat sed.txt

nihao SED SED SED

nihao SED SED SED

nihao SED SED SED

指定行号替换首个匹配内容:

sed -i '行号s#原内容#替换后内容#' 文件名

示例:替换第2行的首个SED为sed

admin-1@ubuntu:~$ sed -i '2s#SED#sed#' sed.txt

admin-1@ubuntu:~$ cat sed.txt

nihao SED SED SED

nihao sed SED SED

nihao SED SED SED

首行指定列号替换匹配内容:

sed -i 's#原内容#替换后内容#列号' 文件名

示例:替换每行的第2个SED为sed

admin-1@ubuntu:~$ sed -i 's#SED#sed#2' sed.txt

admin-1@ubuntu:~$ cat sed.txt

nihao SED sed SED

nihao sed SED sed

nihao SED sed SED

指定行号列号匹配内容:

sed -i '行号s#原内容#替换后内容#列号' 文件名

示例:替换第3行的第2个SED为sed

admin-1@ubuntu:~$ sed -i '3s#SED#sed#2' sed.txt

admin-1@ubuntu:~$ cat sed.txt

nihao SED sed SED

nihao sed SED sed

nihao SED sed sed

增加操作

作用:在指定行号的下一行增加内容

格式:sed -i '行号a\增加的内容' 文件名

注意:如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如

sed -i '1,3a\增加内容' 文件名

演示效果:

指定行号增加内容

admin-1@ubuntu:~$ sed -i '2a\zengjia-2' sed.txt

admin-1@ubuntu:~$ cat sed.txt

nihao SED sed SED

nihao sed SED sed

zengjia-2

nihao SED sed sed

指定1~3每行都增加内容

admin-1@ubuntu:~$ sed -i '1,3a\tongshi-2' sed.txt

admin-1@ubuntu:~$ cat sed.txt

nihao SED sed SED

tongshi-2

nihao sed SED sed

tongshi-2

zengjia-2

tongshi-2

nihao SED sed sed

作用:在指定行号的当行增加内容

格式:sed -i '行号i\增加的内容' 文件名

注意:如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如

sed -i '1,3a\增加内容' 文件名

演示效果:

指定行号增加内容

admin-1@ubuntu:~$ sed -i '1i\insert-1' sed.txt

admin-1@ubuntu:~$ cat sed.txt

insert-1

nihao SED sed SED

tongshi-2

nihao sed SED sed

tongshi-2

zengjia-2

tongshi-2

nihao SED sed sed

删除操作

作用:指定行号删除

格式:sed -i '行号d' 文件名

注意:如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开,例如

sed -i '1,3d' 文件名

删除演练

删除第4行内容

admin-1@ubuntu:~$ sed -i '4d' sed.txt

admin-1@ubuntu:~$ cat sed.txt

insert-1

nihao SED sed SED

tongshi-2

tongshi-2

zengjia-2

tongshi-2

nihao SED sed sed

删除多行(3-5行)内容

admin-1@ubuntu:~$ sed -i '3,5d' sed.txt

admin-1@ubuntu:~$ cat sed.txt

insert-1

nihao SED sed SED

tongshi-2

nihao SED sed sed

4.3 awk命令详解

awk是一个功能非常强大的文档编辑工具,它不仅能以行为单位还能以列为单位处理文件。

命令格式:

        awk [参数] '[ 动作]' [文件名]

常见参数:

        -F    指定行的分隔符

常见动作:

        print  显示内容

        $0    显示当前行所有内容

        $n    显示当前行的第n列内容,如果存在多个$n,它们之间使用逗号(,)隔开

常见内置变量

FILENAME 当前输入文件的文件名,该变量是只读的

        NR        指定显示行的行号

        NF        输出 最后一列的内容

        OFS       输出格式的列分隔符,缺省是空格

        FS        输入文件的列分融符,缺省是连续的空格和Tab

命令演示

模板文件内容

admin-1@ubuntu:~$ cat awk.txt

nihao awk awk awk

nihao awk awk awk

打印指定列内容

打印第1列的内容

admin-1@ubuntu:~$ awk '{print $1}' awk.txt

nihao

nihao

指定行打印内容

打印第一行第1和第3列内容

admin-1@ubuntu:~$ awk  'NR==1 {print $1,$3}' awk.txt

nihao awk

指定隔离分隔符,查看内容

admin-1@ubuntu:~$ cat linshi.txt

root:x:0:0:root:/root:/bin/bash

admin-1@ubuntu:~$ awk -F ':' '{print $1,$7}' linshi.txt

root /bin/bash

设置显示分隔符,显示内容

admin-1@ubuntu:~$ awk 'BEGIN{OFS=":"} {print NR,$0}' awk.txt

1:nihao awk awk awk

2:nihao awk awk awk

4.4 find命令详解

命令格式:

        find [路径] [参数] [关键字]

参数详解

        -name 按照文件名查找文件。

        -perm 按照文件权限来查找文件。

        -user 按照文件属主来查找文件。

        -group 按照文件所属的组来查找文件。

        -type 查找某一类型的文件,

                诸如:

                        b - 块设备文件    d - 目录         c - 字符设备文件

                        p - 管道文件      l - 符号链接文件   f - 普通文件。

        -size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。

        -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。

         -mindepth n:在查找文件时,查找当前目录中的第n层目录的文件,然后再在其子目录中查找。

        ! : 表示取反

5 简单流程控制语句

5.1 单分支if语句

语法格式

if [ 条件 ]

then

    指令

fi

场景:单一条件,只有一个输出

单分支if语句示例

#!/bin/bash

# 单if语句的使用场景

if [ "$1" == "nan" ]

then

   echo "您的性别是 男"

fi

5.2 双分支if语句

语法格式

if [ 条件 ]

then

    指令1

else

    指令2

fi

场景:   一个条件,两种结果

双分支if语句示例

#!/bin/bash

# 单if语句的使用场景

if [ "$1" == "nan" ]

then

   echo "您的性别是 男"

else

   echo "您的性别是 女"

fi 

5.3 多分支if语句

语法格式

if [ 条件 ]

then

    指令1

elif [ 条件2 ]

then

    指令2

else

    指令3

fi

场景:n个条件,n+1个结果

5.4 case选择语句

我们发现多if语句使用的时候,代码量很多,而且整体看起来确实有那么一丁点乱,有没有办法更好的实现这种效果呢?就是Case语句。

case 语句格式

case 变量名 in

   值1)

      指令1

         ;;

   值2)

      指令2

         ;;

   值3)

    指令3

         ;;

esac

注意:首行关键字是case,末行关键字esac,选择项后面都有 ),每个选择的执行语句结尾都有两个分号;

5.5 for循环语句

循环指定的所有元素,循环完毕之后就推出

语法格式

语法格式

for 值 in 列表

do

   执行语句

done

场景:遍历列表

注意:”for” 循环总是接收 “in” 语句之后的某种类型的字列表

执行次数和list列表中常数或字符串的个数相同,当循环的数量足够了,就自动退出

示例:遍历文件

#!/bin/bash

# for语句的使用示例

for i in $(ls /root)

do

  echo "${i}"

done

5.6 while循环语句

语法格式

while 条件

do

   执行语句

done

注意:条件的类型:命令、[[ 字符串表达式 ]]、(( 数字表达式 ))

场景:只要条件满足,就一直循环下去

while语句示例

脚本内容

#!/bin/bash

# while的示例

a=1

while [ "${a}" -lt 5 ]

do

   echo "${a}"

   a=$((a+1))

done

5.7 until循环语句

语法格式

until 条件

do

   执行语句

done

注意:条件的类型:命令、[[ 字符串表达式 ]]、(( 数字表达式 ))

场景:只要条件不满足,就一直循环下去

6. 复杂流程控制语句

6.1 函数基础知识

函数是什么?

        函数就是将某些命令组合起来实现某一特殊功能的方式,是脚本编写中非常重要的一部分。

简单函数格式:

定义函数:

函数名(){

    函数体

}

   调用函数:

函数名

传参函数格式:

传参数

函数名 参数

   函数体调用参数:

函数名(){

    函数体 $n

}

   注意:类似于shell内置变量中的位置参数

6.2 函数实践

简单函数定义和调用示例

#!/bin/bash

# 函数使用场景一:执行频繁的命令

dayin(){

  echo "wo de mingzi shi  111"

}

dayin

函数传参和函数体内调用参数示例

#!/bin/bash

# 函数的使用场景二

dayin(){

  echo "wo de mingzi shi $1"

}

dayin 111

函数调用脚本传参

#!/bin/bash

# 函数传参演示



# 定义传参数函数

dayin(){

  echo "wode mignzi shi $1"

}



# 函数传参

dayin $1

脚本传多参,函数分别调用示例

#!/bin/bash

# 函数的使用场景二

dayin(){

  echo "wo de mingzi shi $1"

  echo "wo de mingzi shi $2"

  echo "wo de mingzi shi $3"

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大帅不是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值