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

Posted Z小旋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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命令执行的返回的状态。0 表示正确,非 0 表示出错

实例:

首先执行脚本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*

结果发现是错误的

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

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
注释内容...
注释内容...
注释内容...
EOF

以上是关于Shell教程二----Shell变量,通配符,转义符的主要内容,如果未能解决你的问题,请参考以下文章

shell特性通配符输入输出重定向,命令历史

shell脚本基础——Shell运行原理+变量数组定义

Shell ❀ 基础变量类别与引用

Shell ❀ 基础变量类别与引用

Shell ❀ 基础变量类别与引用

Shell编程——shell的基础知识及常用命令