【Shell】基础语法(一)

文章目录

  • 一、shell的介绍
  • 二、执行脚本
  • 三、shell的基本语法
    • 1. 变量的使用
    • 2. 变量的分类


一、shell的介绍

Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Shell提示符下执行。

由于历史原因,UNIX系统上有很多种Shell:

  1. sh(Bourne Shell):由Steve Bourne开发,各种UNIX系统都配有sh。
  2. csh(C Shell):由Bill Joy开发,随BSD UNIX发布,它的流程控制语句很像C语言,支持很多Bourne Shell所不支持的功能:作业控制,命令历史,命令行编辑。
  3. ksh(Korn Shell):由David Korn开发,向后兼容sh的功能,并且添加了csh引入的新功能,是目前很多UNIX系统标准配置的Shell,在这些系统上/bin/sh往往是指向/bin/ksh的符号链接。
  4. tcsh(TENEX C Shell):是csh的增强版本,引入了命令补全等功能,在FreeBSD、MacOS X等系统上替代了csh。
  5. bash(Bourne Again Shell):由GNU开发的Shell,主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,bash从csh和ksh借鉴了很多功能,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。虽然如此,bash和sh还是有很多不同的,一方面,bash扩展了一些命令和参数,另一方面,bash并不完全和sh兼容,有些行为并不一致,所以bash需要模拟sh的行为:当我们通过sh这个程序名启动bash时,bash可以假装自己是sh,不认扩展的命令,并且行为与sh保持一致。

查看用户对应的Shell 类型:

  • man /etc/passwd 命令
    在这里插入图片描述
    最后一列显示了用户对应的shell类型

  • 查看环境变量echo $SHELL
    在这里插入图片描述

内建命令:

用户在命令行输入命令后,一般情况下Shell会fork并exec该命令,但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程。以前学过的cd、alias、umask、exit等命令即是内建命令。

查看命令是否为内置命令:type 命令

在这里插入图片描述


二、执行脚本

编写一个简单的脚本test.sh

#!/bin/sh
echo HelloWorld
cd ..
ls
  • 直接./执行
    Shell脚本中用#表示注释,相当于C语言的//注释。但如果#位于第一行开头,并且是#!(称为Shebang)则例外,它表示该脚本使用后面指定的解释器/bin/sh解释执行。把这个脚本文件加上可执行权限然后执行:
    在这里插入图片描述
  • /bin/sh test.sh执行
    这种方式不需要脚本有可执行权限,仅需要脚本有可读权限即可。在一些没办法调整脚本权限的情况下可以使用这种方式,但是这种方式需要关注当前脚本使用什么解释器
    在这里插入图片描述
  • 命令行下输入的命令用()括起来
    在这里插入图片描述
  • source 脚本地址
    这种方式执行脚本不会产生子进程,而是将脚本命令都加载进来执行。常用于加载配置文件例如: source /etc /profile在这里插入图片描述

Shell执行的过程:Shell会fork一个子进程并调用exec执行./test.sh这个程序,exec系统调用把子进程的代码段替换成./test.sh程序的代码段,并从它的_start开始执行


三、shell的基本语法

1. 变量的使用

Shell变量通常由字母加下划线开头,由任意长度的字母、数字、下划线组成

变量的定义:声明即赋值

varname=value,注意等号两边不能留空格,留了空格就变成了一个命令+两个参数

在这里插入图片描述

变量的使用:$符号跟上变量名表示对某个变量取值,变量名可以加上{}来表示变量名的范围:

在这里插入图片描述


2. 变量的分类

shell内变量: 在shell解析环境中存在的变量。

  • 全局变量: shell中不使用任何修饰符修饰的变量都是全局变量。不管是在函数内部还是函数外都一样,从声明语句开始一直到脚本结束都是其生命周期
  • 环境变量:操作系统自带的,每一个进程都会有。当创建一个子进程时,子进程会继承父进程的环境变量。
#!/bin/sh 
globalVar1="hello" // 全局变量function test()
{globalVar2="world" // 全局变量local localVar="itcast" // 局部变量
}#调用函数
test 
echo $globalVar1 $globalVar2

在这里插入图片描述

shell中的变量只能在当前shell进程中使用,跨进程是无法传递的。除非使用source,将另一个进程中的程序加载到当前进程中。

subScript.sh

#!/bin/sh 
echo "this is in subScript"
echo $globalVar1
echo "subScript end"

在test.sh中执行subScript:

在这里插入图片描述

环境变量是单向传递的,只能从父进程传递给子进程而不能由子进程传给父进程。

定义一个环境变量:export varname=value 或者 varname=value; export varname

删除变量

在这里插入图片描述

无论是普通变量还是环境变量都可以使用unset命令删除。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/53506.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

介绍Sping Boot的5个扩展点

1、初始化器ApplicationContextInitializer 我们在启动Spring Boot项目的时候,是执行这样一个方法来启动的 我们一层一层往下点,最终发现执行的是这个方法 所以我们在启动项目的时候也可以这样启动 new SpringApplication(SpringbootExtensionPointAp…

ubuntu22安装如何安装window软件(.exe)

ubuntu未提供相应程序安装包,如何使用的ubuntu22.04 安装window提供的exe程序呢? 这里我了解有两种方案: 使用模拟器进行window程序的运行,但是肯定会有相应的性能损耗如(wine)在linux上运行virtualbox或…

React Native获取手机屏幕宽高(Dimensions)

import { Dimensions } from react-nativeconsole.log(Dimensions, Dimensions.get(window)) 参考链接: https://www.reactnative.cn/docs/next/dimensions#%E6%96%B9%E6%B3%95 https://chat.xutongbao.top/

嵌入式开发学习(STC51-7-矩阵按键)

内容 按下S1-S16键,对应数码管最左边显示0-F 矩阵按键简介 独立按键与单片机连接时,每一个按键都需要单片机的一个I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的I/O口资源;而单片机 系统中I/O口资…

Flutter运行app时向logcat输出当前打开的界面路径且点击可跳转

当一个项目大了目录文件多了,我们往往会为了找到一个文件花费大量的时间和精力,为了快捷方便的调试我们的项目,我们往往需要在打开app运行的时候需要知道当前打开的界面的文件在哪儿,我们这个代码就能快捷的知道我们app正在打开的…

redis安装(Windows+Linux)

redis安装 文章目录 redis安装一. windows下安装二.Linux环境下安装 一. windows下安装 下载地址(github): https://github.com/tporadowski/redis/releases (强烈推荐) https://github.com/MicrosoftArchive/redis/releases 选择安装包 下载完成后根据提示进行安装即可(这…

【BASH】回顾与知识点梳理(五)

【BASH】回顾与知识点梳理 五 五. 数据流重导向5.1 什么是数据流重导向standard output 与 standard error output/dev/null 垃圾桶黑洞装置与特殊写法standard input &#xff1a; < 与 << 5.2 命令执行的判断依据&#xff1a; ; , &&, ||cmd ; cmd (不考虑指…

Grafana集成prometheus(1.Prometheus安装)

下载docker镜像 docker pull prom/prometheus docker pull prom/node-exporter启动 node-exporter 该程序用以采集机器内存等数据 启动脚本 docker run -d -p 9100:9100 prom/node-exporter ss -anptl | grep 9100启动截图 prometheus 启动脚本 # 3b907f5313b7 为镜像i…

Compose:从重组谈谈页面性能优化思路,狠狠优化一笔

作者&#xff1a;晴天小庭 前言&#xff1a; 随着越来越多的人使用Compose开发项目的组件或者页面&#xff0c;关于使用Compose构建的组件卡顿的反馈也愈发增多&#xff0c;特别是LazyColumn这些重组频率较高的组件&#xff0c;因此很多人质疑Compose的性能过差&#xff0c;这…

软件外包开发语言排行榜

软件开发语言的排行榜是一个动态的话题&#xff0c;而在未来的几年中&#xff0c;新的技术和语言可能会不断涌现&#xff0c;影响排名。然而以下是一些在过去几年中一直受欢迎并有前途的软件开发语言&#xff0c;如果是新入门软件开发行业在学习语言做选择&#xff0c;希望下面…

马斯克收购AI.com域名巩固xAI公司地位;如何评估大型语言模型的性能

&#x1f989; AI新闻 &#x1f680; AI拍照小程序妙鸭相机上线商业工作站并邀请摄影师进行内测 摘要&#xff1a;AI拍照小程序妙鸭相机将上线面向商业端的工作站&#xff0c;并邀请摄影师进行模板设计的内测。妙鸭相机希望为行业提供更多生态产品&#xff0c;扩大行业规模&a…

02.Redis实现添加缓存功能

学习目标&#xff1a; 提示&#xff1a;学习如何利用Redis实现添加缓存功能 学习产出&#xff1a; 流程图 1. 准备pom环境 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId&g…