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取模得到结果

posted @ 2022-08-28 16:45  shigp1  阅读(287)  评论(0编辑  收藏  举报