实验环境
[root@centos76 ~]# mkdir -p /root/data
[root@centos76 ~]# cd /root/data/
# 创建1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt
[root@centos76 data]# touch {1..7}.txt
[root@centos76 data]# touch {a..g}.sh
[root@centos76 data]# touch {aa,bb,cc,dd}.txt
[root@centos76 data]# ls
1.txt 3.txt 5.txt 7.txt a.sh b.sh c.sh d.sh f.sh
2.txt 4.txt 6.txt aa.txt bb.txt cc.txt dd.txt e.sh g.sh
通配符
符号 | 作用 |
---|---|
* | 匹配0个或多个任意字符 |
? | 匹配一个任意字符,有且只有一个字符 |
[abcd] | 匹配abcd中任何一个字符 |
[a-z] | 匹配a到z中任何一个字符 |
[!abcd] | 匹配除了abcd以外的任何一个字符 |
[^abcd] | 同[!abcd],匹配除了abcd以外的任何一个字符 |
*
匹配任意数量的任意字符 包括空字符串
# 展示当前目录下的所有文件
[root@centos76 data]# ls *
1.txt 3.txt 5.txt 7.txt a.sh b.sh c.sh d.sh f.sh
2.txt 4.txt 6.txt aa.txt bb.txt cc.txt dd.txt e.sh g.sh
# 展示当前目录下 .sh结尾的文件
[root@centos76 data]# ls *.sh
a.sh b.sh c.sh d.sh e.sh f.sh g.sh
# 展示当前目录下 .txt结尾的文件
[root@centos76 data]# ls *.txt
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt aa.txt bb.txt cc.txt dd.txt
# 展示当前目录下 a开头的文件
[root@centos76 data]# ls a*
aa.txt a.sh
?
匹配一个任意字符,有且只有一个字符
[root@centos76 data]# ls ?.txt
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt
# 注意只能匹配一个字符 要想匹配多个得用多个?
[root@centos76 data]# ls ??.txt
aa.txt bb.txt cc.txt dd.txt
[]
匹配指定范围中的一个字符,有且只有一个字符
[root@centos76 data]# ls [abcd].sh
a.sh b.sh c.sh d.sh
[root@centos76 data]# ls [a-g].sh
a.sh b.sh c.sh d.sh e.sh f.sh g.sh
[root@centos76 data]# ls [1-7].txt
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt
# 注意只能匹配一个字符
[root@centos76 data]# ls [a-d][a-d].txt
aa.txt bb.txt cc.txt dd.txt
[!] 或者 [^]
匹配不在指定范围中的一个字符,有且只有一个字符
!
和^
在这里都是取反的意思
[root@centos76 data]# ls [^1-9].*
a.sh b.sh c.sh d.sh e.sh f.sh g.sh
[root@centos76 data]# ls [!a-z].*
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt
# 注意只能匹配一个字符
[root@centos76 data]# ls [^1-9][a-z].*
aa.txt bb.txt cc.txt dd.txt
与路径有关的特殊字符
符号 | 作用 |
---|---|
~ | 用户的家目录,root用户为/root |
- | 代表上一次所在目录 |
. | 代表当前目录 |
.. | 代表上级目录 |
~
用户家目录
root用户的家目录为/root
普通用户的家目录为/home/用户名
# 在任意目录执行 cd ~ 都会回到家目录
[root@centos76 data]# cd /etc/sysconfig/network-scripts/
# pwd命令显示当前所在目录
[root@centos76 network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@centos76 network-scripts]# cd ~
[root@centos76 ~]# pwd
/root
-
上一次所在目录
当执行cd
命令时
会把执行cd
命令前所在目录 赋值给 OLDPWD
变量
把执行cd
命令后所在目录 赋值给 PWD
变量
# 从/root目录切换到/etc/sysconfig/network-scripts
[root@centos76 ~]# pwd
/root
[root@centos76 ~]# cd /etc/sysconfig/network-scripts/
[root@centos76 network-scripts]# pwd
/etc/sysconfig/network-scripts
# 此时OLDPWD 为/root PWD 为/etc/sysconfig/network-scripts
# echo命令打印字符串
[root@centos76 network-scripts]# echo $OLDPWD $PWD
/root /etc/sysconfig/network-scripts
cd - 就是切换到上一次所在目录 其实就是切换到 OLDPWD变量代表的目录
[root@centos76 network-scripts]# cd -
/root
[root@centos76 ~]# pwd
/root
# 此时你会发现 OLDPWD PWD 互换了
[root@centos76 ~]# echo $OLDPWD $PWD
/etc/sysconfig/network-scripts /root
# 所以可以利用 cd - 在两个目录之间来回切换
[root@centos76 ~]# cd -
/etc/sysconfig/network-scripts
[root@centos76 network-scripts]# cd -
/root
[root@centos76 ~]# cd -
/etc/sysconfig/network-scripts
.
代表当前目录
[root@centos76 data]# cd /root/data
[root@centos76 data]# pwd
/root/data
# cd . 之后目录没变
[root@centos76 data]# cd .
[root@centos76 data]# pwd
/root/data
..
代表上级目录
[root@centos76 data]# cd /root/data
[root@centos76 data]# pwd
/root/data
# cd ..后目录切换到上级目录
[root@centos76 data]# cd ..
[root@centos76 ~]# pwd
/root
单引号 双引号 反引号 不加引号的区别
''
单引号 所见即所得
# 单引号中的转义字符 命令 变量都不会被解析
# data命令会显示当前日期
[root@centos76 ~]# date
2022年 07月 25日 星期一 10:56:14 CST
# 定义变量 a=1
[root@centos76 ~]# a=1
# echo 打印字符串 字符串用单引号引起来就是原样输出 不会解析里面的特殊字符
[root@centos76 ~]# echo '$(date)${a}'
$(date)${a}
`` 反引号 引用命令 相当于 $()
# 反引号引起来date 就相当于执行date命令
[root@centos76 ~]# echo `date`
2022年 07月 25日 星期一 11:03:29 CST
# $(命令) 的作用就是执行命令 所以``相当于 $()
[root@centos76 ~]# echo $(date)
2022年 07月 25日 星期一 11:03:37 CST
""
双引号 解析命令 变量 转义字符等
# $(命令)是执行命令 ${变量}是引用变量
# 用双引号引起来 会执行date命令 会解析变量a
# 所以打印出来的是当前日期 和 a变量的值
[root@centos76 ~]# a=1
[root@centos76 ~]# echo "$(date) ${a}"
2022年 07月 25日 星期一 11:06:29 CST 1
不加引号 和双引号类似
如果不加引号 也会解析变量 执行命令 作用和双引号类似
不同之处在于 双引号会把引起来的内容当成一个整体 不加引号则不会
[root@centos76 ~]# a=1
[root@centos76 ~]# echo ${a}
1
[root@centos76 ~]# echo $(date)
2022年 07月 25日 星期一 11:11:37 CST1
# 加上双引号 123四个空格456作为一个整体是一个字符串
[root@centos76 data]# echo "123 456"
123 456
# 不加引号 echo会认为你传给它两个字符串 一个是123 一个是456
# 然后把这两个字符串分别打印出来 中间用空格分隔开
[root@centos76 data]# echo 123 456
123 456
其他特殊字符
$(命令名)
引用命令
[root@centos76 data]# echo $(date)
2022年 07月 25日 星期一 11:33:22 CST
${变量名}
或$变量名
引用变量
[root@centos76 data]# a=100
[root@centos76 data]# echo ${a}
100
# $a 等价于 ${a}
[root@centos76 data]# echo $a
100
$
普通用户的命令提示符
# 命令行之前的那个$ 是个命令提示符
ocean@T480s:~$ whoami
ocean
ocean@T480s:~$
;
命令的结束 命令间的分隔符
# 命令结束符 也可以不写
[root@centos76 data]# ls;
1.txt 3.txt 5.txt 7.txt a.sh b.sh c.sh d.sh f.sh
2.txt 4.txt 6.txt aa.txt bb.txt cc.txt dd.txt e.sh g.sh
# 命令分割符 你会发现ls执行了两遍
[root@centos76 data]# ls;ls
1.txt 3.txt 5.txt 7.txt a.sh b.sh c.sh d.sh f.sh
2.txt 4.txt 6.txt aa.txt bb.txt cc.txt dd.txt e.sh g.sh
1.txt 3.txt 5.txt 7.txt a.sh b.sh c.sh d.sh f.sh
2.txt 4.txt 6.txt aa.txt bb.txt cc.txt dd.txt e.sh g.sh
#
注释;root用户命令提示符
# #在命令行或者shell脚本文件中放在行的开头作为注释
[root@centos76 data]# #我是注释不会执行
[root@centos76 data]#
# 命令行之前的那个# 是个命令提示符
[root@centos76 data]# whoami
root
[root@centos76 data]#
{}
序列
# a b c d 作为一个序列 放在{}之中用,分割
[root@centos76 data]# echo {a,b,c,d}
a b c d
# 1..10表示从1到10 放在{}之中表示从1到10的序列
[root@centos76 data]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
&&
并且 短路效果
# 命令1 && 命令2 先执行命令1 后执行命令2
[root@centos76 data]# echo a && echo b
a
b
# 有短路效果 如果命令1 执行失败了则不执行命令2
[root@centos76 data]# cho a an echo b
-bash: cho: 未找到命令
||
或者 短路效果
# 命令1 or 命令2 先执行命令1 命令1成功了 不执行命令2 短路效果
[root@centos76 data]# echo a || echo b
a
# 如果命令1失败了 则执行命令2
[root@centos76 data]# cho a || echo b
-bash: cho: 未找到命令
b
\
命令拼接符;转义字符
# 在bash中执行命令 如果一行命令太长 按回车换行会直接执行
# 此时可以输入 \之后敲回车 bash就知道你这一行命令还没有输入完
# 这样在命令行输入长命令时易于编辑
[root@centos76 data]# echo a \
> && \
> echo b
a
b
# 如果你按向上箭头键调出上一条命令 会发现他是一行
[root@centos76 data]# echo a && echo b
# \还可以作为转义字符 例如\n表示换行 \t表示水平制表符
[root@centos76 data]# echo -e "a\nb"
a
b
[root@centos76 data]# echo -e "a\tb"
a b
|
管道
linux管道
>
>>
<
<<
重定向
linux重定向