Shell中有三种变量 用户变量,系统变量和特殊变量
用户变量,系统变量已经说过了,这里我们说下特殊变量
shell的特殊变量都以$符开头,后面加上对应的字符,表示不同的功能
$n
$#
实例:
#!/bin/bash
echo " 脚本名称:$0 第一个参数为:$1 "
echo "参数个数: $#"
$*
$@
共同点:
$* 和$@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”$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
$?
实例:
首先执行脚本parameter,然后echo输出脚本是否正常执行
实例:
#!/bin/bash
echo "$$"
转义字符:
换行符: ""进行参数换行/续行
反斜杠\ 后面紧跟回车,表示下一行是当前行的续行.
#!/bin/bash
echo "hello\
world"
其他的转义字符:
转义符 | 功能 |
---|---|
\n | 换行 |
\t | 水平制表 |
\r | 回车 |
\a | 警告 |
\b | 回格 |
在的 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 特殊替换字符就可。涉及的只有,*,? [] ,{} 这几种。
有的时候,我们匹配的内容或者想要显示的内容里面会存在 *,?,[ ]等通配符中的符号。为了表示他们原来的意思,我们需要使用转义字符 \,如 a*c 表示匹配 a*c 这三个字符
\ 本身用 \ 表示。
举一个简单的例子 比方说你想寻找一个命名为 file*的文件 你想要:
find -name file*
结果发现是错误的
需要加上双引号,才能够正确识别
find -name “file*”
结果发现输出的是file1 和 file2 没有file* 因为这里的*被当成了通配符,自动去匹配了任意字符
那怎么解决呢? 有两种方式 一种是用\ 转义一下 显示的就是file*了
这里再说一下用户变量命名时 ` `(反斜号)‘’(单引号)""(双引号) 的区别
在shell中,字符可以被 ` `(反斜号)‘’(单引号)""(双引号) 包含
又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉 包含的变量名称,不会被解析,任何字符都会原样输出
echo 'hello \n world'
str=hello
echo '¥str'
又叫软转义,可以存在通配符,也可存在变量
str=hello
echo -e "$str \n world"
输出:
hello
world
echo 输出的时候加上-e 表示识别转义字符,默认不识别
$变量 表示是变量
包含的内容,做为 shell 命令被执行,执行结果替换原内容
echo -e "\a现在时间 \n `date`"
以 # 开头是单行注释注释
#--------------------------------------------
# 这是一个注释
多行注释:
:<...
注释内容...
注释内容...
EOF