什么Shell脚本﹖到底能解决什么问题?Shell脚本其实就是把一批命令集合在一起,解决一些复杂的问题。有点类似于程序设计(在Shell中,变量、分支、循环、函数、数组等与程序设计完全类似的功能),但是本质上来说不是程序设计。Shell的程序复杂度是无法真正与编程语言相提并论的,但是由于与操作系统是集成在一起的,所以能够执行一些更加底层的命令组合,且效率很高。
目录
- 一、Shell基础用法
-
- 1、Shell的类型
- 2、Shell操作
- 3、Bash基本操作
- 4、echo命令
- 5、环境变量
- 6、普通变量
- 7、管道及重定向
一、Shell基础用法
1、Shell的类型
命令 |
作用 |
Bourne Shell |
是贝尔实验室开发的,Unix普遍使用的Shell,在编程方面比较优秀,但在用户交互方面没有其他Shell优秀。 |
Korn Shell |
是对Bourne Shell的发展,在大部分内容上与Bourne Shell兼容,集成了C Shell和Bourne shell优点。 |
C Shell |
是SUN公司Shell的BSD版本,语法与c语言相似,比bourne shell更适合编程 |
BASH |
是GNU的Bourne Again Shell,是GNU操作系统上默认的Shell,在Bourne Shell基础上增强了很多特性,如命令补全,命令历史表 |
2、Shell操作
命令 |
作用 |
cat /etc/shells |
列出系统中所有的Shell |
ksh/csh/zsh/bash |
切换到其它Shell |
chsh qiang |
使用命令chsh更改用户qiang的默认Shell |
cat /etc/passwd |
查看用户使用的默认的Shell |
echo $SHELL |
查看当前环境变量$SHELL的值 |
3、Bash基本操作
命令 |
作用 |
TAB键 |
命令补全功能(很实用) |
history命令或上下箭头 |
命令的历史记录 |
alias gohome=“shutdown -h now” |
命令别名功能 |
alias myfirewall=“systemctl start firewalld; firewall-cmd --add-port=80/tcp” |
通过设定一个别名来执行长命令 |
crontab |
作业控制功能 |
shell脚本编程 |
非常灵活的脚本编程能力 |
ls;cat /etc/passwd;mount |
三个命令放在一起通过;分隔 |
4、echo命令
命令 |
作用 |
echo “HelloWorld” |
在屏幕上输出HelloWorld |
echo “Hello\nWorld” |
在屏幕上输出Hello\nWorld |
echo -e “HelloinWorld” |
在屏幕上输出Hello World |
\a |
蜂鸣 |
\b |
退格,覆盖前一个字符 |
\c |
不带换行符打印一行 |
\f |
换页 |
\n |
换行 |
\r |
回车 |
\t |
制表符 |
\v |
纵向制表符 |
\ |
反斜杠 |
\0nnn |
ASCII码对应nnn(八进制)的字符 |
5、环境变量
命令 |
作用 |
set |
显示当前shell的变量,包括当前用户的变量 |
env |
显示当前用户的变量 |
export |
显示当前导出成用户变量的shell变量 |
cat /etc/profile |
全局的环境变量,对任何用户生效 |
cat ~/.bash_profile |
用户主目录下的环境变量,仅对当前用户生效(本地变量定义在此) |
export NAME=Denny |
定义一个NAME环境变量并赋值为Denny |
echo $NAME |
输出一个环境变量的值 |
unset NAME |
删除环境变量 |
echo $USER |
当前登录的用户名 |
echo $UID |
当前登录的用户ID号 |
echo $SHELL |
当前所使用的SHELL |
echo $HOME |
当前用户的主目录 |
echo $PWD |
当前命令行所在的目录 |
echo $PATH |
当前可执行程序的路径(设定了PATH,执行命令就不用输入命令的绝对路径) |
echo $PS1 |
命令的提示字符串(可以试一下export PS1="Welcome Linux#“ |
echo $PS2 |
命令一行未写完时换行提示符 |
6、普通变量
命令 |
作用 |
1、read NAME 2、Bill Gates |
从终端将值读入并赋值给变量NAME |
echo $NAME |
将变量NAME的值输出 |
1、read NAME SURNAME 2、Bill 3、Gates |
此时会将Bill赋值给NAME,而将Gates赋值给SURNAME |
cat ~/.bash_profile |
本地变量在此定义,将只对本用户生效 |
1、NAME=Denny 2、echo $NAME |
在命令行定义变量NAME并取得其值,注意:在Shell中定义变量时,不能在=号两边加空格,否则会将变量名处理为一个命令,=是命令的第一个参数 |
1、SOURCE=/etc/passwd 2、DEST=/opt/learn 3、cp SOURCE DEST |
利用变量代替对应值进行操作 |
1、NAME=Denny 2、readonly NAME |
设置只读变量,此时变量的值将不能被修改 |
7、管道及重定向
命令 |
作用 |
set | grep USER |
从set的输出中查找包含USER的行 |
ls | wc -l |
根据ls输出的行数来统计该文件夹下的文件数量 |
head /etc/passwd >>passwd.txt |
将/etc/passwd文件的输出重定向到文件passwd.txt中 |
tail /etc/passwd >> passwd.txt |
在文件passwd.txt后面累加 |
cat < /etc/passwd |
将/etc/passwd文件作为cat的输入 |
cat < /etc/passwd > passwd2.txt |
将/etc/passwd文件作为cat的输入,并将输出结果重定向到passwd2.txt中 |
ifconfig | tee ifconfig.tee |
将ifconfig的内容输出到屏幕上同时输出到文件ifconfig.tee中 |
ifconfig | tee -a ifconfig.tee |
以追加的方式输出到文件ifconfig.tee中 |
ifconfig 1> ifconfig.out |
标准输出重定向到文件ifconfig.out中 |
ifconfige 1> ifconfig.error |
将标准输出重定向到文件ifconfig.error中,此处由于不存在命令ifconfige,所以ifconfig.error中将没有内容 |
ifconfig 2> ifconfig.error |
标准错误重定向到文件ifconfig.error中,由于此处没有错误,所以ifconfig.error文件中将没有内容 |
ifconfige 2> ifconfig.error |
标准错误重定向到文件ifconfig.error中 |
ls /opt /optt 2> cat.error |
将标准输出输出到屏幕而将标准错误重定向到cat.error中 |
ls /opt /optt 1> cat.error 2>&1 |
标准输出和标准错误一起重定向到一个文件 |
ls /opt /optt 2> ls.err 1> ls.out |
正确的输出和错误的输出分别重定向到不同的文件 |
ls /opt /optt 2> /dev/null |
标准错误信息会输送到系统垃圾箱,而不会输送到屏幕,也不会输出到任何地方 |
命令1 && 命令2 |
命令1成功执行后才执行命令2 |
命令1||命令2 |
命令1执行失败后才执行命令2 |
tty |
查看当前终端设备编号 |