Linux shell 基础知识和命令

编程语言

什么是编程语言?

  语言是用来沟通的,编程语言就是人和计算机沟通的语言。

什么是编程?

  编程就是程序员把自己想让计算机做的事情,用编程语言给表达出来。

  所以编程分两个环节:

    1.先要想清楚做事的步骤

    2.再用编程语言把做事的步骤翻译下来

为何要编程?

  为了让计算机能够按人类的思维逻辑(人类编写的程序)去工作,从而把人类解放出来。

什么是程序?

  编程的结果就是程序,具体来说程序就是一个或多个代码文件。

    整个程序就一个文件(实现的功能相对简单,代码量少),称之为脚本。

    整个程序由很多文件夹组织了很多文件,称之为软件。

什么是进程?

  进程指的是一个程序的运行过程,或者说一个正在运行的程序。

编程语言分类

  机器语言:用计算机能听懂的二进制指令去编写程序。

    优点:执行效率最高

    缺点:难记易错,开发效率最低

  汇编语言:用英文标签代替二进制指令去写程序。

     优点:开发效率略高于机器语言

     缺点:相比机器语言来说执行效率略低,开发效率依然很低

  高级语言:站在人能理解的表达方式,计算机需要翻译才能理解执行,按照翻译方式不同又分为两大类:

    编译型(c、go)

      源代码------>编译器(类似于谷歌翻译)------->可执行的二进制指令

      特点:

      拿到编译结果之后,第二次不需要再编译,直接拿着上次翻译的结果执行即可

    解释型(shell、python)

      源代码------>解释器(类似于同声传译)------->可执行的二进制指令

      特点:

      每次执行都需要让解释器解释执行(读一行解释一行然后执行)   

   开发效率:

    高级语言>汇编语言>机器语言

   执行效率:

    机器语言>汇编语言>高级语言(编译型>解释型)

shell

1、什么是shell?

单说shell有两层意思:

  1、shell编程语言

  2、shell解释器:专门负责解释执行shell编程语言的语法规则

    shell解释器种类:

      bash

      sh

平台与跨平台
  有了硬件又有了操作系统这台计算机就可以运行起来了,运行起来干的是就是在操作系统之上安装各种各样的应用程序去使用这台计算机,
  单独给你一个硬件你用不了,单独给你一个操作系统你也不能运行在空气之中啊,所以操作系统和硬件他两结合到一起就变成一台可以运行各种应用程序的计算机了,所以我们把他们俩加到一起统称为平台。
  这个平台放上层的应用程序,应用程序开发的好不好有一个非常重要的指标就是跨平台性。跨平台性就是应用程序在不平的平台可以跑起来。
  我们要操作操作系统,有人在操作系统之上封装了一个应用程序叫shell解释器,shell解释器是对操作系统复杂接口的封装,封装完之后提供一些列可以的命令,我们敲的命令都是交给shell解释器帮我们解释的。

2、为什么要用shell?

  • 自动备份
  • 自动部署
  • 监控脚本

3、shell程序可以在两个地方写

  交互式环境

    优点:每敲一条命令立即得到结果,然后执行下一条命令。

    缺点:无法永久保存。

  脚本

    优点:永久保存命令,重复执行。

    缺点:无法单纯测试某条命令的运行结果。

4、shell脚本

  编写shell脚本:vi /scripts/my_first.sh

#!/bin/bash
#My first script


ls -l .*

  保存文件,这里将其命名为 my_first.sh。

  脚本的第一行是最重要的。它告诉shell使用什么程序解释脚本。指定解释器 /bin/bash(Linux系统默认)。文件代码还可能是Python或者c..等其它语言。

  脚本的第二行是一个注释。每一行中出现在“#”符号后的任何内容都将被Bash忽略。一旦脚本变得很大切很复杂,注释将是极其重要的。程序员用注释来解释代码的用途,以方便其他程序员查看代码。

  脚本的最后一行是ls命令,它将列出当前目录下所有一点开头的文件和目录(即所有隐藏文件和目录)。

 

  执行shell脚本的四种方式:

    启动了一个子bash进程,在子bash进程执行

      绝对路径:/scripts/my_first.sh

      相对路径: ./my_first.sh 

      bash解释器+脚本文件的路径:bash /scripts/my_first.sh

    直接在当前bash进程执行:(source是把目标文件复制粘贴到当前环境,然后执行)

      source /scripts/my_first.sh 或者. /scripts/my_first.sh

 

  bash解释器是c语言开发的,它解释执行文件的过程是:打开文件读一行执行一行,读到“#”开头的就不管了,bash解释器得读文件内容才能执行。

读文件就涉及到权限问题:chmod 755 my_first.sh

  绝对路径首先得保证等cd切换进去,对沿途文件夹都有执行权限x,对目标文件得有读写权限rw。

  相对路径需要的权限也是。

  bash解释器+脚本文件的路径,需要对bash执行权限,对脚本来说,沿途的文件夹需要执行权限,对目标文件需要读权限。

  source /scripts/my_first.sh  对沿途文件需要有执行权限,对目标文件需要有读权限

 

5、shell脚本debug调试  

  查看一个脚本的执行过程:

sh -vx /scripts/my_first.sh

  调试某几行:set -x  set +x

  只检测语法:

sh -n /scripts/my_first.sh 

  拿到本地先测试

 

6、shell编程规范

脚本目录统一,可以针对不同功能建不同的子文件夹。
shell脚本的结尾建议以.sh结尾
脚本开头要有指定解释器如#!/bin/bash 或者 #!/usr/bin/env bash
脚本开头注意加时间、作者、联系邮箱、脚本作者等信息
关键代码上加注释

代码编写好习惯:

  • 成对的括号尽量一次性写出来,防止遗漏
  • 括号保留空格习惯
  • 流程控制语句一次性书写完再添加内容
  • 代码缩进提高可读性

 

7、shell变量

什么是变量?

量指的是事物的状态。

变指的是事物的状态是可以发生变化的。

变量是一种把事物的状态(年龄、性别、等级、薪资、爱好等等)记录下来的机制(内存),并且记录的状态可以发生变化。
变量是一种把数据存取到内存的机制。

为何要有变量?

为了让计算机能够像人一样去记住事物的状态,并且状态可以变化
程序=数据+功能

如何用变量?
先定义

定义变量由三大部分构成:
    变量名=变量值 #注意=左右两边不能有空格    
    varName即变量名,varValue是即变量值是赋予varName的值。如果没有给出varValue,即变量varName会被赋予一个空字符串。
    比如定义一个变量:cpu_free=$(vmstat 1 5 |awk 'NR==5{print $(NF-2)}') 
    变量的本质是一种内存管理机制,系统会在内存中开辟一块空间,将数值$(vmstat 1 5 |awk 'NR==5{print $(NF-2)}')存储其中,
    并以cpu_free 作为访问空间的唯一标识。这种名称-数据的映射关系。
    
    变量的命名规则:
        大前提必须遵循见名知意。
        变量名可以包含字母、数字和下划线,但首字符必须是字母或下划线。
        不要使用“?”“*”和其它特殊字符命名变量。
        不要使用自带的关键字。
    变量名的风格:
        驼峰体 比如:ageOfZrg=30
        纯小写字母加下划线 比如:age_of_zrg=30    

    
    变量值有三种来源:
        直接赋值 
        通过位置参数获取命令行传过入的变量值 其中$0取的值是脚本本身的名字,$10要写成这样${10}
        接收用户输入的变量值 比如 read -p "请输入你的名字: " name        

后引用

 

可以把任意字符集和赋值给一个变量。例如,将字符串zrg赋值给username:

username=zrg

或者:

username="zrg"

将一个数字赋值给变量:

var=1

需要注意:shell的默认赋值是字符串赋值,例如接下来的操作:

[root@localhost.localdomain ~]# var=$var+1
[root@localhost.localdomain ~]# echo $var
1+1

此时的变量值是“1+1”,而并不是“2”,在bash中,如果将算数表达式的数值赋值给一个变量,则可以使用let命令:

[root@localhost.localdomain ~]# let var=2+1
[root@localhost.localdomain ~]# echo $var
3

将一个变量的值直接赋值给另一个变量:

[root@localhost.localdomain ~]# a=3
[root@localhost.localdomain ~]# b=$a
[root@localhost.localdomain ~]# echo $b
3

将命令的执行结果赋值给变量:

[root@localhost.localdomain ~]# var=`pwd`
[root@localhost.localdomain ~]# echo $var
/root

也可以使用$(...)来实现同样的功能:

[root@localhost.localdomain ~]# var=$(pwd)
[root@localhost.localdomain ~]# echo $var
/root

将bash的内置命令 read 读入的内容赋值给变量:

[root@localhost.localdomain ~]# echo -n "Enter var:"; read var
Enter var:121352
[root@localhost.localdomain ~]# echo $var
121352

在上例中,echo -n "Enter var:"语句是打印内容Enter var:并且不换行,紧接着从标准输入读入内容,在这里输入“121352”后按enter键,read命令将读入的内容赋值给 var ,即在输出结果中看到的var 的值是121352。

           

echo(shell)和printf(c)命令打印变量的值
echo命令显示变量的值,
echo -e是转义特殊符号
格式化输出:echo "my name is $name,my age is $age"

printf更通用。
[root@localhost.localdomain ~]# var=123
[root@localhost.localdomain ~]# printf "%s\n" $var
123
格式化输出:printf "my name: %s my age: %s\n" $name $age

 

预定义变量-特殊符号

$n

$是取值的意思,真正的特殊变量是$后面的。

$*

可以取到所有命令行传进来的位置参数,不包括$0。

$@

可以取到所有命令行传进来的位置参数,不包括$0。

$*和$@的区别:"$@"可以把位置参数传过来的当成一个。

$#

获取命令行传进来的位置参数的个数(不包括$0)。

这些的作用可以做定制化。

$$

获取当前进程自己的pid号。

$PPID

获取当前进程的父进程的id号。

$?

获取上一条命令的运行成功与否的标志,0带边成功,非0代表失败。

!$

取上一条命令的参数部分。

$!

取上一条命令的进程pid。

常量

变量:不变的量。

定义常量:

x=1
readonly x

reanonly x=11

通常纯大写的就

 

变量值的类型---数据类型

为何要有类型

  变量值是用来记录事物状态的,而事物的状态是分成多种多样的

  例如:年龄、薪资、性别、名字...

  针对不同类型的状态对应着就应该用不同类型的值去记录

 

强类型:数据类型不可以被忽略,不同类型之间不能混用。

弱类型:数据类型没有明边界,有的数据类型可以混用。

静态类型:定义变量时需要声明变量的类型,即在程序执行之前变量的类型就已经确定下来了。

动态类型:定义变量时不需要申明变量的类型,即需要在执行到具体代码的时候才能识别变量的类型。

总结:shell是一门解释型、弱类型、动态型的编程语言。Python是一门解释型、强类型、动态型的编程语言。go是一门编译型、弱类型、静态语言。

 

基本数据类型

数字:

  整型

  浮点型:计算要借助bc工具

字符串:定义在引号类的一串字符。空格也算字符。

  单引号:硬引用,会取消掉特殊符号的意义。

  双引号:软引用,特殊符号会有意义。

数组:一系列元素的集合。

  普通数组:

    四种定义方式:

      array(空格分隔开多个元素),用索引对应着值。

      array1(空格分隔开多个元素,但每个元素用中括号写上索引)

      array3[写索引]=值

      array4=(反引号里写命令),就是把命令的值当数组。

 

  关联数组:可以用字符串对应值

declare -A info
info["name"]="zrg"
info["age"]=18

取数组的值:根据索引取值。

[root@localhost.localdomain ~]# echo ${array3[2]}
2.sh
[root@localhost.localdomain ~]# echo ${info["name"]}
zrg
declare -a
declare -A 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

张仁国

posted @ 2025-05-30 15:38  张仁国  阅读(23)  评论(0)    收藏  举报
目录代码