当前位置: 首页 > news >正文

linux Shell入门

文章目录

一、初始shell

(1)什么是shell?

(2)什么是变量?

(3)程序和进程的区别?

二、语言

(1)计算能理解的语言是什么呢 ?

(2)什么是编程?

(3)低级语言

(4)高级语言   

(5)语言总结

三、Shell 定义

(1)shell的含义

(2) Shell 在Linux中的存在形式  

(3)Shell 如何执行用户的指令   

四、Shell 分类

五、Shell 适用场景

六、Bash 初始化

(1)什么是变量?

(2)什么是环境变量?

 (3)Bash 环境变量文件的加载

为什么叫用户登录脚本?

(4)变量文件的分类

编写脚本 添加账户zhangsan,


一、初始shell

  我们其实每天都在用shell,每天都打开一个终端,在终端里敲命令,终端和shell是两码事。

终端是虚拟终端 ,打开终端的同时会开启一个shell,shell是一个程序,平时敲的都是英文,那些英文计算机本身是不能直接认识它的,因为内核认识的是c语言的代码,最终硬件执行的时候还会变成0和1,从敲命令的那一刻开始,内核根本不知道敲了什么。找bash翻译一下。bash 是一种具体的shell 平时说的shell是统称,  bash当作一个翻译,把那些命令(ls,cd)翻译成c语言代码,传给内核,内核再把代码解析,最终硬件执行的是0和1。

平时打开终端的时候,前面展示出来的都是bash的东西,叫做环境变量,环境变量就是bash的一部分,平时敲的命令如果放在一个文件里执行就是脚本。但是跟人类进行交互的命令不能写在shell脚本里比如passwd    vim  ,非交互式命令 可以直接写到shell脚本里面

(1)什么是shell?

 是一个命令解释器。(解释给内核) shell本身也是程序  只要打开终端就会带着一个shell,平时敲的命令都是由shell解释的,并不是由终端解释的。终端只是存放shell的一个载体。就是我们需要一个物件来开一个shell,真正解释命令的是shell。

(2)什么是变量?

比如:要添加100个账户,名字是user1,user2,--user100。得手写到100,这里面唯一变化的是数字,假如数字能自动从1变到100就好了,只需要用一个变量来存储这些数字,让他们自动添加。

循环

判断

函数 保存功能

数组(不重要)(c语言里重要)

(3)程序和进程的区别?

程序是静态的, 本质是文件

进程是动态的,是程序运行起来之后的呈现。

二、语言

(1)计算能理解的语言是什么呢 ?

  计算机只能理解2进制,0101010...,总不能人肉输入一堆二进制给计算机(虽然最原始的计算机就是这么干的)让它工作吧,这样开发速度太慢了。所以最好的办法就是人输入简单的指令,计算机能把指令转成二进制进行执行。

(2)什么是编程?

它就是一个缩写,全称叫做编写程序,用编程语言编写程序文件。编程 是个动词,编程==写代码,写代码为了什么? 为了让计算机干你想要干的事情

从低到高排序的

(3)低级语言

纸袋   (最开始的时候  把0和1输给计算机用纸条看见打孔的给1没打给0 后来出现汇编)

汇编   (它能简单的把人类想要表达的0和1稍微快点的输入计算机,把想要表达的语言写到纸袋里)然后就有了c语言。

(4)高级语言   

编译型   

 写源代码--编译--执行     (写好的源代码是不能执行的需要编译成可执行文件)先编译才能运行

C语言    c语言开始,就属于高级语言了很容易被看懂  比如 if ,c语言之后c++

C++    (面向对象)

(平时需要编译安装的源码包文件不可能是脚本因为脚本不需要编译)不需要提前编译

面向对象的语言

Java   

解释性 (或称脚本语言)   事先不需要编译

 写源代码—执行(编译)                                                                   

perl

python

Php

shell (shell不是面向对象)

(5)语言总结

编程语言总体分以为:机器语言、汇编语言、高级语言

机器语言(0和1)

优点是最底层,速度最快,缺点是最复杂,开发效率最低

汇编语言

优点是比较底层,速度最快,缺点是复杂,开发效率最低

高级语言

编译型语言执行速度快,不依赖语言环境运行,跨平台差

解释型跨平台好,一份代码,到处使用,缺点是执行速度慢,依赖解释器运行

三、Shell 定义

 硬件上装—os操作系统里装软件—app—

应用想和硬件打交道都是通过操作系统交互的,有一种app叫shell(只是各种app的一大类,shell也是app,负责人和计算机操作系统交互的)shell有很多种,平时用的都是bash。

(1)shell的含义

首先Shell英文含义是“壳”;它是相对于内核来说的,因为它是建立在内核的基础上,面向于用户的一种表现形式,比如我们看到一个球,见到的是它的壳,而非核。Linux中的Shell,是指一个面向用户的命令接口,表现形式就是一个可以由用户录入的界面,这个界面也可以反馈运行信息.

(2) Shell 在Linux中的存在形式  

由于Linux不同于Windows,Linux是内核与界面分离的,它可以脱离图形界面而单独运行,同样也可以在内核的基础上运行图形化的桌面。  这样,在Linux系统中,就出现了两种Shell表现形式,一种是在无图形界面下的终端运行环境下的Shell,另一种是桌面上运行的类似Windows 的MS-DOS运行窗口,前者我们一般习惯性地简称为终端,后者一般直接称为Shell。

(3)Shell 如何执行用户的指令   

Shell有两种执行指令的方式

1.命令行  

平时执行命令都是shell指令

2.脚本的方式

随便编写一个文件,只要写的是shell命令,就是脚本文件。平时在写shell脚本的时候,都会在后面写一个.sh,是给自己看的。

四、Shell 分类

shell是一个大类,里边有很多具体的shell,bash就是其中最重要的一个。99%的生涯要用bash,1%可能用小型机。Linux中默认的Shell是/bin/bash,流行的Shell有ash、bash、ksh、csh、zsh等,不同的Shell都有自己的特点以及用途。

1、Bash

大多数Linux系统默认使用的Shell,bash Shell是Bourne Shell 的一个免费版本,它是最早的Unix Shell,bash还有一个特点,可以通过help命令 来查看帮助。包含的功能几乎可以涵盖Shell所具有的功能,所以一般的Shell脚本都会指定它为执行路径。

2、Csh

C Shell 使用的是“类C”语法,csh是具有C语言风格的一种Shell,其内部命令有52个,较为庞大。目前使用的并不多,已经被/bin/tcsh所取代

3、Ksh

Korn Shell 的语法与Bourne Shell相同,同时具备了C Shell的易用特点。许多安装脚本都使用ksh,ksh 有42条内部命令,与bash相比有一定的限制性

4、TCsh

tcsh是csh的增强版,与C Shell完全兼容。

5、Sh

是一个快捷方式,已经被/bin/bash所取代。

6、Nologin

指用户不能登录

7、Zsh

目前Linux里最庞大的一种 zsh。它有84个内部命令,使用起来也比较复杂。一般情况下,不会使用该Shell。在终端输入zsh直接就进去了,家目录在外面。exit退出。

五、Shell 适用场景

系统管理自动化运维系统管理

在你的操作系统中所有非交互式的操作shell全都能干

  1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...)
  2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
  3. 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
  4. 日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk)
  5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
  6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)
  7. 自动化信息采集及监控程序(收集系统/应 用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  8. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  9. 自动化扩容(增加云主机-->业务上线)
  10. Zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)
  11. 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
  12. Shell可以做任何事(一切取决于业务需求)

六、Bash 初始化

(1)什么是变量?

变量名称=值

变量本身有名字,需要给它赋一个值=,=右边就是赋值给变量的值,将来想用值的时候,直接用变量的名称就可以了。

例如:打印5, 可以 echo 5

假装shell脚本里有好多5,写了一个脚本,

vim a.sh

echo 5 

echo hello5 

cd /etc5 

好多命令都带个5,想把5修改成6。假如5在脚本里出现了100次,就要找到这100个5很难。可以先把5赋值给一个变量,变量的名字现在随便起。

var=5

echo $var

echo hello $var

cd /etc$var 

$在shell里是取变量值的符号,在变量前面加一个$,就表示我要使用它的值,将来要想去改5,就不用一个一个去找到改5了,有一万个也只需改一次。就改成var=6就可以了。

(2)什么是环境变量?

环境变量也是变量的一种,只不过是把类分的更细了一点。修饰用户工作环境的变量,简称环境变量。为什么是用户的工作环境?因为是在终端上操作,终端就是我的工作环境。

有没有环境变量系统都能工作,都能去操作系统,有了环境变量更方便一点,比如:想知道主机名是什么,一扫就知道了。

比如:  [root@localhost ~]#  就是放在一个变量里面,格式就是放在PS1的变量里。

格式:PS1  取它的值$ 打印echo

[root@localhost ~]# echo $PS1
[\u@\h \W]\$
这个变量里专门存的格式,是系统已经定义好的。改一改

主机名去了只留用户名 因为有特殊字符用单引号引起来, 因为它是变量,它的值想让他显示什么就什么   exit  退出

 (3)Bash 环境变量文件的加载

/etc/profile       使用范围:所有账户

/etc/bashrc      使用范围:所有账户

~/.bashrc         使用范围:~所代表的账户

~/.bash_profile 使用范围:~所代表的账户   vi .bash_profile

这四个文件是用来初始化环境变量的,也叫用户登录脚本,其实都是脚本文件。

为什么叫用户登录脚本?

就是用户在登录操作系统的时候就会去读这四个文件,它一读就会去执行文件里的内容,如果里面要是有变量,它就会让它生效。

(4)变量文件的分类

这四个文件的名字,路径需要记住。怎么记?给它分类。

一、

etc下的两个文件,对所有用户生效。不管是谁登到系统里来,都会读这两个文件。

家目录下的两个文件,只对当前登录账户生效。

二、登录shell和非登录shell  

login shell
    用户登录的时候需要输入用户名
nologin shell
    用户登录的时候不需要输入用户

例如 用快捷键去打开一个终端,是登陆了一个用户,并没有书写用户的名字就登录了。  还有另一种叫su - root  su的时候输写了用户的名字,这就是两种不同的登录shell。需要输入用户名字就叫做登录shell  不需要输入用户名字就叫非登录shell。

登录shell和非登录shell  读取的文件是不一样的。

登录shell和非登录shell   在读取登录脚本时是不一样的。

 这4个文件  也叫系统初始化文件 (初始化就是操作系统起来的时候预先设置好的一些设置)如果要是有一些环境变量的值,需要预先设置好,就可以在这些文件里操作。

比如:想让用户登录的时候就有abc它的值是10000,echo $abc这个变量原来是不存在的,想让它在用户登录的时候就生效,把这个设置放在配置文件里,vim /etc/profile,在配置文件下面写 abc=10000  保存一下,就可以重启操作系统了或者source /etc/profile(立即生效),就可以看到abc是有值的。

 系统里面很多变量,尤其是修饰环境的变量,都是放在这四个文件里设置的。比如:历史命令

历史命令最多能存储1000条命令。  为什么是1000?

因为1000就是一个变量里面的值,他也是一个环境变量 在vim/etc/profile

:HISTSIZE=1000 就是一变量环境变量,之所以能存储1000条历史命令 就是因为变量里面写到初始化文件里配置好了。

  这一块可以写任何想要写的命令,前提是非交互式的,不一定是设置变量  系统配这个东西就是让我们设置变量的。

这两个文件也可以了解了解

 ~/.bash_logout 家目录下的隐藏文件ls -a   是在退出账户时执行的命令 在里面写个东西,它退出的时候就会执行。一般不会去动它。vi .bash_logout

 vim .bash_history 历史命令会记录在里面

编写脚本 添加账户zhangsan,

并给他设置密码脚本里不能出现交互式的命令

useradd zhangsan

echo 123 | passwd --stdin zhangsan

vim a.sh

useradd zhangsan

echo 123 | passwd --stdin zhangsan

chmod +x zhangsan

./a.ch

./执行        --stdin 设置123免密

【注意】少熬夜,多看书。

相关文章:

  • div与表格应用实例——计算器布局
  • 爬虫的三大库
  • 基于Java+Springboot+Vue+elememt社区疫情防控系统设计和实现
  • 【Linux】yum 与 vim 的基本使用
  • SpringCloudAlibaba【六】微服务架构下的秒杀案例
  • 字节一面:TCP 三次握手,问的好细!
  • 一个功能齐全的,多用途管理后台模板
  • 【C语言】三子棋小游戏
  • Python自动化:Windows下不用任务管理器也可以轻松定时执行任务
  • 基于HTML美中华传统文化题材网页项目的设计与实现 (纯HTML+CSS制作中国茶文化网站)...
  • 网络请求+基于Node.js的WebSocket
  • 两例典型的C++软件异常排查实例分享
  • 第30讲:事务的基本概念以及如何实现事务
  • 【C++初阶】类和对象(二)
  • C++位图
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 2017届校招提前批面试回顾
  • AngularJS指令开发(1)——参数详解
  • CSS 专业技巧
  • Elasticsearch 参考指南(升级前重新索引)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • PHP那些事儿
  • sublime配置文件
  • Vue 动态创建 component
  • 算法-插入排序
  • 以太坊客户端Geth命令参数详解
  • Java性能优化之JVM GC(垃圾回收机制)
  • #define用法
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $$$$GB2312-80区位编码表$$$$
  • (12)Linux 常见的三种进程状态
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (4)Elastix图像配准:3D图像
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)Windows2003安全设置/维护
  • (转)四层和七层负载均衡的区别
  • (转载)hibernate缓存
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net CHARTING图表控件下载地址
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net Memory Profiler的使用举例
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 的程序集加载上下文
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈