linux shell入门
一、什么是shell
用户想要做一件事,比如打开一个文件,在windows上可以双击,在linux上,如果有图形界面可以点击图标启动,大多数都是命令行运行的。运行一个命令时,比如运行vim file会将命令传到操作系统内核,调用操作系统的api来进行相关操作。shell就是用户和操作系统之间的一个程序,将用户输入的命令传给操作系统执行,然后将执行结果或者出错信息输出到控制台反馈给用户。
二、shell的类型
不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是/bin/bash,流行的shell有sh,ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途。
sh
sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。
sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。
bash
bash全称是Bourne Again shell,大多数Linux系统默认使用的shell,bash shell是 Bourne shell 的一个免费版本,它是最早的 Unix shell
sh和bash的区别参考https://blog.csdn.net/qq_37687594/article/details/109005613?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-109005613-blog-116882211.pc_relevant_aa_2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-109005613-blog-116882211.pc_relevant_aa_2&utm_relevant_index=2
csh
C shell使用的是“类C”语法,csh是具有C语言风格的一种shell。
ksh
是AT&T Bell实验室的David Korn开发的,共有42 条内部命令,它集合了C Shell和Bourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。
tcsh
tcsh是csh的增强版,与 C shell 完全兼容
zsh
是Linux 最大的Shell之一,由Paul Falstad完成,共有84 个内部命令。如果只是一般的用途,没有必要安装这样的Shell
ash
ash Shell是由Kenneth Almquist编写的,是Linux 中占用系统资源最少的一个小Shell,它只包含24个内部命令,因而使用起来很不方便。
三、shell脚本基础
在创建shell脚本文件时,必须在文件的第一行指定要使用的shell。其格式为:
!/bin/bash
在通常的shell脚本中,井号(# )用作注释行。 shell并不会处理shell脚本中的注释行。然而shell脚本文件的第一行是个例外,#后面的惊叹号会告诉shell用哪个shell来运行脚本。
执行shell的方式:
1、sh shell脚本路径
2、shell脚本路径(需要执行权限)
3、将shell脚本所在目录加入PATH路径,然后输入脚本名
脚本需要执行权限
echo
向控制台输出消息。
如果要输出的消息里面存在引号,则会出问题:
可用单引号或双引号来划定文本字符 串。如果在字符串中用到了它们,你需要在文本 中使用其中一种引号,而用另外一种来将字符串 划定起来。
想把文本字符串和命令输出显示在同一行中,用echo语句的-n参数
变量
使用环境变量
如果要在输出中显示\(则用\$将\)进行转义。
用户变量
用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量Var1和变量var1是不同的。
使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格。shell脚本会自动决定变量值的数据类型。
引用一个变量值时需要使用美元符,而引用变量来对其进行赋值时则不要使用美元符:
将命令输出赋值给变量:命令替换会创建一个子shell来运行对应的命令。
1、使用反引号`
2、使用$()
在命令行提示符下使用路径./运行命令的话,也会创建出子shell;要是运行命令的时候不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。
输出重定向
command > outputfile
将command的输出保存到指定文件中。如果输出文件已经存在了,重定向操作符会用新的文件数据覆盖已有文件。
使用>>将命令结果追加到指定的文件中。
输入重定向
输入重定向将文件的内容重定向到命令。
command < inputfile
wc命令可以对对数据中的文本进行计数。默认情况下,它会输出3个值:
- 文本的行数
- 文本的词数
- 文本的字节数
内联输入重定向:<<
这种方法无需使用文件进行重定向,只需要在命令行中指定 用于输入重定向的数据就可以了。你必须指定一个文本标记来划分输入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致.
管道:将一个命令的输出作为另一个命令的输入
Linux系统实际上会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据传输不会用到任何中间文件或缓冲区。
执行数学运算
- expr命令
运算符的左右要加空格。乘号要转义。
- 使用方括号
bash shell数学运算符只支持整数运算。 z shell(zsh)提供了完整的浮点数算术操作。
浮点数解决方案:
bc:内建的bash计算器
浮点运算是由内建变量scale控制的。必须将这个值设置为你希望在计算结果中保留的小数位数,否则无法得到期望的结果。scale变量的默认值是0。
使用内联重定向输入:
variable=$(bc << EOF options statements expressions EOF )
#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc<<EOF
scale=4
a1=$var1*$var2
b1=$var3*$var4
a1+b1
EOF
)
echo $var5
shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态码是一个0~255的整数值,在命令结束运行时由命令传给shell。可以捕获这个值并在脚本中使用。
Linux提供了一个专门的变量\(? 来保存上个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用\)? 变量。它的值会变成由shell所执行的最后一条命令的退出状态码。
一个成功结束的命令的退出状态码是0 。如果一个命令结束时有错误,退出状态码就是一个正数值。
默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出。exit命令允许你在脚本结束时指定一个退出状态码。
#!/bin/bash
var1=10
var2=30
var3=$[$var1+$var2]
echo $var3
exit 5
退出状态码的范围是0-255:
#!/bin/bash
var1=30
var2=10
var3=$[$var1*$var2]
exit $var3
超出后与256取模得到结果