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变量,通配符,转义符的主要内容,如果未能解决你的问题,请参考以下文章