- 性 质
- 命令解析器
- 外文名
- shell
- 用 途
- 接收用户命令
- 中文名
- 壳
-
shell
2019-09-16 20:00:00shell 什么是shell: 现在我们使用的操作系统(Windows、Mac OS、Android、iOS等)都是带图形界面的,简单直观,容易上手,对专业用户(程序员、网管等)和普通用户(家庭主妇、老年人等)都非常适用;计算机的普及...shell
什么是shell:
现在我们使用的操作系统(Windows、Mac OS、Android、iOS等)都是带图形界面的,简单直观,容易上手,对专业用户(程序员、网管等)和普通用户(家庭主妇、老年人等)都非常适用;计算机的普及离不开图形界面。
然而在计算机的早期并没有图形界面,我们只能通过一个一个地命令来控制计算机,这些命令有成百上千之多,且不说记住这些命令非常困难,每天面对没有任何色彩的“黑屏”本身就是一件枯燥的事情;这个时候的计算机还远远谈不上炫酷和普及,只有专业人员才能使用。
对于图形界面,用户点击某个图标就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看做一个命令)就能启动某个程序。这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。换句话说,图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。
由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。
用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell。2.shell 作用详析:
Shell 除了能解释用户输入的命令,将它传递给内核,还可以:
调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果;
在多个程序之间传递数据,把一个程序的输出作为另一个程序的输入;
Shell 本身也可以被其他程序调用。
由此可见,Shell 是将内核、程序和用户连接了起来。
Shell 本身支持的命令并不多,但是它可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。
Shell 并不是简单的堆砌命令,我们还可以在 Shell 中编程,这和使用 C/C++、Java、Python 等常见的编程语言并没有什么两样。
Shell 虽然没有 C/C++、Java、Python 等强大,但也支持了基本的编程元素,例如:
if…else 选择结构,switch…case 开关语句,for、while、until 循环;
变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。
站在这个角度讲,Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。
Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、一键搭建Web开发环境、日志分析等,Shell 都非常合适。3.3.常见的shell类型有 sh、bash、csh、tcsh、ash 等。
常见的 Shell
sh
sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。
sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。csh
sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。
Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。
BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。tcsh
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。ash
一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。bash
bash shell 是 Linux 的默认 shell,本教程也基于 bash 编写。
bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。
bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。
尽管如此,bash 和 sh 还是有一些不同之处:
一方面,bash 扩展了一些命令和参数;
另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。历史命令
1.history 查询历史命令
历史命令文件存放在 /root/.bash_history[root@localhost ~]# ls /root/.bash_history /root/.bash_history [root@localhost ~]# cat !$ cat /root/.bash_history chmod ~/.ssh 700 chmod /~.ssh 700 iptable ipaddr ip addr dhclient ip addr ping www.baidu.com ip route vi /etc/sysconfig/network-scripts/ifcfg-ens33 ip addr ifconfig vi /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network ping www.baidu.com mkidr ~/.ssh/ mkdir ~/.ssh/ ls cd / cd ls cd .. ls cd /.ssh cd ls cd ~/.ssh vi authorized_keys chmod 600authorized_keys chmod 600 authorized_keys ls cd .. ls cd .. cd ~ ls cd ~/.ssh ls ll vi authorized_keys chmod 600 authorized_keys vi authorized_keys chmod 600 authorized_keys cd ls cd .. ls chmod 700 home yum install -y lrzsz ls sz anaconda-ks.cfg ls rz
3.修改系统摩恩的存储历史命令的条数
4.设定history命令显示时间
5.历史命令的调用
使用上下箭头调用以前的历史命令
使用 !n 重复执行第n条历史命令
使用 !! , !-1 重复执行上一条命令 Ctrl+p+enter亦可
使用 !ls 重复执行最后一条以ls开头的命令命令补全和别名
tab键补全命令:在输入命令的时候,输入命令的一部分,可以按两下tab键补全命令
centos6 可以使用tab键补全命令,不支持补全选项;
centos7 也可以使用tab键补全命令,也支持补全选项,但是需要安装一个bash-completion的包,安装完成后需要重启。自定义别名
别名的配置文件:~/bash.rc 和 /etc/profile.d/
取消别名
通配符、输出重定向
通配符
符号 作用 * 匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ? 匹配任何一个字符(不在括号内时)?代表任意1个字符 [abcd] 匹配abcd中任何一个字符 [a-z] 表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符 {…} 表示生成序列. 以逗号分隔,且不能有空格 [!abcd]或[^abcd] 表示非,表示不匹配括号里面的任何一个字符 输出重定向
符号 作用 > 正确输出重定向 >> 正确追加输出重定向 2> 错误输出重定向 2>> 错误追加输出重定向 &> 不管正确与否,输出重定向 &>> 不管正确与否,追加输出重定向 < 输入重定向
管道符、作业控制
符号 作用 |
把前面命令的结果给后面的命令 作业控制
命令 作用 ctrl+c 发送SIGINT信号,终止一个进程。 ctrl+z 发送SIGSTOP信号,挂起一个进程,将作业放置到后台(暂停状态)。与此同时,可以通过fg重启前台被中断的任务,也可以通过bg把中断的任务放到后台执行。 jobs 查看当前有多少在后台运行的命令 fg 将后台中的命令调至前台继续运行,如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid) bg 将一个在后台暂停的命令,变成继续执行,如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid) 命令+& 这个用在一个命令的最后,可以把这个命令放到后台执行
-
shell脚本--sed的用法
2018-05-17 01:04:27sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳...本文主要介绍sed的一些基本用法,并通过shell脚本演示sed的使用实例。 1.sed的使用方法,调用sed 命令的语法有两种: 一.在命令...sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过。
sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑。本文主要介绍sed的一些基本用法,并通过shell脚本演示sed的使用实例。
1.sed的使用方法,调用sed 命令的语法有两种:
一.在命令行指定sed指令对文本进行处理:sed +选项 ‘指令’ 文件
二.先将sed指令保存到文件中,将该文件作为参数进行调用:sed +选项 -f 包含sed指令的文件 文件
sed的常用选项:
-r:使用扩展正则表达式
-e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
-f:后跟保存了sed指令的文件
-i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
sed中的编辑命令:
a:追加 向匹配行后面插入内容
c:更改 更改匹配行的内容
i:插入 向匹配行前插入内容
d:删除 删除匹配的内容
s:替换 替换掉匹配的内容
p:打印 打印出匹配的内容,通常与-n选项和用
=:用来打印被匹配的行的行号
n:读取下一行,遇到n时会自动跳入下一行
r,w:读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件
2.sed命令实例:
示例1:向文件中添加或插入行
sed '3ahello' 1.txt #向第三行后面添加hello,3表示行号
sed '/123/ahello' 1.txt #向内容123后面添加hello,如果文件中有多行包括123,则每一行后面都会添加
sed '$ahello' 1.txt #在最后一行添加hello
sed '3ihello' 1.txt #在第三行之前插入hello
sed '/123/ihello' 1.txt #在包含123的行之前插入hello,如果有多行包含123,则包含123的每一行之前都会插入hello
sed '$ihello' 1.txt #在最后一行之前插入hello
示例2:更改文件中指定的行
sed '1chello' 1.txt #将文件1.txt的第一行替换为hello
sed '/123/chello' 1.txt #将包含123的行替换为hello
sed '$chello' 1.txt #将最后一行替换为hello
示例3:删除文件中的行
sed '4d' 1.txt #删除第四行
sed '1~2d' 1.txt #从第一行开始删除,每隔2行就删掉一行,即删除奇数行
sed '1,2d' 1.txt #删除1~2行
sed '1,2!d' 1.txt #删除1~2之外的所有行
sed '$d' 1.txt #删除最后一行
sed '/123/d' 1.txt #删除匹配123的行
sed '/123/,$d' 1.txt #删除从匹配123的行到最后一行
sed '/123/,+1d' 1.txt #删除匹配123的行及其后面一行
sed '/^$/d' 1.txt #删除空行
sed '/123\|abc/!d' 1.txt #删除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反
sed '1,3{/123/d}' 1.txt #删除1~3行中,匹配内容123的行,1,3表示匹配1~3行,{/123/d}表示删除匹配123的行
示例4:替换文件中的内容
sed 's/123/hello/' 1.txt #将文件中的123替换为hello,默认只替换每行第一个123
sed 's/123/hello/g' 1.txt #将文本中所有的123都替换为hello
sed 's/123/hello/2' 1.txt #将每行中第二个匹配的123替换为hello
sed -n 's/123/hello/gpw 2.txt' 1.txt #将每行中所有匹配的123替换为hello,并将替换后的内容写入2.txt
sed '/#/s/,.*//g' 1.txt #匹配有#号的行,替换匹配行中逗号后的所有内容为空 (,.*)表示逗号后的所又内容
sed 's/..$//g' 1.txt #替换每行中的最后两个字符为空,每个点代表一个字符,$表示匹配末尾 (..$)表示匹配最后两个字符
sed 's/^#.*//' 1.txt #将1.txt文件中以#开头的行替换为空行,即注释的行 ( ^#)表示匹配以#开头,(.*)代表所有内容
sed 's/^#.*//;/^$/d' 1.txt #先替换1.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开
sed 's/^[0-9]/(&)/' 1.txt #将每一行中行首的数字加上一个小括号 (^[0-9])表示行首是数字,&符号代表匹配的内容
或者 sed 's/\(^[0-9]\)/(\1)/' 1.txt #替换左侧特殊字符需钥转义,右侧不需要转义,\1代表匹配的内容
sed 's/$/&'haha'/' 1.txt # 在1.txt文件的每一行后面加上"haha"字段
示例5:打印文件中的行
sed -n '3p' 1.txt #打印文件中的第三行内容
sed -n '2~2p' 1.txt #从第二行开始,每隔两行打印一行,波浪号后面的2表示步长
sed -n '$p' 1.txt #打印文件的最后一行
sed -n '1,3p' 1.txt #打印1到3行
sed -n '3,$p' 1.txt #打印从第3行到最后一行的内容
sed -n '/you/p' 1.txt #逐行读取文件,打印匹配you的行
sed -n '/bob/,3p' 1.txt #逐行读取文件,打印从匹配bob的行到第3行的内容
sed -n '/you/,3p' 1.txt #打印匹配you 的行到第3行,也打印后面所有匹配you 的行
sed -n '1,/too/p' 1.txt #打印第一行到匹配too的行
sed -n '3,/you/p' 1.txt #只打印第三行到匹配you的行
sed -n '/too/,$p' 1.txt #打印从匹配too的行到最后一行的内容
sed -n '/too/,+1p' 1.txt #打印匹配too的行及其向后一行,如果有多行匹配too,则匹配的每一行都会向后多打印一行
sed -n '/bob/,/too/p' 1.txt #打印从匹配内容bob到匹配内容too的行
示例6:打印文件的行号
sed -n "$=" 1.txt #打印1.txt文件最后一行的行号(即文件有多少行,和wc -l 功能类似)
sed -n '/error/=' 1.txt #打印匹配error的行的行号
sed -n '/error/{=;p}' 1.txt #打印匹配error的行的行号和内容(可用于查看日志中有error的行及其内容)
示例7:从文件中读取内容
sed 'r 2.txt' 1.txt #将文件2.txt中的内容,读入1.txt中,会在1.txt中的每一行后都读入2.txt的内容
sed '3r 2.txt' 1.txt #在1.txt的第3行之后插入文件2.txt的内容(可用于向文件中插入内容)
sed '/245/r 2.txt' 1.txt #在匹配245的行之后插入文件2.txt的内容,如果1.txt中有多行匹配456则在每一行之后都会插入
sed '$r 2.txt' 1.txt #在1.txt的最后一行插入2.txt的内容
示例8:向文件中写入内容
sed -n 'w 2.txt' 1.txt #将1.txt文件的内容写入2.txt文件,如果2.txt文件不存在则创建,如果2.txt存在则覆盖之前的内容
sed -n '2w 2.txt' 1.txt #将文件1.txt中的第2行内容写入到文件2.txt
sed -n -e '1w 2.txt' -e '$w 2.txt' 1.txt #将1.txt的第1行和最后一行内容写入2.txt
sed -n -e '1w 2.txt' -e '$w 3.txt' 1.txt #将1.txt的第1行和最后一行分别写入2.txt和3.txt
sed -n '/abc\|123/w 2.txt' 1.txt #将1.txt中匹配abc或123的行的内容,写入到2.txt中
sed -n '/666/,$w 2.txt' 1.txt #将1.txt中从匹配666的行到最后一行的内容,写入到2.txt中
sed -n '/xyz/,+2w 2.txt' 1.txt #将1.txt中从匹配xyz的行及其后2行的内容,写入到2.txt中
示例9:sed 在shell脚本中的使用
实例1:替换文件中的内容
#!/bin/bash
if [ $# -ne 3 ];then #判断参数个数
echo "Usage: $0 old-part new-part filename" #输出脚本用法
exit
fised -i "s#$1#$2#" $3 #将 旧内容进行替换,当$1和$2中包含"/"时,替换指令中的定界符需要更换为其他符号
实例2:删除文件中的空白行
#!/bin/bash
if [ ! -f $1 ];then #判断参数是否为文件且存在
echo "$0 is not a file"
exit
fi
sed -i "/^$/d" $1 #将空白行删除
实例3:格式化文本内容
#!/bin/bash
a='s/^ *>// #定义一个变量a保存sed指令,'s/^ *>//':表示匹配以0个或多空格开头紧跟一个'>'号的行,将匹配内容替换
s/\t*// #'s/\t*//':表示匹配以0个或多个制表符开头的行,将匹配内容替换s/^>// #'s/^>//' :表示匹配以'>'开头的行,将匹配内容替换
s/^ *//' #'s/^ *//':表示匹配以0个或多个空格开头的行,将匹配内容替换
#echo $a
sed "$a" $1 #对用户给定的文本文件进行格式化处理实用脚本:批量更改当前目录中的文件后缀名:
示例1:
#!/bin/bash
if [ $# -ne 2 ];then #判断用户的输入,如果参数个数不为2则打印脚本用法
echo "Usage:$0 + old-file new-file"
exit
fi
for i in *$1* #对包含用户给定参数的文件进行遍历
do
if [ -f $i ];then
iname=`basename $i` #获取文件名
newname=`echo $iname | sed -e "s/$1/$2/g"` #对文件名进行替换并赋值给新的变量
mv $iname $newname #对文件进行重命名
fi
doneexit 666
示例2:
#!/bin/bash
read -p "input the old file:" old #提示用户输入要替换的文件后缀
read -p "input the new file:" new
[ -z $old ] || [ -z $new ] && echo "error" && exit #判断用户是否有输入,如果没有输入怎打印error并退出
for file in `ls *.$old`
do
if [ -f $file ];then
newfile=${file%$old} #对文件进行去尾
mv $file ${newfile}$new #文件重命名
fidone
示例3:
#!/bin/bash
if [ $# -ne 2 ];then #判断位置变量的个数是是否为2
echo "Usage:$0 old-file new-file"
exit
fi
for file in `ls` #在当前目录中遍历文件
do
if [[ $file =~ $1$ ]];then #对用户给出的位置变量$1进行正则匹配,$1$表示匹配以变量$1的值为结尾的文件
echo $file #将匹配项输出到屏幕进行确认
new=${file%$1} #对文件进行去尾处理,去掉文件后缀保留文件名,并将文件名赋给变量new
mv $file ${new}$2 #将匹配文件重命名为:文件名+新的后缀名
fidone
示例4:使用sed匹配文件中的IP地址
sed -nr '/([0-9]{1,3}\.){3}([0-9]{1,3})/p' 1.txt
-
-
Shell脚本
2020-10-04 20:29:52这里写目录标题Shell脚本1.Shell脚本简介2.Shell2.1 Shell 脚本的解释器2.2 脚本的编写规范2.3 执行脚本的三种方式2.4变量的声明2.5变量的引用2.6删除变量 只读变量2.7字符串使用2.8字符串长度及截取2.9脚本参数传递...Shell脚本
这里写目录标题
1.Shell脚本简介
Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务。Shell 既是一种命令语言,又是一种程序设计语言。Shell script 是一种为 shell 编写的脚本程序。Shell 编程一般指 shell脚本编程,不是指开发 shell 自身。Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。Linux 的 Shell 解释器 种类众多,一个系统可以存在多个 shell,可以通过 cat /etc/shells 命令查看系统中安装的 shell解释器。Bash 由于易用和免费,在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
2.Shell
2.1 Shell 脚本的解释器
/bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh
2.2 脚本的编写规范
首行描述解释器 #!/bin/bash
2.3 执行脚本的三种方式
1、bash 脚本名称 脚本参数
2、 sh 脚本名称 脚本参数
3、 ./脚本名称 脚本参数【./脚本名称之间没有空格】【chmod 777 脚本名称】2.4变量的声明
变量名=”值”【中间不能有空格】
变量名要求 字母或下划线或数字(开头不能是数字)构成2.5变量的引用
使用$ 或 ${}引用变量
2.6删除变量 只读变量
删除 unset 变量名
只读 readonly 变量名2.7字符串使用
双引号(””):内部可以使用变量
单引号(‘’):内部所有的原样输出
反引号(``):表示可执行2.8字符串长度及截取
长度: echo ${#skill}
截取: echo ${str:2:2} 【在第二个字符开始截取截取两位】2.9脚本参数传递
bash 脚本名 参数1 参数2 参数3 。。。。。。
脚本内
$0 脚本名称
$1 参数1
$2 参数2
$n 参数n
$* 所有参数
$# 参数的个数2.10算数运算符
加法计算
expr 2 + 2
乘法计算expr 2 \* 2
2.11流程控制if
if [ $a -gt 10 ];then
代码1
elif [ $a -lt 10 ];then
代码2
else 代码3
fi2.12关系运算符
2.13循环
For 循环
For aa in XXXX
do
循环体
doneWhile循环
While 条件 ;
do
循环体
done跳出循环
跳出所有循环 break
跳出当前循环,进入下一次循环 continuecase ()
case 值 in
结果1) 结果1对应的操作;;
结果2) 结果2对应的操作;;
结果3) 结果3对应的操作;;
esac2.14接收控制台数据
read 变量名
函数的使用
函数声明:
[function] 函数名(){
函数体
$参数1
$参数2
$参数3
}函数调用 函数名 参数1 参数2 参数3
2.15数组
数组声明: 数组名称=(元素1 元素2 元素3 元素4)
数组的使用
单个使用 echo 数组名[角标] 【角标从0开始】
遍历数组
for var in ${my_arr[*]}
do
echo $var
done2.16文件加载
在文件中添加 . 脚本名称 或者 source 脚本名称
#!/bin/bash
source ./test1.sh # 加载test1.sh 的文件内容 -
Linux中编写Shell脚本
2018-10-08 11:22:35Shell Shell脚本的执行 Shell脚本编写规范 Shell 中的变量 变量的算术运算 双小括号 (()) 数值运算命令的用法 let 运算命令的用法 expr 命令的用法 br 命令的用法 $[]符号的运算示例 Shell脚本的条件测试 ...目录
测试表达式 test 、[] 、[[]] 、 (()) 的区别
Shell
Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等。 用户每输入一条命令,Shell就执行一条。这种从键盘输入命令,就可以立即得到回应的对话方式,称为交互的方式。
当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序文件就被称为Shell脚本。 在Shell脚本里内置了很多命令、语句及循环控制,然后将这些命令一次性执行完毕,这种通过文件执行脚本的方式称为非交互的方式。 Shell脚本语言很适合用于处理纯文本型的数据,而Linux系统中几乎所有的配置文件、日志文件,以及绝大对数的启动文件都是纯文本类型的文件。
Shell 脚本的类型
Shell脚本语言是弱类型语言(无须定义变量的类型即可使用),在Unix/Linux中主要有两大类shell:
一类是 Bourne shell ,另一类是 C shell- Bourne shell 包括 Bourne shell (sh)、Korn shell(ksh)、Bourne Again Shell 三种类型。
- C shell包括csh、tcsh两种类型
查看系统默认的shell: echo $SHELL
查看系统支持的shell: cat /etc/shellsShell脚本的执行
Shell脚本的执行通常可以采用以下几种方式。
1、bash script-name 或 sh script-name 这是当脚本文件本身没有执行权限时常使用的方法
2、path/script-name 或./script-name 在当前路径下执行脚本,需要将脚本文件的权限改为可执行。然后使用脚本的绝对路径或相对路径就可以直接执行脚本了。
3、source script-name 或 . script-name 这种方法通常是使用source或 “.”(点号)读入或加载指定的Shell脚本文件,然后依次执行指定的Shell脚本中的语句。这些语句将在当前父 shell 脚本进程中执行(其他几种模式都会启用新的进程执行该脚本进程)。
Shell脚本编写规范
Shell脚本的开发规范及习惯非常重要,虽然这些规范不是必须要遵守的,但有了好的规范和习惯,可以大大提升开发效率,并能在后期降低对脚本的维护成本。
1、一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在Linux bash的编程一般为:#!/bin/bash 或 #! /bin/sh bash 与 sh 的区别 , sh 为 bash的软连接,大多数情况下,脚本使用“#!/bin/bash”和“#!/bin/sh”是没有区别的,但更规范的写法是在脚本的开头使用 #!/bin/bash
2、在shell脚本中,跟在 # 后面的内容表示注释,用来对脚本进行注释说明,注释部分不会被当做程序来执行,仅仅是给开发者和使用者看的,系统解释器是看不到的,更不会执行。注释可以自成一行,也可以跟在脚本命令的后面与命令在同一行。 注释尽量不要使用中文,在脚本中最好也不要有中文。
3、Shell脚本的开头会加版本、版权等信息
# Date:16:29 2018-10-20 # Author: Create by xiaoxie # Description: This script function is …… # Version: 1.1
4、在shell脚本中尽量不用中文注释,尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰。
5、Shell脚本的命名应以.sh为扩展名 例如:1.sh
6、成对的符号应尽量一次性写出来,然后退格在符号内增加内容,以防止遗漏。这些成对的符号包括: {}、[]、‘’、“” 等
7、中括号[]两端至少要有1个空格,因此,键入中括号时即留出空格[ ],然后在退格键入中间内容,并确保两端都至少由一个空格。
8、对于流程控制语句,应一次性将格式写完,再添加内容。 如:一次性完成for循环语句的格式
for do 内容 done
9、通过缩进让代码更易读,如:
if 条件内容 then 内容 fi
10、对于常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格,需要强引用的,则用单引号(‘’),如果是命令的引用,则用反引号(``)。
11、脚本中的单引号、双引号及反引号必须为英文状态下的符号。
Shell 中的变量
简单地说,变量就是用一个固定的字符串(也可能是字符、数字等的组合)代替更多、更复杂的内容,该内容里可能还会包含变量、路径、字符串等其他内容。 变量是暂时存储数据的地方及数据标记,所存储的数据存在于内存空间中,通过正确地调用内存中变量的名字就可以读取出与变量对应的数据。
变量的赋值方法为: 先写变量名称,紧接着是 "=" ,最后是值。中间无任何空格。 通过echo命令加上 $变量名,即可输出变量的值。 双引号,以防止出错变量的值一般要加上。
定义变量时变量名建议用大写,如 A=xie B=99
read -p “提示信息” 变量名 #交互式赋值方法
查看变量内容 echo $A 或 echo ${A}
赋值时使用引号的作用
- 双引号:允许通过$符号引用其他变量值
- 单引号:禁止引用其他变量值,$视为普通字符
- 反撇号:命令替换,提取命令执行后的输出结果 全局变量的定义方法 export 变量名
位置参数
位置参数是一种在调用 Shell 程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数。 位置参数之间用空格分隔,Shell取第一个位置参数替换程序文件中的 $1,第二个替换 $2 , 依次类推。$0 是一个特殊变量,它的内容是当前这个shell程序的文件名,所以 $0 不是一个位置参数。
假如我现在有一个 1.sh脚本文件,内容如下
#! /bin/bash echo $1 echo $(($2+$3))
当我执行时,我在文件名后加3个参数
预定义变量
预定义变量和环境变量相类似,也是在Shell一开始就定义的变量,不同的是,用户只能根据shell的定义来使用这些变量,所有预定义变量都是由符号“$”和另一个符号组成。 常见的Shell预定义变量有以下几种。
- $# :位置参数的数量
- $* :所有位置参数的内容
- $? :命令执行后返回的状态,0表示没有错误,非0表示有错误
- $$ :当前进程的进程号
- $! :后台运行的最后一个进程号
- $0 :当前执行的进程名
假如我现在有一个 1.sh脚本文件,内容如下
#! /bin/bash echo $1 echo ${2}+${3} echo $# #打印出位置参数的数量 echo $* #打印出位置参数的内容 echo $? #打印出命令执行后返回的状态 echo $$ #打印出当前进程的进程号 echo $0 #打印出当前进程的进程名
当我执行时,我在文件名后加3个参数
参考文章:Linux中环境变量的设置
变量的算术运算
Shell中常见的算术运算符
Shell 中常见的算术运算命令
双小括号 (()) 数值运算命令的用法
双小括号 (()) 的作用是进行数值运算与数值比较,它的效率很高,用法灵活,是Linux下常用的运算操作符。其操作方法如下:
let 运算命令的用法
let运算命令的语法格式为: let 赋值表达式
let 赋值表达式的功能等同于“((赋值表达式))” 范例: 给变量 i 加8
expr 命令的用法
1、expr 用于运算
语法:expr 表达式
范例:expr 2 + 2 ; expr 2 – 2 ; expr 2 \* 2 ; expr 2 / 2
注意:运算符号和数字之间要有空格!!2、expr配合变量计算
expr在Shell中可配合变量进行计算,但需要用反引号将计算表达式括起来。
3、利用 expr 计算字符串的长度
br 命令的用法
bc 是UNIX/Linux下的计算器,除了作为计算器来使用,还可以作为命令行计算工具使用
交互模式 在shell命令行直接输入 bc 及能进入bc语言的交互模式
bc也可以进行非交互式的运算,方法是与 echo 一起使用,所以我们就可以写在脚本里面
$[] 符号的运算示例
Shell脚本的条件测试
通常,在shell的各种条件结构和流程控制结构中都要进行各种测试,然后根据测试结果执行不同的操作,有时候也会与 if 等条件语句相结合,来完成测试判断,以减少程序运行错误。
几种条件测试语句
文件测试操作符
常用文件测试操作符 说明 -d , d的全拼为 directory 文件存在且为目录则为真 -f , f的全拼为 file 文件存在且为文件则为真 -e , e的全拼为 exists 文件存在则为真 -s ,s的全拼为 size 文件存在且大小不为0则为真 -r ,r的全拼为 read 文件存在且可读则为真 -w ,w的全拼为write 文件存在且可写则为真 -x ,x的全拼为executable 文件存在且可执行则为真 -L ,L的全拼为link 文件存在且为链接文件则为真 f1 -nt f2 ,nt的全拼为 newer than 文件f1比文件f2新则为真 f1 -ot f2 ,ot的全拼为older than 文件f1比文件f2旧则为真 注:(())不能用于文件测试,文件测试一般常用的是 []
字符串测试操作符
常用字符串测试操作符 说明 -n 若字符串长度不为0,则为真 -z 若字符串长度为0,则为真 “字符串1” == “字符串2” 若字符串1等于字符串2,则为真 “字符串1” != “字符串2” 若字符串1不等于字符串2,则为真 注: == 和 != 两端要有空格 ,(())不能用于字符测试
整数二元比较操作符
在[]以及test中使用的比较符号 在(())和[[]]中使用的比较符号 说明 -eq == 或 = 相等,全拼为 equal -ne != 不相等,全拼为 not equal
-gt > 大于,全拼为 greater than -ge >= 大于等于,全拼为 greater equal -lt < 小于,全拼为 less than -le <= 小于等于 ,全拼为less equal - "="和"!="也可以在[]中作比较使用,但在[]中使用包含"<"和">"的符号时,需要用反斜线转义,有时不转义虽然语法不会报错,但是结果可能不对。
- 也可以在[[]]中使用包含“-gt”和“-lt”的符号,但是不建议使用
- 比较符号两端也要有空格,[] (()) [[]] 两端都要有空格
逻辑操作符
在[]和test中使用的操作符 在[[]]和(())中使用的操作符 说明 -a && and ,与,两端都为真,才为真 -o || or ,或, 两端有一个为真,就为真 ! ! not ,非, 两端相反,则结果为真 测试表达式 test 、[] 、[[]] 、 (()) 的区别
测试表达式符号 test [] [[]] (()) 边界是否需要空格 需要 需要 需要 不需要 逻辑操作符 ! 、-a、 -o ! 、-a、 -o ! 、&& 、 || ! 、&& 、 || 整数比较操作符 -eq 、 -gt 、-lt、-ge 、-le -eq 、 -gt 、-lt、-ge 、-le -eq 、 -gt 、-lt、-ge 、-le 或 = 、> 、< 、 >= 、 <= = 、> 、< 、 >= 、 <= 字符串比较操作符 = 、 == 、!= = 、 == 、!= = 、 == 、!= 不支持 文件操作 -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot 不支持 是否支持通配符匹配 不支持
不支持 支持 不支持 if 条件判断语句
#####单条件判断############## if 条件判断 then 命令 else 命令 fi #或 if 条件判断;then 命令 else 命令 fi
###双条件判断##### if 条件判断 then 命令 elif 条件判断 then 命令 else 命令 fi ##或 if 条件判断;then 命令 elif 条件判断;then 命令 else 命令 fi
if语句对于字符串的匹配
case 条件判断语句
case条件语句相当于多分支的if/elif/ellse条件语句,但是它比这些条件语句看起来更规范更工整,常被应用于实现系统服务启动脚本等企业应用场景中。
case 变量 in one) 命令 ;; two) 命令 ;; *) 命令 esac
for循环语句
for 条件 do 命令 done ##或 for 条件;do 命令 done
while循环语句
while 条件 do 命令 done
Break、Continue、exit 循环控制语句
break 、continue在条件语句及循环语句(for、while、if等)中用于控制程序走向;而exit则用于终止所有语句并退出当前脚本。
命令 说明 break n 如果省略 n ,则表示跳出整个循环,n 表示跳出循环的成熟 continue n 如果省略 n ,则表示跳过本次循环,忽略本次循环的剩余代码,进行循环的下一次循环。n表示退到第 n 层继续循环 exit n 退出当前 shell 程序,n 为上一次程序执行的状态返回值。n 也可以省略,在下一个 shell 里可通过 $? 接收 exit n 的n值 Shell脚本执行scrapy爬虫和python脚本
#! /bin/bash cd /opt/project/ scrapy crawl xx python3 test.py
-
IDEA中编写并运行shell脚本
2018-07-31 09:25:37IEDA中的bashsupport插件支持在IDEA中编写shell脚本文件,有友好的代码格式,支持自动补全,检查错误,并且配置完之后,还可以在IEDA中直接运行shell脚本。下面将一步一步演示插件的安装和配置。 打开IEDA,安装... -
Shell 脚本的详细解读 (一)
2020-10-14 18:05:57Shell概述 Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核 Shell还是一个功能强大的编程语言,易编写,易调试,灵活性强 Shell解析器 Linux提供的Shell解析器 # Linux中shell... -
shell编程
2019-08-05 21:06:35什么是shell编程 高大上的解释,往往让人摸不住头脑。一句话概括就是:shell编程就是对一堆Linux命令的逻辑化处理。 为什么要会shell编程 就是批处理动作,解放双手,避免重复性劳动。 第一个... -
shell脚本打印日志方法
2015-11-24 22:02:16博客:http://blog.csdn.net/wylfengyujiancheng在shell脚本执行过程中如果没有日志记录,特别是脚本比较长的情况下在执行完再定位问题很难发现问题原因,因此在脚本中增加日志显得十分重要。下面介绍日志打印方法... -
shell 参数换行 & shell 输出换行的方法
2019-08-21 10:23:301. shell 参数换行 Linux参数太长,一般可取续行符 "\"进行参数换行/续行。反斜杠\ 后面紧跟回车,表示下一行是当前行的续行. 如下的代码所示 python target_attack.py \ --input_dir="${INPUT_DIR}" \ --output_... -
什么是shell和shell编程
2018-04-10 22:58:021.什么是shell? shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。 说到底,Shell是用户与内核进行交互操作的一种接口... -
[shell]shell简介
2018-07-11 12:02:21一、简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核... -
【Shell】Shell入门解析
2020-06-02 23:11:49一、Shell概述 为什么要学习Shell呢? 1)需要看懂运维人员编写的Shell程序 2)编写一些简单Shell程序来管理集群、提高开发效率 Shell解析器 1)Linux提供的Shell解析器有: cat /etc/shells /bin/sh /bin/bash ... -
交互式SHELL和非交互式SHELL、登录SHELL和非登录SHELL的区别
2016-07-27 11:05:57曾经写过“交互式shell和非交互式shell、登录shell和非登录shell的区别”,但那时理解相对更浅一些,现在多了一点认识,把这篇文章稍微完善一下吧。 交互式shell和非交互式shell、登录shell和非登录shell的区别。... -
每天一个shell小知识(shell变量)
2020-09-23 10:39:44目录shell变量自定义变量:变量定义/查看变量赋值的特殊操作:双引号单引号反撇号设置变量的作用范围:特殊变量---环境变量:位置变量:预定义变量: shell变量 在各种shell中都使用到了“变量”的概念。Shell变量... -
Shell编程基础
2019-04-20 00:09:14Shell编程基础(一) 如果经常使用linux系统,不会点shell编程,很难让你工作高效起来。我觉得shell脚本是这个世界上最简单的脚本语言。 学习shell,你无需搭建相关开发环境,只要有一台linux服务器即可。下面通过... -
Shell 概述
2016-08-26 00:29:57简介Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 ... -
什么是shell?shell的用途是啥?
2019-07-02 17:58:07场景:只知道写shell脚本,却不知道什么是shell?那shell是什么呢?找到了之前在腾讯课堂上看的视频,这是课件笔记 你学Linux的话,不懂shell等同于不懂linux shell是操作系统的最外层,shell可以合并编程语言以... -
shell基础练习
2018-02-14 16:58:53shell基础练习 1、编写shell脚本,实现1-100的猜数字游戏。 #!/bin/bash ##RANDOM随机函数,100取余就可以获得1-100的随机整数 n=$[$RANDOM%100] while : do read -p "请输入一个1-100间的整数:" n1 n2=`... -
深入浅出理解交互式shell和非交互式shell、登录shell和非登录shell的区别
2018-01-24 20:59:25首先我们需要把bash理解为一种模式,我们不如把这种模式想象成类似于洋葱一样的结构,我们可以一层一层剥开,也就是说我们可以一层一层的进入子shell。就好比我们进入一栋楼,打开一个房间是一个环境,在当前这个... -
Django manage shell 到底做了什么?
2019-07-26 22:33:55Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句。 通过如下命令进入shell python manage.py shell 那么,如果不使用... -
shell 数组遍历的3种方法
2017-07-07 09:03:32shell数组 shell array shell数组遍历 shell数组循环 -
登录shell和非登录shell
2018-05-19 19:14:25什么是登录shell: 登录shell是可以用户登录使用的,比如/bin/bash ,/bin/sh ,/bin/csh......一般 Linux默认的用户shell都是bash,也就是你可以登录进去写命令。 非登录shell:经典的/bin/nologin就是一个非登录... -
shell 里 awk print 的用法
2018-07-30 13:19:56shell 里 awk print 的用法 备忘:shell 里 awk print 的用法 -
shell | LiteOS 物联网操作系统中的 shell 组件使用分享
2020-01-24 13:34:561. 为什么使用shell组件 2. LiteOS中的shell组件 源码 LiteOS中的shell组件源码如图: 组件自动初始化 使用方法 3. shell组件使用示例 -
常用shell(1):shell获取系统当前时间戳
2017-08-13 00:36:271. shell脚本如下current=`date "+%Y-%m-%d %H:%M:%S"` timeStamp=`date -d "$current" +%s` #将current转换为时间戳,精确到毫秒 currentTimeStamp=$((timeStamp*1000+`date "+%N&... -
shell进程
2018-06-07 15:55:17shell进程1.1 shell的基本概念 shell做为一种和Linux系统的特殊交互式工具,为用户提供了启动程序、管理文件系统中的文件及运行在Linux上的进程的途径。shell通过解析输入的文本命令,在内核中执行来达到与系统交互... -
Shell语言
2017-11-21 01:03:46Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的... -
【Shell】shell判断星期
2019-01-11 17:39:07shell判断今天是星期几 由于某些原因,需要在自动化执行的脚本中,对星期几进行判断。并在固定的日子,搞事情。 shell当前日期是星期几 WEEK_DAY=$(date +%w) echo $WEEK_DAY 判断星期几搞事情 WEEK... -
Impala-shell命令参数
2019-12-10 20:06:19impala-shell外部命令2. impala-shell内部命令 1. impala-shell外部命令 所谓的外部命令指的是不需要进入到impala-shell交互命令行当中即可执行的命令参数。impala-shell后面执行的时候可以带很多参数。你可以在...
-
K210官方例程ICM陀螺仪驱动中一处错误
-
Java虚拟机向ARM平台的移植.pdf
-
算法导论二(排序和顺序统计量)——编程大牛的必经之路
-
2010-2020年暨南大学820数字电子技术考研真题
-
vscode+vue cli3.0创建项目配置Prettier+eslint
-
springboot集成mybatis Plus实现逻辑删除功能
-
遍历集合的方法
-
【数据分析-随到随学】机器学习模型及应用
-
图解计算机结构与体系分类!!
-
UE4游戏逆向与安全+FPS游戏逆向与安全
-
Java无损导出及转换word文档
-
JRebel 2020.1.0.1.rar
-
数据结构-链表
-
Windows batch echo 命令换行
-
Kotlin协程极简入门与解密
-
易语言开发通达信DLL公式接口
-
Excel高级图表技巧
-
LR预测CTR数据集data.zip
-
Qt and Qt Charts
-
三维地图GIS大数据可视化