【Shell教程】二----Shell变量,通配符,转义符

Shell变量

Shell中有三种变量 用户变量,系统变量和特殊变量
用户变量,系统变量已经说过了,这里我们说下特殊变量

shell的特殊变量都以$符开头,后面加上对应的字符,表示不同的功能

$n

  • 功能描述:n为数字,$0代表该脚本名称,$1、$2、$3、$4、$5 表示运行脚本时,传给程序的参数,用空格分开,十以上的参数需要用大括号包含,如${10}

$#

  • 功能描述: 传给 shell 脚本参数的数量

实例:

#!/bin/bash

echo " 脚本名称:$0  第一个参数为:$1 "
echo "参数个数: $#"

然后运行脚本:
在这里插入图片描述

$*

  • 功能描述: :传给 shell 脚本参数的内容 ,

$@

  • 功能描述: :传给 shell 脚本参数的内容 ,

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

区别:
加上双引号"“括住时,$*把所有的参数看成一个整体,以”$1 $2 … $n"的形式输出所有参数 $@把每个参数单独存储,以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数。

实例:

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

在这里插入图片描述
正常输出时都是输出全部参数

加双引号之后:

#!/bin/bash

for i in "$*"
do
	echo $i
done

for i in "$@"
do
	echo $i
done

【Shell教程】二----Shell变量,通配符,转义符_第1张图片

$?

  • 功能描述: Shell命令执行的返回的状态。0 表示正确,非 0 表示出错

实例:
【Shell教程】二----Shell变量,通配符,转义符_第2张图片
首先执行脚本parameter,然后echo输出脚本是否正常执行

如果没有正常执行,会输出非0
在这里插入图片描述
$$

  • 功能描述: 输出当前执行的进程号

实例:

#!/bin/bash

echo "$$"

在这里插入图片描述

转义字符:

换行符: ""进行参数换行/续行
反斜杠\ 后面紧跟回车,表示下一行是当前行的续行.

#!/bin/bash

echo "hello\
world"

输出:
在这里插入图片描述

其他的转义字符:

转义符 功能
\n 换行
\t 水平制表
\r 回车
\a 警告
\b 回格

Shell通配符

在的 Linux 使用中,有很多时候您可能需要一次对多个相似文件系统对象执行单一操作(比如 rm)。比方说删除所有的.c文件
在这些情况下,你需要在命令行中输入许多文件:

 rm file1 file2 file3 file4 file5 file6 file7 file8

这个时候你可以使用通配符,来解决这个问题,通配符,就是使用特定的匹配字符,去完成特定功能的匹配,当shell在“参数”中遇到了通配符时,将通过在磁盘上查找并找到任何与之匹配的文件。

具体的通配符如下:

通配符 含义 实例
* 匹配 0 或多个字符 a*b,a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如 aabcb, axyzb, a012b, ab
? 匹配任意单个字符 a?b,a与b之间有且只有一个字符, 可以是任意字符, 如 aab, abb, acb, a0b
[ ] 匹配[ ] 中的任意单个字符 a[xyz]b,a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如 axb, ayb, azb
[!list] 匹配除 list 中的任意单一字符 a[!0-9]b,a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如 axb, aab, a-b
[c1-c2] 匹配 c1-c2 中的任意单一字符 a[!0-9]b,a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如 axb, aab, a-b

比方说你要查看所有的.c文件 可以使用

ls  *.c

在这里插入图片描述

简单地说,把通配符理解为shell 特殊替换字符就可。涉及的只有,*,? [] ,{} 这几种。

Shell转义字符

有的时候,我们匹配的内容或者想要显示的内容里面会存在 *,?,[ ]等通配符中的符号。为了表示他们原来的意思,我们需要使用转义字符 \,如 a*c 表示匹配 a*c 这三个字符

\ 本身用 \ 表示。

举一个简单的例子 比方说你想寻找一个命名为 file*的文件 你想要:

find -name file*

新建file1 file2 file* 然后查找file*
【Shell教程】二----Shell变量,通配符,转义符_第3张图片

结果发现是错误的

需要加上双引号,才能够正确识别

find -name “file*

在这里插入图片描述
结果发现输出的是file1 和 file2 没有file* 因为这里的*被当成了通配符,自动去匹配了任意字符

那怎么解决呢? 有两种方式 一种是用\ 转义一下 显示的就是file*了
在这里插入图片描述

这里再说一下用户变量命名时 ` `(反斜号)‘’(单引号)""(双引号) 的区别

在shell中,字符可以被 ` `(反斜号)‘’(单引号)""(双引号) 包含

  • “”:双引号,包含的变量名称,会被解析。
  • ‘’:单引号,包含的变量名称,不会被解析。
  • ``:反引号,包含的内容,做为 shell 命令被执行,执行结果替换原内容。

‘’单引号

又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉 包含的变量名称,不会被解析,任何字符都会原样输出

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
echo 'hello \n world'

输出hello \n world \n不会被转义
在这里插入图片描述

str=hello
echo '¥str'

输出$str
在这里插入图片描述

“”:双引号

又叫软转义,可以存在通配符,也可存在变量

str=hello
echo -e "$str \n world"

输出:
hello
world
在这里插入图片描述
echo 输出的时候加上-e 表示识别转义字符,默认不识别
$变量 表示是变量

``反引号

包含的内容,做为 shell 命令被执行,执行结果替换原内容

echo -e "\a现在时间 \n `date`"

输出:
在这里插入图片描述

Shell注释

以 # 开头是单行注释注释

#--------------------------------------------
# 这是一个注释

多行注释:

:<...
注释内容...
注释内容...
EOF

【Shell教程】二----Shell变量,通配符,转义符_第4张图片

请添加图片描述

你可能感兴趣的:(Shell,linux,运维,服务器,shell)