Shell基础

目录

第1章 Shell概述

第2章 Shell脚本入门

第3章 变量

3.1 系统预定义变量

3.2 自定义变量

3.3 特殊变量

3.3.1 $n

3.3.2 $#

3.3.3 $*、$@

3.3.4 $?

第4章 运算符

第5章 条件判断

第6章 流程控制(重点)

6.1 if判断

6.2 case语句

6.3 for循环

6.4 while循环

第7章 read读取控制台输入

第8章 函数

8.1 系统函数

8.1.1 basename

8.1.2 dirname

8.2 自定义函数

第9章 Shell工具(重点)

9.1 cut

9.2 awk

第10章 正则表达式入门

10.1 常规匹配

10.2 常用特殊字符


第1章 Shell概述

1)Linux提供的Shell解析器有

[root@hadoop101 ~]$ cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin

/bin/tcsh

/bin/csh

2)bash和sh的关系

ll | grep bash

-rwxr-xr-x. 1 root root 941880 5月  11 2016 bash

lrwxrwxrwx. 1 root root      4 5月  27 2017 sh -> bash

3)Centos默认的解析器是bash

[root@hadoop101 bin]$ echo $SHELL

/bin/bash

第2章 Shell脚本入门

1)脚本格式

脚本以#!/bin/bash开头(指定解析器)

2)第一个Shell脚本:helloworld.sh

(1)需求:创建一个Shell脚本,输出helloworld

(2)案例实操:

[root@hadoop101 shells]$ touch helloworld.sh

[root@hadoop101 shells]$ vim helloworld.sh

在helloworld.sh中输入如下内容

#!/bin/bash

echo "helloworld"

(3)脚本的常用执行方式

第一种:采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)

sh+脚本的相对路径

[root@hadoop101 shells]$ sh ./helloworld.sh

Helloworld

#sh+脚本的绝对路径

[root@hadoop101 shells]$ sh /home/root/shells/helloworld.sh

helloworld

 #bash+脚本的相对路径

[root@hadoop101 shells]$ bash ./helloworld.sh

Helloworld

# bash+脚本的绝对路径

[root@hadoop101 shells]$ bash /home/root/shells/helloworld.sh

Helloworld

第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x

①首先要赋予helloworld.sh 脚本的+x权限

[root@hadoop101 shells]$ chmod +x helloworld.sh

②执行脚本

相对路径

[root@hadoop101 shells]$ ./helloworld.sh

Helloworld

绝对路径

[root@hadoop101 shells]$ /home/root/shells/helloworld.sh

Helloworld

注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。

【了解】第三种:在脚本的路径前加上“.”或者 source

①有以下脚本

[root@hadoop101 shells]$ cat test.sh

#!/bin/bash

A=5

echo $A

②分别使用sh,bash,./ 和 . 的方式来执行,结果如下:

[root@hadoop101 shells]$ bash test.sh

[root@hadoop101 shells]$ echo $A

[root@hadoop101 shells]$ sh test.sh

[root@hadoop101 shells]$ echo $A

[root@hadoop101 shells]$ ./test.sh

[root@hadoop101 shells]$ echo $A

[root@hadoop101 shells]$ . test.sh

[root@hadoop101 shells]$ echo $A

5

原因:

前两种方式都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。

第三种,也就是使用在脚本路径前加“.”或者 source的方式,可以使脚本内容在当前shell里执行,而无需打开子shell!这也是为什么我们每次要修改完/etc/profile文件以后,需要source一下的原因。

开子shell与不开子shell的区别就在于,环境变量的继承关系,如在子shell中设置的当前变量,父shell是不可见的。

第3章 变量

3.1 系统预定义变量

1)常用系统变量

$HOME、$PWD、$SHELL、$USER、$PATH

2)案例实操

(1)查看系统变量的值

[root@hadoop101 shells]$ echo $HOME

/home/root

(2)显示当前Shell中所有变量:set

[root@hadoop101 shells]$ set

BASH=/bin/bash

BASH_ALIASES=()

BASH_ARGC=()

BASH_ARGV=()

3.2 自定义变量

1)基本语法

(1)定义变量:变量名=变量值,注意,=号前后不能有空格

(2)撤销变量:unset 变量名

(3)声明静态变量:readonly变量,注意:不能unset

2)变量定义规则

(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

(2)等号两侧不能有空格

(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

(4)变量的值如果有空格,需要使用双引号或单引号括起来。

3)案例实操

(1)定义变量A

[root@hadoop101 shells]$ A=5

[root@hadoop101 shells]$ echo $A

5

(2)给变量A重新赋值

[root@hadoop101 shells]$ A=8

[root@hadoop101 shells]$ echo $A

8

(3)撤销变量A

[root@hadoop101 shells]$ unset A

[root@hadoop101 shells]$ echo $A

(4)声明静态的变量B=2,不能unset

[root@hadoop101 shells]$ readonly B=2

[root@hadoop101 shells]$ echo $B

2

[root@hadoop101 shells]$ B=9

-bash: B: readonly variable

(5)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算

[root@hadoop102 ~]$ C=1+2

[root@hadoop102 ~]$ echo $C

1+2

(6)变量的值如果有空格,需要使用双引号或单引号括起来

[root@hadoop102 ~]$ D=I love banzhang

-bash: world: command not found

[root@hadoop102 ~]$ D="I love banzhang"

[root@hadoop102 ~]$ echo $D

I love banzhang

(7)可把变量提升为全局环境变量,可供其他Shell程序使用

export 变量名

[root@hadoop101 shells]$ vim helloworld.sh

# 在helloworld.sh文件中增加echo $B

#!/bin/bash

echo "helloworld"

echo $B

[root@hadoop101 shells]$ ./helloworld.sh

Helloworld

#发现并没有打印输出变量B的值。

[root@hadoop101 shells]$ export B

[root@hadoop101 shells]$ ./helloworld.sh

helloworld

2

3.3 特殊变量

3.3.1 $n

1)基本语法

$n    (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})

2)案例实操

[root@hadoop101 shells]$ touch parameter.sh

[root@hadoop101 shells]$ vim parameter.sh

#!/bin/bash

echo '==========$n=========='

echo $0

echo $1

echo $2

[root@hadoop101 shells]$ chmod 777 parameter.sh

[root@hadoop101 shells]$ ./parameter.sh cls xz

==========$n==========

./parameter.sh

cls

xz

3.3.2 $#

1)基本语法

$#    (功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)。

2)案例实操

[root@hadoop101 shells]$ vim parameter.sh

#!/bin/bash

echo '==========$n=========='

echo $0

echo $1

echo $2

echo '==========$#=========='

echo $#

[root@hadoop101 shells]$ chmod 777 parameter.sh

[root@hadoop101 shells]$ ./parameter.sh cls xz

==========$n==========

./parameter.sh

cls

xz

==========$#==========

2

3.3.3 $*、$@

1)基本语法

$*    (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体

$@  (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待

2)案例实操

[root@hadoop101 shells]$ vim parameter.sh

#!/bin/bash

echo '==========$n=========='

echo $0

echo $1

echo $2

echo '==========$#=========='

echo $#

echo '==========$*=========='

echo $*

echo '==========$@=========='

echo $@

[root@hadoop101 shells]$ ./parameter.sh a b c d e f g

==========$n==========

./parameter.sh

a

b

==========$#==========

7

==========$*==========

a b c d e f g

==========$@==========

a b c d e f g

3.3.4 $?

1)基本语法

$?  (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

2)案例实操

判断helloworld.sh脚本是否正确执行

[root@hadoop101 shells]$ ./helloworld.sh

hello world

[root@hadoop101 shells]$ echo $?

0

第4章 运算符

1)基本语法

“$((运算式))” 或 “$[运算式]”

2)案例实操:

计算(2+3)* 4的值

[root@hadoop101 shells]# S=$[(2+3)*4]

[root@hadoop101 shells]# echo $S

第5章 条件判断

1)基本语法

(1)test condition

(2)[ condition ](注意condition前后要有空格

注意:条件非空即为true,[ root ]返回true,[  ] 返回false。

2)常用判断条件

(1)两个整数之间比较

-eq 等于(equal)                         -ne 不等于(not equal)

-lt 小于(less than)                     -le 小于等于(less equal)

-gt 大于(greater than)       -ge 大于等于(greater equal)    

(2)按照文件权限进行判断

-r 有读的权限(read)

-w 有写的权限(write)

-x 有执行的权限(execute)

(3)按照文件类型进行判断

-e 文件存在(existence)

-f 文件存在并且是一个常规的文件(file)

-d 文件存在并且是一个目录(directory)

3)案例实操

(1)23是否大于等于22

[root@hadoop101 shells]$ [ 23 -ge 22 ]

[root@hadoop101 shells]$ echo $?

0

(2)helloworld.sh是否具有写权限

[root@hadoop101 shells]$ [ -w helloworld.sh ]

[root@hadoop101 shells]$ echo $?

0

(3)/home/root/cls.txt目录中的文件是否存在

[root@hadoop101 shells]$ [ -e /home/root/cls.txt ]

[root@hadoop101 shells]$ echo $?

1

(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)

[root@hadoop101 ~]$ [ root ] && echo OK || echo notOK

OK

[root@hadoop101 shells]$ [ ] && echo OK || echo notOK

notOK

第6章 流程控制(重点)

6.1 if判断

1)基本语法

(1)单分支

if [ 条件判断式 ];then

    程序

fi

或者

if  [ 条件判断式 ]

then

    程序

fi

(2)多分支

if [ 条件判断式 ]

then

    程序

elif [ 条件判断式 ]

then

   程序

else

   程序

fi

注意事项:

①[ 条件判断式 ],中括号和条件判断式之间必须有空格

②if后要有空格

2)案例实操

输入一个数字,如果是1,则输出banzhang zhen shuai,如果是2,则输出cls zhen mei,如果是其它,什么也不输出。

[root@hadoop101 shells]$ touch if.sh

[root@hadoop101 shells]$ vim if.sh

#!/bin/bash

if [ $1 -eq 1 ]

then

        echo "banzhang zhen shuai"

elif [ $1 -eq 2 ]

then

        echo "cls zhen mei"

fi

[root@hadoop101 shells]$ chmod 777 if.sh

[root@hadoop101 shells]$ ./if.sh 1

banzhang zhen shuai

6.2 case语句

1)基本语法

case $变量名 in

"值1")

    如果变量的值等于值1,则执行程序1

;;

"值2")

    如果变量的值等于值2,则执行程序2

;;

    …省略其他分支…

*)

    如果变量的值都不是以上的值,则执行此程序

;;

esac

注意事项:

(1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

(2)双分号“;;”表示命令序列结束,相当于java中的break。

(3)最后的“*)”表示默认模式,相当于java中的default。

2)案例实操

输入一个数字,如果是1,则输出banzhang,如果是2,则输出cls,如果是其它,输出renyao。

[root@hadoop101 shells]$ touch case.sh

[root@hadoop101 shells]$ vim case.sh

!/bin/bash

case $1 in

"1")

        echo "banzhang"

;;

"2")

        echo "cls"

;;

*)

        echo "renyao"

;;

esac

[root@hadoop101 shells]$ chmod 777 case.sh

[root@hadoop101 shells]$ ./case.sh 1

1

6.3 for循环

1)基本语法1

for (( 初始值;循环控制条件;变量变化 ))

do

    程序

done

2)案例实操

从1加到100

[root@hadoop101 shells]$ touch for1.sh

[root@hadoop101 shells]$ vim for1.sh

#!/bin/bash

sum=0

for((i=0;i<=100;i++))

do

        sum=$[$sum+$i]

done

echo $sum

[root@hadoop101 shells]$ chmod 777 for1.sh

[root@hadoop101 shells]$ ./for1.sh

5050

3)基本语法2

for 变量 in 值1 值2 值3…

do

    程序

done

4)案例实操

(1)打印所有输入参数

[root@hadoop101 shells]$ touch for2.sh

[root@hadoop101 shells]$ vim for2.sh

#!/bin/bash

#打印数字

for i in cls mly wls

do

      echo "ban zhang love $i"

done

[root@hadoop101 shells]$ chmod 777 for2.sh

[root@hadoop101 shells]$ ./for2.sh

ban zhang love cls

ban zhang love mly

ban zhang love wls

(2)比较$*和$@区别

$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数。

[root@hadoop101 shells]$ touch for3.sh

[root@hadoop101 shells]$ vim for3.sh

#!/bin/bash

echo '=============$*============='

for i in $*

do

       echo "ban zhang love $i"

done

echo '=============$@============='

for j in $@

do     

       echo "ban zhang love $j"

done

[root@hadoop101 shells]$ chmod 777 for3.sh

[root@hadoop101 shells]$ ./for3.sh cls mly wls

=============$*=============

banzhang love cls

banzhang love mly

banzhang love wls

=============$@=============

banzhang love cls

banzhang love mly

banzhang love wls

当它们被双引号“”包含时,$*会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;$@会将各个参数分开,以“$1” “$2”…“$n”的形式输出所有参数。

[root@hadoop101 shells]$ vim for4.sh

#!/bin/bash

echo '=============$*============='

for i in "$*"

#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次

do

        echo "ban zhang love $i"

done

echo '=============$@============='

for j in "$@"

#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次

do

        echo "ban zhang love $j"

done

[root@hadoop101 shells]$ chmod 777 for4.sh

[root@hadoop101 shells]$ ./for4.sh cls mly wls

=============$*=============

banzhang love cls mly wls

=============$@=============

banzhang love cls

banzhang love mly

banzhang love wls

6.4 while循环

1)基本语法

while [ 条件判断式 ]

do

    程序

done

2)案例实操

从1加到100

[root@hadoop101 shells]$ touch while.sh

[root@hadoop101 shells]$ vim while.sh

#!/bin/bash

sum=0

i=1

while [ $i -le 100 ]

do

        sum=$[$sum+$i]

        i=$[$i+1]

done

echo $sum

[root@hadoop101 shells]$ chmod 777 while.sh

[root@hadoop101 shells]$ ./while.sh

5050

第7章 read读取控制台输入

1)基本语法

read  (选项)  (参数)

①选项:

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒)如果-t不加表示一直等待

②参数

        变量:指定读取值的变量名

2)案例实操

提示7秒内,读取控制台输入的名称

[root@hadoop101 shells]$ touch read.sh

[root@hadoop101 shells]$ vim read.sh

#!/bin/bash

read -t 7 -p "Enter your name in 7 seconds :" NN

echo $NN

[root@hadoop101 shells]$ ./read.sh

Enter your name in 7 seconds : root

root

第8章 函数

8.1 系统函数

8.1.1 basename

1)基本语法

basename [string / pathname] [suffix]  (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

basename 可以理解为取路径里的文件名称

选项:

suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

2)案例实操

截取该/home/root/banzhang.txt路径的文件名称。

[root@hadoop101 shells]$ basename /home/root/banzhang.txt

banzhang.txt

[root@hadoop101 shells]$ basename /home/root/banzhang.txt .txt

banzhang

8.1.2 dirname

1)基本语法

  dirname 文件绝对路径  (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

dirname 可以理解为取文件路径的绝对路径名称

2)案例实操

获取banzhang.txt文件的路径。

[root@hadoop101 ~]$ dirname /home/root/banzhang.txt

/home/root

8.2 自定义函数

1)基本语法

[ function ] funname[()]

{

        Action;

        [return int;]

}

2)经验技巧

(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。

(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

3)案例实操

计算两个输入参数的和。

[root@hadoop101 shells]$ touch fun.sh

[root@hadoop101 shells]$ vim fun.sh

#!/bin/bash

function sum()

{

    s=0

    s=$[$1+$2]

    echo "$s"

}

read -p "Please input the number1: " n1;

read -p "Please input the number2: " n2;

sum $n1 $n2;

[root@hadoop101 shells]$ chmod 777 fun.sh

[root@hadoop101 shells]$ ./fun.sh

Please input the number1: 2

Please input the number2: 5

7

第9章 Shell工具(重点)

9.1 cut

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

1)基本用法

cut  [选项参数]  filename

说明:默认分隔符是制表符

2)选项参数说明

选项参数

功能

-f

列号,提取第几列

-d

分隔符,按照指定分隔符分割列,默认是制表符“\t”

3)案例实操

(1)数据准备

[root@hadoop101 shells]$ touch cut.txt

[root@hadoop101 shells]$ vim cut.txt

dong shen

guan zhen

wo  wo

lai  lai

le  le

(2)切割cut.txt第一列

[root@hadoop101 shells]$ cut -d " " -f 1 cut.txt

dong

guan

wo

lai

le

(3)切割cut.txt第二、三列

[root@hadoop101 shells]$ cut -d " " -f 2,3 cut.txt

  Le

(4)在cut.txt文件中切割出guan

[root@hadoop101 shells]$  cat cut.txt |grep guan | cut -d " " -f 1

guan

(5)选取系统PATH变量值,第2个“:”开始后的所有路径:

[root@hadoop101 shells]$ echo $PATH

/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/root/.local/bin:/home/root/bin

[root@hadoop101 shells]$ echo $PATH | cut -d ":" -f 3-

/usr/local/sbin:/usr/sbin:/home/root/.local/bin:/home/root/bin

(6)切割ifconfig 后打印的IP地址

[root@hadoop101 shells]$ ifconfig ens33 | grep netmask | cut -d "i" -f 2 | cut -d " " -f 2

192.168.6.101

9.2 awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

1)基本用法

awk  [选项参数] ‘/pattern1/{action1}  /pattern2/{action2}...’ filename

pattern:表示awk在数据中查找的内容,就是匹配模式

action:在找到匹配内容时所执行的一系列命令

2)选项参数说明

选项参数

功能

-F

指定输入文件折分隔符

-v

赋值一个用户定义变量

3)案例实操

(1)数据准备

[root@hadoop101 shells]$ sudo cp /etc/passwd ./

passwd数据的含义

用户名:密码(加密过后的):用户id:组id:注释:用户家目录:shell解析器

(2)搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。

[root@hadoop101 shells]$ awk -F : '/^root/{print $7}' passwd

/bin/bash

(3)搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割。

[root@hadoop101 shells]$ awk -F : '/^root/{print $1","$7}' passwd

root,/bin/bash

注意:只有匹配了pattern的行才会执行action。

(4)只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"dahaige,/bin/zuishuai"。

[root@hadoop101 shells]$ awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "dahaige,/bin/zuishuai"}' passwd

user, shell

root,/bin/bash

bin,/sbin/nologin

。。。

root,/bin/bash

dahaige,/bin/zuishuai

注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。

(5)将passwd文件中的用户id增加数值1并输出

[root@hadoop101 shells]$ awk -v i=1 -F : '{print $3+i}' passwd

1

2

3

4

4)awk的内置变量

变量

说明

FILENAME

文件名

NR

已读的记录数(行号)

NF

浏览记录的域的个数(切割后,列的个数)

5)案例实操

(1)统计passwd文件名,每行的行号,每行的列数

[root@hadoop101 shells]$ awk -F : '{print "filename:" FILENAME  ",linenum:" NR ",col:"NF}' passwd

filename:passwd,linenum:1,col:7

filename:passwd,linenum:2,col:7

filename:passwd,linenum:3,col:7

。。。

(2)查询ifconfig命令输出结果中的空行所在的行号

[root@hadoop101 shells]$ ifconfig | awk '/^$/{print NR}'

9

18

26

(3)切割IP

[root@hadoop101 shells]$ ifconfig ens33 | grep netmask | awk -F ' ' '{print $2}'

第10章 正则表达式入门

正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中,grep,sed,awk等命令都支持通过正则表达式进行模式匹配。

10.1 常规匹配

一串不包含特殊字符的正则表达式匹配它自己,例如:

[root@hadoop101 shells]$ cat /etc/passwd | grep root

就会匹配所有包含root的行。

10.2 常用特殊字符

1)特殊字符:^

^ 匹配一行的开头,例如:

[root@hadoop101 shells]$ cat /etc/passwd | grep ^a

会匹配出所有以a开头的行

2)特殊字符:$

$ 匹配一行的结束,例如

[root@hadoop101 shells]$ cat /etc/passwd | grep t$

会匹配出所有以t结尾的行

思考:^$ 匹配什么?

3)特殊字符:.

. 匹配一个任意的字符,例如

[root@hadoop101 shells]$ cat /etc/passwd | grep r..t

会匹配包含rabt,rbbt,rxdt,root等的所有行

4)特殊字符:*

* 不单独使用,他和上一个字符连用,表示匹配上一个字符0次或多次,例如

[root@hadoop101 shells]$ cat /etc/passwd | grep ro*t

会匹配rt, rot, root, rooot, roooot等所有行

思考:.* 匹配什么?

5)特殊字符:[ ]

[ ] 表示匹配某个范围内的一个字符,例如

[6,8]------匹配6或者8

[0-9]------匹配一个0-9的数字

[0-9]*------匹配任意长度的数字字符串

[a-z]------匹配一个a-z之间的字符

[a-z]* ------匹配任意长度的字母字符串

[a-c, e-f]-匹配a-c或者e-f之间的任意字符

[root@hadoop101 shells]$ cat /etc/passwd | grep r[a,b,c]*t

会匹配rt,rat, rbt, rabt, rbact,rabccbaaacbt等等所有行

6)特殊字符:\

\ 表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含 '$' 的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如

[root@hadoop101 shells]$ cat /etc/passwd | grep a\$b

就会匹配所有包含 a$b 的行。

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/22862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

广和通携手有人物联网完成5G SUL辅助上行功能验证

近日&#xff0c;广和通5G模组FM650-CN已在商用网络中实现5G SUL上行能力增强&#xff0c;助力有人物联网工业路由器在仿真网络环境中完成SUL辅助上行功能的验证。本次验证成功&#xff0c;意味着FM650-CN已具备SUL辅助上行商用能力&#xff0c;有利于推动更多5G终端支持SUL特性…

AI工具第三期:本周超16款国内精选AI工具分享!

1. 未来百科 未来百科&#xff0c;是一个知名的AI产品导航网站——为发现全球优质AI工具而生。目前已聚集全球2500优质AI工具产品&#xff0c;旨在帮助用户发现全球最好的AI工具&#xff0c;同时为研发AI垂直应用的创业公司提供展示窗口&#xff0c;迎接未来的AI时代。未来百科…

Netty编解码机制(一)

1.编码和解码基本介绍 1>.编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码; 2>.codec(编解码器)的组成部分有两个: decoder(解码器)和 encoder(编码器).encoder(编码器)负责把业务数据转换成字节码数据,而…

什么是数字化?企业为什么要数字化转型

一、什么是数字化&#xff1f; 什么是数字化&#xff1f;在我理解&#xff0c;数字化是一个基于时代科技发展所产生的概念&#xff0c;首先它是一个工具&#xff0c;在企业的经营发展中将信息技术融入到传统的企业模式中&#xff0c;起到了转型的作用。 其次数字化转型是企业…

从复杂到简单:通用CRM客户管理系统改变企业管理方式

一、概述 CRM客户管理系统是通过对客户生命周期的有效管理&#xff0c;是一种重要的客户管理工具&#xff0c;可以帮助企业更好的了解客户的需求&#xff0c;提升客户满意度&#xff0c;优化销售流程、提高销售业绩等&#xff0c;随着数字经济的不断发展和普及&#xff0c;CRM…

第03章 流程控制语句

流程控制语句是用来控制程序中各语句执行顺序的语句&#xff0c;可以把语句组合成能完成一定功能的小逻辑模块。 程序设计中规定的三种流程结构&#xff0c;即&#xff1a; 顺序结构 程序从上到下逐行地执行&#xff0c;中间没有任何判断和跳转。 分支结构 根据条件&#xff0…

mjpg-streamer实现细节分析

mjpg-streamer实现细节分析 文章目录 mjpg-streamer实现细节分析输入初始化input_initinit_videoIninit_v4l2 启动摄像头输入线程cam_threaduvcGrabcompress_yuyv_to_jpegmemcpy_picture 输出初始化output_init启动摄像头输出线程server_thread设置 SO_REUSEADDR 选项。设置 IP…

uvc驱动ioctl分析下

uvc驱动ioctl分析下 文章目录 uvc驱动ioctl分析下uvc_ioctl_enum_input枚举输入uvc_query_ctrl__uvc_query_ctrluvc_ioctl_g_input 获取输入uvc_ioctl_s_input 设置输入uvc_query_v4l2_ctrluvc_ioctl_queryctrl查询控制器uvc_ioctl_query_ext_ctrl查询扩展控制器 uvc_ioctl_g_c…

爬虫基本原理

爬虫基本原理 1.1获取网页1.1.1提取信息1.1.2保存数据 1.2请求1.2.1 请求方法1.2.2 请求网址1.2.3 请求头1.2.4请求体1.3响应 1.1获取网页 爬虫首先要做的工作就是获取网页&#xff0c;这里就是获取网页的源代码。源代码里包含了网页的部分有用信息&#xff0c;所以只要把源代…

【航空和卫星图像中检测建筑物】使用gabor特征和概率的城市区域和建筑物检测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

如何把数据从 TDengine 2.x 迁移到 3.x ?

一.迁移背景&#xff1a; 随着时序数据库&#xff08;Time Series Database&#xff09; TDengine 3.0 的发布至今&#xff0c;我们除了在持续地优化产品质量的本身&#xff0c;也一直在努力地提升用户体验。但由于 3.0 底层有大量的重构优化&#xff0c;导致开源版的 2.0 用户…

免费部署你的私人 ChatGPT 网页应用

免费部署你的私人 ChatGPT 网页应用 1、注册Github账号&#xff0c;拷贝仓库 第一步、打开GitHub官网&#xff0c;点击右上角Sign up注册即可 第二步、打开开源项目【Chatgpt-next-web】,点击fork&#xff0c;点击Create fork完成操作 2、选择免费的容器【vercel】或者【r…

2023新版Spring6全新讲解-核心内容之IoC

Spring核心之IoC 一、IoC概念介绍 1.IoC 介绍 IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。…

USB摄像头描述符参数获取和来源分析

USB摄像头描述符参数获取和来源分析 文章目录 USB摄像头描述符参数获取和来源分析描述符USB设备描述符描述符 USB摄像头参数获取myuvc.c结果device descriptor设备描述符configuration descriptor配置描述符interface association接口关联inteface desciptor atsettingvideocon…

Linux :: 【基础指令篇 :: 用户管理:(2)】::设置用户密码(及本地Xshell 登录云服务器操作演示) :: passwd

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 目录索引&#xff1a; 1. 基本语法 2. 基本用法 3. 注意点 4. 补充&#xff1a;指定用户设置密码操作实例测试及登录本地 Xshell 登录演…

前端微服务无界实践 | 京东云技术团队

一、前言 随着项目的发展&#xff0c;前端SPA应用的规模不断加大、业务代码耦合、编译慢&#xff0c;导致日常的维护难度日益增加。同时前端技术的发展迅猛&#xff0c;导致功能扩展吃力&#xff0c;重构成本高&#xff0c;稳定性低。因此前端微服务应运而生。 前端微服务优势…

什么是智慧校园?

什么是智慧校园&#xff1f; 智慧校园平台是目前教育信息化领域的热点之一。 随着数字化转型的加速&#xff0c;越来越多的学校开始寻求解决方案&#xff0c;以提高教育管理的效率和质量。 在使用智慧校园平台的过程中&#xff0c;一些痛点问题也浮现出来。为解决这些问题&a…

10 工具Bootchart的使用(windows)

Bootchart的使用方法&#xff08;windows&#xff09; 下载bootchart.jar并拷贝到windows, 然后保证windows也安装了open jdk 1.8; 下载地址&#xff1a;https://download.csdn.net/download/Johnny2004/87807973 打开设备开机启动bootchart的开关: adb shell touch /data/boo…

DID-M3D 论文学习

1. 解决了什么问题&#xff1f; 单目 3D 检测成本低、配置简单&#xff0c;对一张 RGB 图像预测 3D 空间的 3D 边框。最难的任务就是预测实例深度&#xff0c;因为相机投影后会丢失深度信息。以前的方法大多直接预测深度&#xff0c;本文则指出 RGB 图像上的实例深度不是一目了…

【学习日记2023.5.22】 之 套餐模块完善

4. 功能模块完善之套餐模块 4.1 新增套餐 4.1.1 需求分析与设计 产品原型 后台系统中可以管理套餐信息&#xff0c;通过 新增功能来添加一个新的套餐&#xff0c;在添加套餐时需要添加套餐对应菜品的信息&#xff0c;并且需要上传套餐图片。 新增套餐原型&#xff1a; 当填…