1.shell概述
1.1 shell是什么?
Shell是一个命令行解释器,他为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以使用Shell来启动,挂起,停止甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
1.2.Shell的分类
**Bourne Shell:**从1979年起Unix就开始使用,他的主文件名为sh。
**C Shell:**他主要在BSD版本的unix系统中使用,其语法和C语言相似。
Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh,ksh,Bash,psh,zsh;C家族主要包括:csh,tcsh。
Bash:Bash和sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。
1.3.Linux支持的Shell
# 查看shell的文件
/etc/shells
root@:~# cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/sh
/bin/dash
/usr/bin/dash
2.shell脚本的执行方式
2.1.echo输出命令
echo [选项] [输出内容]
-e :支持反斜线控制字符转换
eg:
root@:~# echo 'hello world!'
hello world!
# 删除左侧字符
root@:~# echo -e "ab\\bc"
ac
# 制表符与换行符
root@:~# echo -e "a\\tb\\tc\\nd\\te\\tf"
a b c
d e f
# 按照十六进制ascll码输出
root@:~# echo -e "\\x61\\t\\x62\\t\\x63\\t\\x65\\t\\x66"
a b c e f
root@:~# echo -e "\\x61\\t\\x62\\t\\x63\\n\\x65\\t\\x66\\t\\x67"
a b c
e f g
# 颜色输出
root@:~# echo -e "\\e[1;31m abcd \\e[0m"
abcd
\\e[1 :开启颜色输出
\\e[0m:关闭颜色输出
# 支持的颜色
#30m=黑色,31m=红色,32m=绿色,33m=黄色
#34m=蓝色,35m=洋红,36m=青色,37m=白色
2.2.第一个脚本
#!/bin/bash #标注我写的是shell脚本
#This is program
#Author:db (E-mail:xxxx@qq.com)
echo -e 'hello world!!'
# 记得chmod 755 hello.sh 加上可运行权限
root@:~/sh# ./hello.sh
hello world!!
# 也可以通过绝对路径来执行脚本文件
root@:~/sh# /root/sh/hello.sh
hello world!!
2.3.脚本执行
赋予执行权限,直接运行
- chmod 755 hello.sh
- ./hello.sh
通过bash调用执行脚本
- bash hello.sh
root@:~/sh# bash hello.sh hello world!!
注意如果在Windows系统中编写shell脚本的话会出现字符错误,Windows的回车键与Linux的回车不相同
root@:~/sh# ./hellodos.sh
-bash: ./hellodos.sh: /bin/bash^M: bad interpreter: No such file or directory
root@:~/sh# cat -A hellodos.sh
#!/bin/bash^M$
#The first program^M$
#Author:db (E-mail:xxxx@qq.com)^M$
^M$
echo -e 'hello world!!'
root@:~/sh# cat -A hello.sh
#!/bin/bash$
#The first program$
#Author:db (E-mail:xxxx@qq.com)$
$
echo -e 'hello world!!'$
Windows中的回车是^M$符号
Linux中的是$
如何解决呢?
root@:~/sh# dos2unix hellodos.sh
dos2unix: converting file hellodos.sh to Unix format...
root@:~/sh# ./hellodos.sh
hello world!!
使用dos2unix 将格式进行转换
3.Bash的基本功能
3.1.历史命令与命令补全
# 历史命令
history [选项] [历史命令保存文件]
选项:
-c:清空历史命令 # 建议不要情况
-w:把缓存的历史命令写入历史命令保存文件 (~/*bash_history)
默认保存1000条,想要更改的话需要修改配置文件/etc/profile
# 注意Ubuntu的就在~/.bashrc 文件内就可以直接修改
3.1.1.历史命令的调用
- 使用上,下箭头调用以前的历史命令
- 使用“!n”重复执行第n条历史命令
- 使用“!!”重复执行上一条命令
- 使用”!字串” 重复执行最后一条以该字串开头的命令
392 ls
393 ./hellodos.sh
394 cat -A hellodos.sh
395 cat -A hello.sh
396 dos2unix hellodos.sh
397 ./hellodos.sh
398 cd ..
399 clear
400 history
401 vim /etc/profile
402 vim ~/.bashrc
403 history
404 clear
405 history
root@:~# !392
ls
qemu-aarch64-static sh snap
root@:~# !!
ls
qemu-aarch64-static sh snap
root@:~# !l
ls
qemu-aarch64-static sh snap
root@:~#
3.1.2.命令与文件补全
在bash中,命令与文件补全是非常方便与常用的功能,我们只要输入命令或文件时,按“Tab”键就会自动进行补全
3.2.命令别名与常用快捷键
3.2.1.别名
# 命令别名
alias 别名='原命令'
命令执行时顺序:
- 第一顺位执行用绝对路径或者相对路径执行的命令
- 第二顺位执行别名
- 第三顺位执行bash的内部命令
- 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
别名永久生效
修改 .bashrc文件,将别名写入这个文件中
删除别名
unalias 别名
3.2.2.bash常用快捷键
3.3.输入输出重定向
3.3.1.标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stout | 1 | 标准输出 |
显示器 | /dev/sdterr | 2 | 标准错误输出 |
3.3.2.输出重定向
# 示例
root@:~# ls -l > ls.txt
root@:~# cat ls.txt
total 380
-rw-r--r-- 1 root root 0 Dec 18 14:49 ls.txt
-rw-r--r-- 1 root root 376832 Dec 5 17:01 qemu-aarch64-static
drwxr-xr-x 2 root root 4096 Dec 18 11:25 sh
drwx------ 5 root root 4096 Oct 18 15:39 snap
# 想要将错误命令的提示保存下来需要在 >> 加上2,2>>,2>
# 把命令的结果通过输出重定向保存下来,管理员进行查看就可以知道命令运行是否有错误了
这样不太智能,所以有了下面能同时将正确和错误的命令都输出的命令。
root@:~# ls -l >> ls2.txt 2>> lserorr.txt
root@:~# ls
ls.txt ls2.txt lserorr.txt qemu-aarch64-static sh snap
root@:~# cat lserorr.txt
root@:~# cat ls2.txt
total 384
-rw-r--r-- 1 root root 362 Dec 18 15:38 ls.txt
-rw-r--r-- 1 root root 0 Dec 18 15:49 ls2.txt
-rw-r--r-- 1 root root 0 Dec 18 15:49 lserorr.txt
-rw-r--r-- 1 root root 376832 Dec 5 17:01 qemu-aarch64-static
drwxr-xr-x 2 root root 4096 Dec 18 11:25 sh
drwx------ 5 root root 4096 Oct 18 15:39 snap
root@:~# lss -l >> ls2.txt 2>> lserorr.txt
root@:~# cat lserorr.txt
Command 'lss' not found, but there are 15 similar ones.
3.3.3.输入重定向
#示例:
wc [选项] [文件名]
#选项:
-c 统计字节数
-w 统计单词数
-l 统计行数
root@mfedang-virtual-machine:~# wc < ls.txt
8 63 362
root@mfedang-virtual-machine:~# wc << h
> sad
> sadas
> asdsaf
> h
3 3 17
输入重定向使用很少,详细资料需要上网查询,这里只是一个示例
3.4.多命令顺序执行与管道符
3.4.1.多命令顺序执行
root@:~# ls;pwd
ls.txt ls2.txt lserorr.txt qemu-aarch64-static sh snap
/root
root@:~# lsd;pwd
Command 'lsd' not found, but can be installed with:
snap install lsd
/root
root@:~# lsd&&pwd
Command 'lsd' not found, but can be installed with:
snap install lsd
root@:~# lsd||pwd
Command 'lsd' not found, but can be installed with:
snap install lsd
/root
# 可以查看当前系统创建一个100M的文件需要多久时间
root@:~# date;dd if=/dev/zero of=/root/testfile bs=1k count=100000;date
Wed Dec 18 16:27:49 CST 2024
100000+0 records in
100000+0 records out
102400000 bytes (102 MB, 98 MiB) copied, 0.827522 s, 124 MB/s
Wed Dec 18 16:27:50 CST 2024
## 可以判断上一个命令是否被成功执行
root@:~# lsd && echo yes || echo no
Command 'lsd' not found, but can be installed with:
snap install lsd
no
3.4.2.管道符
格式:命令1 | 命令2
命令1的正确输出作为命令2的操作对象
ll /etc | more #ll /etc的输出内容,作为more的操作对象
# 示例
grep [选项] "搜索内容" 文件名
选项:
-i:忽略大小写
-n:输出行号
-v:反向查找
--color=auto 搜索出的关键字用颜色显示
**root@:~# grep -i -n "gs" /etc/wifibroadcast.cfg
7:[gs_mavlink]
11:[gs_video]
13: # video sink (QGroundControl on GS)
root@:~# grep -i -n --color"gs" /etc/wifibroadcast.cfg
--color
root@:~# grep -i -n --color"gs" /etc/wifibroadcast.cfg
--color
root@:~# grep -i -n --color "gs" /etc/wifibroadcast.cfg
7:[gs_mavlink]
11:[gs_video]
13: # video sink (QGroundControl on GS)
root@:~# grep -i -n --color=auto "gs" /etc/wifibroadcast.cfg
7:[gs_mavlink]
11:[gs_video]
13: # video sink (QGroundControl on GS)**