linux12shell编程 -- >元字符

Posted FikL-09-19

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux12shell编程 -- >元字符相关的知识,希望对你有一定的参考价值。

文章目录

元字符

元字符指的是能够被shell解释的特殊字符,每个特殊字符都有其特殊含义,这些字符一方面可用于变量值的运算、我们可以称之为运算符,另外一方面可以和shell命令配合使用来达到更高级的效果

一、算数运算符

1、运算符

+	# 加
-	# 减
*	# 乘
/	# 除
%	# 余
12345

2、算数运算符需要配合下述操作使用一 算数运算符

# 浮点运算
bc  

# 整数运算
expr
$(())
$[]
let

3、举例

1、bc计算器
bc计算器是比较常用的linux计算工具了,而且支持浮点运算

[root@openvpn ~]# res=`echo 1+1 | bc`
[root@openvpn ~]# echo $res
2

[root@openvpn ~]# res=`echo 10 % 3 | bc`
[root@openvpn ~]# echo $res
1

[root@openvpn ~]# res=`echo 1.2+1.3|bc`
[root@openvpn ~]# echo $res
2.5

[root@openvpn ~]# res=`echo 5.0+3.0|bc`
[root@openvpn ~]# echo $res
8.0

[root@openvpn ~]# res=`echo "scale=2;5.0/3.0"|bc`
[root@openvpn ~]# echo $res
1.66

[root@openvpn ~]# res=`echo "scale=2;5.0/6.0"|bc`
[root@openvpn ~]# echo $res
.83
# 内存运算取值
[root@web ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1837         262        1392          22         182        1399
Swap:             0           0           0
[root@web ~]# alived=`free -m |awk 'NR==2{print $7}'`
[root@web ~]# total=`free -m |awk 'NR==2{print $2}'`
[root@web ~]# echo $total 
1837
[root@web ~]# echo $alived 
1397
[root@web ~]# echo "scale=2;$alived / $total" | bc |cut -d . -f2
76
[root@web ~]# res= `echo "scale=2;$alived / $total" | bc |cut -d . -f2`
-: 76: command not found
[root@web ~]# res = `echo "scale=2;$alived / $total" | bc |cut -d . -f2`
-: res: command not found
[root@web ~]# res=`echo "scale=2;$alived / $total" | bc |cut -d . -f2`
[root@web ~]# echo ${res}%
76%

[root@web ~]# expr 1* 2
expr: syntax error
[root@web ~]# expr 1 \\* 2
2
# 必须加个\\转移一下
2、expr不支持浮点数计算。而且要注意数字与运算符中的空格
[root@openvpn ~]# res=`expr 5 / 3`  # 不支持浮点计算
[root@openvpn ~]# echo $res
1

[root@openvpn ~]# res=`expr 1+1`  # 注意:要有空格
[root@openvpn ~]# echo $res
1+1
[root@openvpn ~]# res=`expr 1 + 1`
[root@openvpn ~]# echo $res
2

如果是乘法,如需要转义\\*
[root@egon ~]# expr 3 \\* 10
30
[root@egon ~]# 
3、$(()) 同expr,不支持浮点数运算
# 例如:
[root@openvpn ~]# echo $((1+1))
2
[root@openvpn ~]# echo $((1.0+2.0))  # 不支持浮点运算符
-: 1.0+2.0: 语法错误: 无效的算术运算符 (错误符号是 ".0+2.0")
           
# 注意:
echo $(($num1+$num2))  # 也可以简写为 echo $((num1+num2)) 
echo $(((5-3)*2))  # 可以嵌套括号    
4、$[]同expr以及$(()),不支持浮点运算​
[root@egon ~]# echo $[$num1+$num2]  # 等同于 echo $[num1+num2]
333
[root@egon ~]# echo $[1.3+3.1] 
-: 1.3+3.1: 语法错误: 无效的算术运算符 (错误符号是 ".3+3.1")
5、let 不支持浮点数运算,而且不支持直接输出,只能赋值
[root@openvpn ~]# let res=1+1
[root@openvpn ~]# echo $res
2
[root@openvpn ~]# 
[root@openvpn ~]# let res=50/5
[root@openvpn ~]# echo $res
10
[root@openvpn ~]# let c=1.3*3
-: let: c=1.3*3: 语法错误: 无效的算术运算符 (错误符号是 ".3*3"
6、强调:整数与非整数之间运算会报错
[root@egon ~]# expr 1 + a
expr: 非整数参数
[root@egon ~]# expr 1 + 1.3
expr: 非整数参数

7、练习题
#1、脚本案例: 编写小脚本, 可以实现2位数加减乘除运算
[root@egon shell]# cat a.sh 
#!/bin/

a=$1
b=$2

[ $# -ne 2 ] && {
    echo "请输入两位数字信息"
    exit
}

echo "a-b=$((a-b))"
echo "a+b=$((a+b))"
echo "a*b=$((a*b))"
echo "a/b=$((a/b))"
 
# 2、脚本案例: 编写判断输入参数是否是整数信息脚本
#!/bin/

a=$1
expr $a + 0 &>/dev/null  # 只有整型加0才不会报错,浮点数及字符与0详解都会报错
[ $? -eq 0 ] && echo "输入的是整数信息" || echo "输入的是非整数信息"

# 3、如何利用脚本计算1+2+3+4..10总和数值
方法一:
seq -s "+" 10|bc
 
方法二:
echo {1..10}|tr " " "+"|bc
 
方法三:
awk 'BEGIN{for (i=1; i<=10; i++) a=a+i; print a}'

二、 测试运算符

测试命令:test,详细可用man test查询

测试符号:[],注意只有一层中括号,中括号内左右两侧必须要有空格

test与[]效果都一样,参数也都一样

1、 测试文件状态

-d 目录
[root@egon ~]# test -d /opt/ ; echo $?
0

[root@egon ~]# [ -d /opt/ ];echo $?  # 注意[]内左右两侧要有空格
0

ps:下面关于[]用法都与test一样,不再举例

-s 文件长度 > 0、非空
[root@egon ~]# touch a.txt
[root@egon ~]# test -s a.txt ;echo $?  # 文件为空则返回假
1

[root@egon ~]# test -s /etc/passwd ;echo $?  # 文件不为空则返回假
0

-f 标准文件
[root@egon ~]# test -f /etc/passwd;echo $?
0

-w 可写
[egon@egon ~]$ touch a.txt
[egon@egon ~]$ chmod a-w a.txt
[egon@egon ~]$ [ -w a.txt ];echo $?  # 返回假,注意,如果是root用户,无论如何都有写权限
1

-r 可读
[egon@egon ~]$ ll a.txt 
-r--r--r--. 1 egon egon 292 8月  17 21:48 a.txt
[egon@egon ~]$ test -r a.txt;echo $?
0

-x 可执行
[egon@egon ~]$ ll a.txt 
-r--r--r--. 1 egon egon 292 8月  17 21:48 a.txt
[egon@egon ~]$ test -x a.txt;echo $?
1

-L 符号连接
[root@egon ~]# ll -d /lib64
lrwxrwxrwx. 1 root root 9 7月  14 03:33 /lib64 -> usr/lib64
[root@egon ~]# test -L /lib64;echo $?
0

-u 文件有 suid 位设置
[root@egon ~]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 6月  10 2014 /usr/bin/passwd
[root@egon ~]# [ -u `which passwd` ];echo $?
0
[root@egon ~]# [ -u `which ls` ];echo $?
1

2、字符串测试

== 两个字符串相等
[root@egon ~]# [ "aaa" == "aaa" ];echo $?
0

!= 两个字符串不相等
[root@egon ~]# [ "aaa" != "aaa" ];echo $?
1

-z 字符串长度为零
[root@egon ~]# ip=""
[root@egon ~]# [ -z "$ip" ];echo $?  # 注意引号
0
[root@egon ~]# ip='1.1.1.1'
[root@egon ~]# [ -z "$ip" ];echo $?
1  # 加引号

-n 字符串长度不为零
[root@egon ~]# [ -n "$ip" ];echo $?  # 注意加引号
1

3、 测试数值

​ test与[]也可以测试数值,与 [[]]和(())效果一样,下一小节会详细介绍[[]]和(())

测试运算符:
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
-a  并且
-o  或者

# PS:test与[]也可以测试数值,与 [[]]和(())效果一样,下一小节会详细介绍[[]]和(())

[root@egon ~]# [ 10 -eq 10 ];echo $?
0
[root@egon ~]#  [ 10 -eq 10 -a 10 > 3 ];echo $?
0

# 1、示例:
[root@egon ~]# disk_use=$(df -P |grep '/$' |awk '{print $5}' |awk -F% '{print $1}')
[root@egon ~]# [ $disk_use -gt 10 ] && echo "warn......"
warn......

[root@egon ~]# [ $(id -u) -eq 0 ] && echo "当前是超级用户" || echo "you不是超级用户"
当前是超级用户

三、关系运算符

1、关系运算符介绍

关系运算符:
<	小于
\\>	大于,需转义
<=	小于等于
\\>= 大于等于,需转义
==	等于
!=	不等于
&&	并且
||	或者

2、举例测试

上述关系运算符需要配合(())使用(注意(())属于C语言风格的比较),最终都是用来当if判断或者while循环的条件

[root@egon ~]# x=100
[root@egon ~]# (($x>10))
[root@egon ~]# echo $?
0

[root@egon ~]# (($x < 10));echo $?
1

[root@egon ~]# (($x == 100));echo $?
0

[root@egon ~]# (($x != 100));echo $?
1

[root@egon ~]# (($x != 100)) && (("egon" == "egon"))
[root@egon ~]# echo $?
1

[root@egon ~]# (($x != 100)) || (("egon" == "egon"))
[root@egon ~]# echo $?
0

[root@egon ~]# (($x != 100 && "egon" == "egon"));echo $?
1

[root@egon ~]# (($x != 100 || "egon" == "egon"));echo $?
0
# c语言显示

四、赋值运算符

=
[root@egon ~]# x=10
[root@egon ~]# echo $x
10

+=
[root@egon ~]# x=10
[root@egon ~]# ((x%3))
[root@egon ~]# echo $x
10
[root@egon ~]# ((x%=3))
[root@egon ~]# echo $x
1

[root@web ~]# age=17
[root@web ~]# ((age+=10))
[root@web ~]# echo $age
27

*=
同上

/=
同上

%=
同上

五、补充

1、补充:单双中括号

[[]]与[]基本一样,不同的是[[]]支持正则匹配,不过要注意的是:必须在内层的中括号内,左右两侧要加空格

1.中括号内层两侧要加空格
[root@egon ~]# [[ "$USER" ==  "root" ]];echo $?  # 注意内层[]中包含的内容必须左右两侧加空格
0
[root@egon ~]# [[ "$USER" ==  "root" ]];echo $?  # 一个等号也行两个等号也可以额
0

2.正则表达式的匹配值不要加引号
[root@egon ~]# [[ "$USER" =~ "^root$" ]];echo $?  # 错误示范
1
[root@egon ~]# [[ "$USER" =~ ^root$ ]];echo $?  # 正确示范
0

3.判断当前是否是管理员登录
[root@egon ~]# [[ ! "$USER" =~ t$ ]] && echo 此时不是管理员登录 || echo 是管理员登录

4.判断是否是数字
[root@egon ~]# num1=123
[root@egon ~]# [[ "$num1" =~ ^[0-9]+$ ]];echo $?  # 判断是否是数字
0
[root@egon ~]# [[ "$num1" =~ ^[0-9]+$ ]] && echo "是数字"
是数字

[root@egon ~]# num2=abc123de
[root@egon ~]# [[ "$num2" =~ ^[0-9]+$ ]];echo $?
1
[root@egon ~]# [[ "$num2" =~ ^[0-9]+$ ]] || echo "num2不是数字"
num2不是数字

2、企业面试题

1、传入两个数值信息, 自动让脚本显示数值比较情况
[root@egon shell]# cat num.sh 
#!/bin/

[ $# -ne 2 ] && echo "只能传入两个整数" && exit
[[ ! $1 =~ ^[0-9]+$ ]] && echo "参数1必须是整数" && exit
[[ ! $2 =~ ^[0-9]+$ ]] && echo "参数2必须是整数" && exit

[[ $1 -lt $2 ]] && echo "$1 < $2"
[[ $1 -gt $2 ]] && echo "$1 > $2"
[[ $1 -eq $2 ]] && echo "$1 = $2"
[root@egon shell]# chmod +x num.sh 
[root@egon shell]# ./num.sh 17 37
17 < 37

2、 补充浮点数的比较
# 需要注意的是:bc的结果为1代表真,为0代表假
[root@egon ~]# echo "10.3 >= 10.1" | bc
1
[root@egon ~]# echo "10.3 != 10.1" | bc
1
[root@egon ~]# echo "10.3 != 10.3" | bc
0

# 应用
[root@egon ~]# x=10.3
[root@egon ~]# y=10.1
[root@egon ~]# [ `echo "$x >= $y" | bc` -eq 1 ] && echo "$x 大于 $y"
10.3 大于 10.1

3、案例补充
[root@openvpn shell]# cat shell01.sh 
# !/bin/
[ $# -ne 1 ] && echo "只能传入一个参数" && exit

[[ ! $1 =~ ^[0-9]+$ ]] && echo "只能传入数字" && exit

echo "ok -->$1"
[root@openvpn shell]# cat shell02.sh 
# !/bin/
[ $# -ne 2 ] && echo "Usage: $0 arg1 arg2" && exit

[[ ! $1 =~ ^[0-9]+$ ]] && echo "第一个参数必须是整型数字" && exit

[[ ! $2 =~ ^[0-9]+$ ]] && echo "第二个参数必须是整型数字" && exit

[ $1 -gt $2 ] && echo "第一个数大"

[ $1 -lt $2 ] && echo "第二个数大"

[ $1 -eq $2 ] && echo "第三个数大"

六、总结

1、条件测试

格式1: test 条件表达式
格式2: [ 条件表达式 ]
格式3: (()) 数值比较,运算  C语言

格式4: [[ 条件表达式 ]],支持正则  =~

2、结合$符号

$[]	   # 整数运算
$(())  # 整数运算

$()    # 命令替换
1234

3、其他

()     # 子shell中执行

七、 其他元字符

1、`` 与$():取命令的结果

[root@openvpn ~]# echo `pwd`
/root
[root@openvpn ~]# echo $(pwd)
/root

不一样的地方在于$()可以嵌套,而``不能嵌套
[root@openvpn ~]# echo $(ls $(pwd))

# 练习
[root@aliyun test]# touch $(date +%F)_bak.tar.gz
[root@aliyun test]# ls
2020-08-24_bak.tar.gz

2、~家目录
3、.与…
4、!调用历史命令、取反
# 1、调用历史命令
[root@egon ~]# !1066
[root@egon ~]# !ls  # 匹配最近的一次历史命令

# 2、取反1:对命令的结果取反
[root@egon ~]# ! pwd
/root
[root@egon ~]# echo $?
1

# 3、取反2:效果与^雷同
[root@openvpn ~]# touch /test/{1.txt,2.txt,a.txt,aaa_bbb.txt}
[root@openvpn ~]# find /test ! -name 1.txt
/test
/test/2.txt
/test/a.txt
/test/aaa_bbb.txt

[root@openvpn ~]# ls /test/[!0-9].txt  # .txt前只有一个字符,但是非数字
/test/a.txt
[root@openvpn ~]# ls /test/[^0-9].txt  # .txt前只有一个字符,但是非数字
/test/a.txt

[root@aliyun test]# ls -a /etc/skel/.[!.]*

5、@无特殊意义
6、#注释
7、$取变量值
[root@openvpn ~]# x=1
[root@openvpn ~]# echo $x
1

8、%、-、+运算符
注意%可以与jobs配合“kill %工作号”杀后台进程。-减号还有区间及cd -回到上一级的意思
# 数学运算
# 1、bc是比较常用的linux计算工具了,而且支持浮点运算:
[root@openvpn ~]# res=`echo 1+1 | bc`
[root@openvpn ~]# echo $res
2

[root@openvpn ~]# res=`echo 10 % 3 | bc`
[root@openvpn ~]# echo $res
1

[root@openvpn ~]# res=`echo 1.2+1.3|bc`
[root@openvpn ~]# echo $res
2.5

[root@openvpn ~]# res=`echo 5.0+3.0|bc`
[root@openvpn ~]# echo $res
8.0

[root@openvpn ~]# res=`echo "scale=2;5.0/3.0"|bc`
[root@openvpn ~]# echo $res
1.66

[root@openvpn ~]# res=`echo "scale=2;5.0/6.0"|bc`
[root@openvpn ~]# echo $res
.83

# 2、expr不支持浮点数计算。而且要注意数字与运算符中的空格
[root@openvpn ~]# res=`expr 5 / 3`  # 不支持浮点计算
[root@openvpn ~]# echo $res
1

[root@openvpn ~]# res=`expr 1+1`  # 注意:要有空格
[root@openvpn ~]# echo $res
1+1
[root@openvpn ~]# res=`expr 1 + 1`
[root@openvpn ~]# echo $res
2

[root@openvpn ~]# res=`expr 5 \\* 3`  # 在expr中*号要转义才能用,否则报语法错误
[root@egon ~]# echo $res
15

# 3、$(()) 同expr,不支持浮点数运算
[root@openvpn ~]# echo $((1+1))
2
[root@openvpn ~]# echo $((1.0+2.0))
-: 1.0+2.0: 语法错误: 无效的算术运算符 (错误符号是 ".0+2.0")
            
# 4、$[]同expr以及$(()),不支持浮点运算
[root@openvpn ~]# x=1
[root@openvpn ~]# echo $[$x+1]
2

# 5、let 不支持浮点数运算,而且不支持直接输出,只能赋值
[root@openvpn ~]# let res=1+1
[root@openvpn ~]# echo $res
2
[root@openvpn ~]# 
[root@openvpn ~]# let res=50/5
[root@openvpn ~]# echo $res
10
[root@openvpn ~]# let c=1.3*3
-: let: c=1.3*3: 语法错误: 无效的算术运算符 (错误符号是 ".3*3"
                
[root@aliyun test]# x=1
[root@aliyun test]# let x+=10
[root@aliyun test]# echo $x
11

9、^同!一样
10、&后台运行
[root@openvpn home]# echo "hello";sleep 3;echo "world" &

11、*任意多个字符
[root@openvpn ~]# touch 1.txt 2.txt aa.txt aaa.txt
[root@openvpn ~]# rm -rf *.txt
[root@openvpn ~]# touch 1.txt 2.txt aa.txt aaa.txt a1c.txt
[root@openvpn ~]# ls *.txt
1.txt  2.txt  a1c.txt  aaa.txt  aa.txt

12、()在子shell中执行
[root@openvpn ~]# (x=1)
[root@openvpn ~]# echo $x

应用
[root@openvpn ~]# (umask 066;touch a.txt)  # umask的设置只在子shell中有效
[root@openvpn ~]# ll a.txt 
-rw-------. 1 root root 0 8月  13 15:22 a.txt
[root@openvpn ~]# touch b.txt
[root@openvpn ~]# ll b.txt 
-rw-r--r--. 1 root root 0 8月  13 15:23 b.txt

13、_下划线:无特殊意义,可以用于名字的声明
[root@openvpn ~]# tar -czvf  `date +%F_%H:%M:%S`_bak.tar.gz /etc/

14、=赋值,==判断相等性
[root@openvpn ~]# [ 1 == 1 ]  # 条件1 == 1的左右两边必须有空格
[root@openvpn ~]# echo $?    # 判断上一条命令的结果是否为真,0=》true
0

15、|管道:把一个进程的处理结果传递给另外一个进程
[root@openvpn ~]# ps aux | grep 


|管道命令的作用,是将左侧命令的标准输出转换为标准输入,提供给右侧命令作为参数。但是,大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数。比如echo命令就不接受管道传参。
$ echo "hello world" | echo
xargs命令的作用,是将标准输入转为命令行参数,例如
$ echo "hello world" | xargs echo
hello world

[root@openvpn ~]# find /home/ -type d -name "test*" |xargs ls
1.txt  2.txt  3.txt
[root@openvpn ~]# ls /home/test
1.txt  2.txt  3.txt

16、\\转义特殊字符
[root@openvpn ~]# mkdir a\\ b.txt  # 虽然可以,但不推荐
[root@openvpn ~]# ll
总用量 0
drwxr-xr-x. 2 root root 6 8月  13 15:35 a b.txt
    

[root@openvpn ~]# echo $RMB  # 默认会当成变量

[root@openvpn ~]# echo '$RMB'  # 取消特殊意义
$RMB
[root@openvpn ~]# echo \\$RMB  # 取消特殊意义
$RMB

17、[]条件测试,后续会详细介绍
[root@openvpn ~]# name="egon"
[root@openvpn ~]# [ $name == "egon" ];echo $?
0
[root@openvpn ~]# name="adf"
[root@openvpn ~]# [ $name == "egon" ];echo $?
1

[root@openvpn ~]# [ -d /test ];echo $?
0
[root@openvpn ~]#

18、引号
''  强引用(在单引号中都视为普通字符)
" " 弱引用 (在双引号中保留变量)

[root@openvpn ~]# x=111
[root@openvpn ~]# echo "$x"
111
[root@openvpn ~]# echo '$x'
$x
[roo

19、;与&&与||连接多条命令
[root@openvpn home]# gagaga;ls  # 不论前一条命令运行成功与否,都会执行后续命令
: gagaga: 未找到命令...
egon
[root@openvpn home]# gagaga && ls  # 只有前一条命令执行成功,才会执行后续命令
: gagaga: 未找到命令...
        
[root@openvpn home]# ls /test || mkdir /test  # 前一条命令执行不成功才会执行后续命令
0.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt

20、:空命令,真值
[root@egon ~]# :
[root@egon ~]# echo $?
0

21、/路径分隔符
22、{}循环列表
[root@openvpn home]# touch /test/{0..9}.txt
[root@openvpn home]# ls /test/
0.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt

[root@openvpn ~]# touch {1..3}{a..d}.txt
[root@openvpn ~]# ls
1a.txt 1b.txt 1c.txt 1d.txt 2a.txt 2b.txt 2c.txt 2d.txt 3a.txt 3b.txt 3c.txt 3d.txt

[root@egon ~]# x=100
[root@egon ~]# echo ${x}%  # 控制变量名的范围
100%
[root@egon ~]# 
[root@egon ~]# echo $xrmb

[root@egon ~]# echo ${x}rmb
100rmb

23、重定向
> >> 输出重定向
< << 输入重定向

> 覆盖  >> 追加
[root@openvpn home]# cat >> a.txt << EOF
> 111
> 222
> 333
> EOF

0标准输入、1标准正确输出、2标准错误输出,&标准正确和错误输出
[root@openvpn home]# pwd 1>a.txt
[root@openvpn home]# cat a.txt 
/home
[root@openvpn home]# gagag 2>a.txt
[root@openvpn home]# cat a.txt 
: gagag: 未找到命令...
[root@openvpn home]# gagaga &>/dev/null

< << 输入重定向
[root@openvpn ~]# mysql -uroot -p123 < bbs.sql
[root@openvpn home]# grep root < /etc/passwd
root:x:0:0:root:/root:/bin/
operator:x:11:0:operator:/root:/sbin/nologin

                        
[root@openvpn home]# dd if=/dev/zero of=/a.txt bs=1M count=10
记录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB)已复制,0.024387 秒,430 MB/秒
[root@openvpn home]# dd </dev/zero >/b.txt bs=1M count=10
记录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB)已复制,0.0202365 秒,518 MB/秒

[root@openvpn home]# ll /a.txt 
-rw-r--r--. 1 root root 10485760 8月  13 16:02 /a.txt
[root@openvpn home]# ll /b.txt 
-rw-r--r--. 1 root root 10485760 8月  13 16:03 /b.txt

24、?任意一个字符
[root@openvpn ~]# ls ??.txt
aa.txt
[root@openvpn ~]# ls a?c.txt
a1c.txt
[root@openvpn ~]# rm -rf *.txt

25、范围中的任意一个字符 [12] [ac] [a-z] [0-9]
[root@openvpn ~]# touch a1c a2c axc aXc axd
[root@openvpn ~]# ls a?c
a1c  a2c  axc  aXc
[root@openvpn ~]# ls a[1x]c
a1c  axc
[root@openvpn ~]# ls a[a-z]c
axc  aXc
[root@openvpn ~]# ls a[A-Z]c  # 不区分大小写
axc  aXc
[root@openvpn ~]# ls a[x]c
axc
[root@openvpn ~]# ls a[X]c
aXc
[root@openvpn ~]# ls a[0-9]c
a1c  a2c
[root@openvpn ~]# ls /dev/sd[a-z]*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sdb1


以上是关于linux12shell编程 -- >元字符的主要内容,如果未能解决你的问题,请参考以下文章

linux12shell编程 -- >基本数据类型

linux12shell编程 -->变量值操作

ubuntu12.04中用emacs进行shell编程怎么配置呢?

Linux的shell编程中,如何将一段字符串进行截取?

linux12shell编程 --> shell基础01

Linux Shell编程快速入门