16 shell基础

shell:命令解释器,脚本语言,编译工具(边执行、边编译)
配置文件位置:
七版本: /etc/shells
六版本: /etc/shell
一 echo [选项] "内容"
-e #可以加特殊字符
-n #输出后,下次命令不换行
[root@localhost ~]# echo -n "yq"
yq[root@localhost ~]#
-e "内容中可有"

## \e[数字m 调颜色
[root@localhost ~]# cat /root/test2.sh
#!/bin/bash
echo -e "\t\t\e[1;5;31myq\e[0m\t\t\t\e[1;5;32myq\e[0m"
echo -e "\t\e[1;5;33myq\e[0m\t\t\e[1;5;35m yq\e[0m\t\t\t\e[1;5;34myq\e[0m"
echo -e "\t\e[1;5;33myq\e[0m\t\t\t\t\t\e[1;5;34myq\e[0m"
echo -e "\t\e[1;5;33myq\e[0m\t\t\t\t\t\e[1;5;34myq\e[0m"
echo -e "\t\t\e[1;5;36myq\e[0m\t\t\t\e[1;5;31myq\e[0m\t"
echo -e "\t\t\t\e[1;5;32myq\e[0m\t\e[1;5;33myq\e[0m\t\t"
[root@localhost ~]# /root/test2.sh
yq yq
yq yq yq
yq yq
yq yq
yq yq
yq yq
二 脚本执行方式 文件以: .sh 结尾
(1)
[root@localhost ~]# vim /root/test4.sh
#!/bin/bash
echo "hello"
1) chmod +x 文件,sh
绝对路径、相对路径执行 #需要可执行权限、在子shell中执行
2) bash 文件.sh #无需可执行权限、在子shell中执行
3) source 文件.sh #无需可执行权限、在当前shell中执行
. 文件.sh #无需可执行权限、在当前shell中执行
(2) EOF顶行写即结束
[root@localhost ~]# vim /root/test5.sh
#!/bin/bash
cat << EOF
yqyqyqyqyq
EOF
#重定向写入文件,没有执行结果
[root@localhost ~]# vim /root/test5.sh
#!/bin/bash
cat << EOF > /root/yq.txt
yqyqyqyqyq
EOF
三 bash主要功能
1 history
.bash_history #保存用户执行的历史命令,用户退出后,内存保存到文件里
history -w #覆盖式保存历史命令(文件里的)
history -c #清空历史命令(内存里的)
>./.bash_history #清空历史命令(文件里的)
2 tab 补全
3 alias
例如: ls = 'ls --color=auto'
\ #转义符
\命令 #取消别名执行命令
命令执行顺序:
1) 绝对路径
2) 别名 alias
3) 内部命令,内嵌
4) $PATH 环境变量(hash表中)
[root@localhost ~]# echo $PATH #查看所有环境变量
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
hash表 #记录命令次数最大的几条
[root@localhost ~]# hash
命中 命令
5 /usr/bin/grep
1 /usr/bin/bash
3 /usr/bin/chmod
14 /usr/bin/vim
11 /usr/bin/cat
1 /usr/bin/touch
2 /usr/bin/tee
1 /usr/bin/yum
34 /usr/bin/vi
1 /usr/bin/sz
9 /usr/bin/ls
#命令次数 命令
hash -p /bin/touch mkdir #添加缓存记录,指定/bin/touch为mkdir命令(一般不用)
hash -r #清空hash缓存记录
4 bash常用快捷键

5 输入输出重定向

1)输出重定向 >
(1)正确错误重定向(用于正确、错误日志保存到不同位置)(>覆盖式 >>追加式)
正确命令 >文件
错误命令 2>文件
命令 &>文件 #正确、错误都覆盖式到文件
命令 >正确文件 2>错误文件 #正确的到正确文件、错误的到错误文件
; 表示两个命令连接,无论前面命令是否成功都执行后面命令
&& 表示前面命令执行成功后则执行后面命令
| 表示将命令1的标准输出作为命令2的标准输入
[root@localhost ~]# ls /boot/ > ./right.txt ; cat ./right.txt #正确执行命令结果到正确文件,并查看文件内容
config-3.10.0-957.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-51b463e7803f477d9f46aa6163e1f85e.img
initramfs-3.10.0-957.el7.x86_64.img
symvers-3.10.0-957.el7.x86_64.gz
System.map-3.10.0-957.el7.x86_64
vmlinuz-0-rescue-51b463e7803f477d9f46aa6163e1f85e
vmlinuz-3.10.0-957.el7.x86_64
[root@localhost ~]# lasd /boot/ 2> ./err.txt ;cat ./err.txt #错误执行命令到错误文件,并查看文件内容
-bash: lasd: 未找到命令
[root@localhost ~]# ls /boot/ &> ./all.txt ;cat ./all.txt #无论正确、错误命令都到文件,并查看内容
config-3.10.0-957.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-51b463e7803f477d9f46aa6163e1f85e.img
initramfs-3.10.0-957.el7.x86_64.img
symvers-3.10.0-957.el7.x86_64.gz
System.map-3.10.0-957.el7.x86_64
vmlinuz-0-rescue-51b463e7803f477d9f46aa6163e1f85e
vmlinuz-3.10.0-957.el7.x86_64
[root@localhost ~]# lasds /boot/ &> ./all.txt ;cat ./all.txt
-bash: lasds: 未找到命令
[root@localhost ~]# ls /boot/ >./right.txt 2>err.txt ;cat ./right.txt ;cat ./err.txt #正确的到正确、错误的到错误,并查看文件
config-3.10.0-957.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-51b463e7803f477d9f46aa6163e1f85e.img
initramfs-3.10.0-957.el7.x86_64.img
symvers-3.10.0-957.el7.x86_64.gz
System.map-3.10.0-957.el7.x86_64
vmlinuz-0-rescue-51b463e7803f477d9f46aa6163e1f85e
vmlinuz-3.10.0-957.el7.x86_64
[root@localhost ~]# lass /boot/ >./right.txt 2>err.txt ;cat ./right.txt ;cat ./err.txt
-bash: lass: 未找到命令
(2)tee # 读取标准输入数据,并将内容输出到文件,命令仍然显示结果 (覆盖式)
## tee -a #追加式 类似: >>
[root@localhost ~]# df -h |tee ./all.txt #覆盖式
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 20G 1.3G 18G 7% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 509M 120M 389M 24% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /mnt
[root@localhost ~]# ls /root/ | tee -a ./all.txt #追加式
all.txt
anaconda-ks.cfg
df -h
err.txt
ls
right.txt
test1.sh
test2.sh
test3.sh
test4.sh
test5.sh
wuziqi
ya.txt
yq
[root@localhost ~]# cat ./all.txt
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 20G 1.3G 18G 7% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 509M 120M 389M 24% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /mnt
all.txt
anaconda-ks.cfg
df -h
err.txt
ls
right.txt
test1.sh
test2.sh
test3.sh
test4.sh
test5.sh
wuziqi
ya.txt
yq
2)输入重定向 <
(文件内容到命令) wc、at
wc 文件 #显示文件内容的 行数、空格数、字符数
wc -c 文件 #只显示字符数,名字
wc -l 文件 #只显示行数,名字
wc -w 文件 #只显示词数(空格数),名字
[root@localhost ~]# wc /etc/fstab
11 54 501 /etc/fstab
[root@localhost ~]# wc -c /etc/fstab
501 /etc/fstab
[root@localhost ~]# wc -l /etc/fstab
11 /etc/fstab
[root@localhost ~]# wc -w /etc/fstab
54 /etc/fstab
$ at 时间 <文件 # 在某个时间,将文件中的命令执行
6 grep行级过滤
格式:
grep 选项 "字符串" 文件
选项:
-A数字 #列出符合条件的行,并连续列出后续n行(如果小写,那么会列出前后 n行)。
-B数字 #列出符合条件的行,并连续列出前面n行(如果小写,那么会列出前后 n行)。
-c #统计符合条件的字符串行数
-i #忽略大小写
-n #输出行号
-v #反向查找(取反)
-o #只列出关键字
- - color=auto #搜索出的关键词高亮显示
[root@localhost ~]# grep -A2 "root" /etc/passwd #-A数字 #列出符合条件的行,并连续列出后续n行(如果小写,那么会列出前后 n行)。
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost ~]# grep -c "root" /etc/passwd #-c #统计符合条件的字符串行数
2
[root@localhost ~]# grep -i "root" /etc/passwd -i #忽略大小写
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -n "root" /etc/passwd #-n #输出行号
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -v "root" /etc/passwd # -v #反向查找(取反)
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@localhost ~]# grep -o "root" /etc/passwd #-o #只列出关键字
root
root
root
root
[root@localhost ~]# grep --color=auto "root" /etc/passwd #- - color=auto #搜索出的关键词高亮显示
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologi
7 通配符
| * | ? | [ - ] | [ ^ ] |
|---|---|---|---|
| 任意 | 一个字符 | 字符范围 | 不是括号内的一个字符 例如: [ ^b] 除了b |
[root@localhost ~]# ls /root/test[^1].sh
/root/test2.sh /root/test3.sh /root/test4.sh /root/test5.sh
bash中其他特殊符号
| 符号 | 作用 |
|---|---|
| ’ ‘ | 取消特殊含义(范围取消) |
| \ | 取消特殊含义(字符串取消) |
| “ ” | 表示整体 |
| · · | 反引号,在“ ” 中执行命令,和 $(命令) 一样 |
| $(命令) | 引用系统命令 |
| (命令) | 命令在子shell中执行 |
| {命令} | 命令在当前shell中执行 |
变量
echo $((算式)) #计算算式
a=3 #赋值
b=9
echo $((a*b)) #计算ab
[root@localhost ~]# yq=123 #验证当前shell、子shell的赋值不一样
[root@localhost ~]# echo $yq
123
[root@localhost ~]# (yq=asd;echo $yq)
asd
[root@localhost ~]# echo $yq
123
| [ ] | 变量测试 |
|---|---|
| # | 注释 |
| $ | 调用变量的值 |