Shell编程规范与使用

目录

一、Shell脚本概述

1)Shell的作用——命令解释器,“翻译官”

2)常见shell解释器

3)编程语言类型

4)Shell脚本

编写脚本代码

Shell脚本的构成

赋予可执行权限

Shell脚本的执行方法

5)重定向与管道操作

交互式硬件设备

重定向操作

管道操作符号“|”

​编辑

二、Shell脚本变量

1)Shell变量的作用、类型

变量的作用

变量的类型

2)自定义变量

定义一个新的变量

查看变量的值

赋值时使用引号

从键盘输入内容为变量赋值

设置变量的作用范围

整数变量的运算

let命令

3)特殊的Shell变量

环境变量

常见的环境变量

只读变量

位置变量

预定义变量


一、Shell脚本概述

1)Shell的作用——命令解释器,“翻译官”

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果

2)常见shell解释器

  • /bin/bash:是目前大多数Linux 版本采用的默认shell
  • /bin/sh:已经被bash替换
  • /bin/csh:类似c语言的shell
  • /bin/tcsh:整合了csh提供了更多功能
  • /bin/nologin:这个shell可以让用户无法登录

3)编程语言类型

面向对象 JAVA PYTHON C++ C# GO

面向过程     C Shell

强类型语言 JAVA C C++ C# GO 编译型语言,执行钱需要先编译,允许速度快

弱类型语言 PYTHON Shell PHP 解释型语言,不需要编译即可直接执行,常用与脚

4)Shell脚本

提前将可执行的命令语句写入一个文件,顺序执行,解释器逐行解释代码 

编写脚本代码

  • 使用vim文本编辑器
  • 每行一条Linux命令,按执行顺序依次编写

Shell脚本的构成

  • 脚本申明(解释器):若第一行为 "#!/bin/bash” ,表示此行以下的代码语句是通过 /bin/bash程序来执行,#!/bin/bash 为默认解释器。还有其他类型的解释器,比如 #! /usr/bin/python、 #!/usr/bin/expect
  • 注释信息:以 "#" 开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行
  • 可执行语句:比如 echo 命令,用于输出"  "之间的字符串
[root@localhost ~]# vim first.sh

#!/bin/bash
 
#this is first shell 

echo "HelloWorld"

赋予可执行权限

  • 使脚本具有可执行属性
[root@localhost ~]# chmod +x first.sh

Shell脚本的执行方法

1)绝对/相对路径指定脚本文件运行,需要执行用户拥有执行权限x,脚本会在子shell环境中运行

2)用bash/sh 程序执行脚本文件运行,不需要执行权限,脚本会在子shell环境中运行

3)用source/.指定脚本文件运行,脚本会在当前shell环境中运行(会影响当前所在目录、变量的值 等因素)

5)重定向与管道操作

交互式硬件设备

标准输入:从该设备接收用户输入的数据

标准输出:通过该设备向用户输出数据

标准错误:通过该设备报告执行出错信息

类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

重定向操作

类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出>将输出结果保存到指定的文件(覆盖原有内容) 
>>将输出结果追加到指定的文件尾部
标准错误输出 2>将错误信息追加到指定的文件中(覆盖原有内容)
2>>将错误信息追加到指定的文件中 
混合输出&>将标准输出、标准错误的内容保存到同一个文件中
2>&1将标准错误输出重定向到标准输出

管道操作符号“|”

  • 将左侧的命令输出结果,作为右侧命令的处理对象
cmd1 | cmd2 [……|cmdn]
[root@localhost ~]# grep "bash$" /etc/passwd

root:x:0:0:root:/root:/bin/bash

teacher:x:500:500:BENET Linux Teacher:/home/teacher:/bin/bash

[root@localhost ~]grep "bash$" /etc/passwd | awk -F: '{print $1,$7}'  
#以冒号:分割,输出第1、7个字段

root /bin/bash

teacher /bin/bash

二、Shell脚本变量

1)Shell变量的作用、类型

变量的作用

用来存放系统和用户需要使用的特定参数(值)

  • 变量名:使用固定的名称,由系统预设或用户定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

变量的类型

自定义变量:由用户自已定义、修改和使用

特殊变量:环境变量,只读变量,位置变量,预定义变量

2)自定义变量

定义一个新的变量

变量名以字母或下划线开头,区分大小写,建议全大写

变量名=变量值

ps:=号两边不能有空格 

查看变量的值

echo $变量名

[root@localhost ~]# Product=Python

[root@localhost ~]# Version=2.7.13

[root@localhost ~]# echo $Product

Python

[root@localhost ~]# echo $Product $Version

Python 2.7.13

赋值时使用引号

双引号:会把$当作特殊符号去引用变量的值

单引号:禁止引用其他变量值,会把$等特殊符号是为普通字符去使用

反撇号:命令替换,获取里面的命令执行后的输出结果,`……`效果等同于$()

从键盘输入内容为变量赋值

read [-p “提示信息”] 变量名

#!/bin/bash
 
read -p "请输入用户名:" name
#谁来执行这个脚本,谁就给name赋值
read -s -p "请输入密码:" pass
#-s 参数可以使密码不明文显示,更加安全
#谁来执行这个脚本,谁就给pass赋值
 
useradd $name
echo "$pass" |passwd --stdin $name
#如果变量赋值不加空格,这里加不加引号没区别
#加引号可以防止一些意外出错

设置变量的作用范围

#两种格式可以混合使用

格式1:export 变量名 …

格式2:export 变量名=变量值 …
[root@localhost ~]# echo "$Product $Version"

Benet 6.0

[root@localhost ~]# export Product Version   #导出为全局变量

[root@localhost ~]# bash

[root@localhost ~]# echo "$Product $Version" #子程序引用全局变量

Benet 6.0

[root@localhost ~]# exit

永久全局变量添加

[root@localhost ~]# vim /etc/profile

#最后一行加入

export Product Version

[root@localhost ~]# source /etc/profile   #当前环境立即执行,也可以重启

[root@localhost ~]# echo "$Product $Version"

Benet 6.0

[root@localhost ~]# bash                  #切换shell环境

[root@localhost ~]# echo "$Product $Version"

Benet 6.0

整数变量的运算

expr 变量1 运算符 变量2 [运算符 变量3]…

常用运算符

  • 加法运算:num1 + num2
  • 减法运算:num1 - num2
  • 乘法运算:num1 * num2
  • 除法运算:num1 / num2
  • 求模(取余)运算:num1 % num2

变量的自增/自减等操作

简写表达式完整表达式
i++i=i+1
i--i=i-1
i+=2i=i+2
i-=2i=i-2
i*=2i=i*2
i/=2i=i/2
i%=2i=i%2

let命令

let是一个用于执行算术运算的命令。它可以将一个算术表达式作为参数,并将其计算结果赋值给一个变量。let命令支持的算术运算包括加、减、乘、除、取模等

3)特殊的Shell变量

环境变量

  • 由系统提前创建,用来设置用户的工作环境
  • 配置文件:/etc/profile、~/.bash_profile

常见的环境变量

  • PATH:指定可执行程序的搜索路径
  • HOME:指定当前用户的家目录
  • LANG:指定当前系统的语言环境
  • SHELL:指定当前Shell的路径
  • PS1:指定Shell提示符的格式
  • PWD:指定当前工作目录
  • TERM:指定当前终端的类型
  • USER:指定当前用户的用户名

[root@localhost ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin

[root@localhost ~]# PATH="$PATH:/root"

[root@localhost ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin:/root

只读变量

  • 用于变量值不允许被修改的情况
[root@localhost ~]# name=cloud

[root@localhost ~]# readonly name   //设置为只读变量

[root@localhost ~]# echo $name

cloud

[root@localhost ~]# name=yum

-bash:name:readonly variable        //只读变量不可以被重新赋值

[root@localhost ~]# 

[root@localhost ~]# unset name      //只读变量不可以被删除

-bash:unset:name:cannot unset:readonly variable

位置变量

  • 表示为$n,n为1~9之间的数字
[root@localhost ~]# ./myprog.sh one two three four five six
                                 ↑                       ↑
                         $1,第1个位置参数                ↑
                                                 $6,第6个位置参数

预定义变量

# Shell常见的变量之一系统变量,主要是用于对参数判断和命令返回值判断时使用,系统变量详解如下:

$0 		当前脚本的名称
$n 		当前脚本的第n个参数,n=1,2,…9
$* 		当前脚本的所有参数(不包括程序本身)
$# 		当前脚本的参数个数(不包括程序本身)
$? 		令或程序执行完后的状态,返回0表示执行成功
$$ 		程序本身的PID号
[root@localhost ~]# vim mybak.sh

#!/bin/bash

TARFILE=beifen-`date +%s`.tgz

tar zcf $RARFILE $* &> /dev/null

echo "已完成$0脚本,"

echo "共完成$#个对象的备份"

echo "具体内容包括:$*"

[root@localhost ~]# chmod +x mybak.sh

[root@localhost ~]# ./mybak.sh /etc/passwd /etc/shadow

已执行 ./mybak.sh 脚本,

共完成2个对象的备份

具体包括:/etc/passwd /etc/shadow

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】unity脚本学习(六)【GUI发展历程、IMGUI控件、Layout自动布局】

目录 unity 界面发展IMGUINGUI其他GUI插件uGUIUI 工具包比较 GUI基础GUI静态变量Unity扩展编辑器屏幕空间的总尺寸Screen.width 和 Screen.height GUI静态函数&#xff08;GUI控件&#xff09;Label图片 Box控件Button与RepeatButtonTextFieldTextAreaPasswordField其他控件 GU…

缓存优化---环境搭建

缓存优化 为什么要使用redis缓存&#xff1f; 问题说明 用户数量多&#xff0c;系统访问大&#xff0c;频繁访问数据库&#xff0c;系统性能下降&#xff0c;用户体验差 环境搭建 maven坐标 在项目中的pom.xml文件中导入spring data redis的maven坐标&#xff1a; <depen…

Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换

场景 JavaGeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示&#xff1a; JavaGeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示_霸道流氓气质的博客-CSDN博客 在上面实现Java中集成Geotools之后&#xff0c;需求是将WKT数据转换成其他坐标系的W…

web前端实验5

实 验 报 告 课 程 Web前端应用开发 实验项目 Jquery AJAX编程 成 绩 专业班级 班内序号 指导教师 姓 名 学 号 实验日期 实验目的及要求&#xff1a; &#xff08;1&#xff09; 理解和掌握Jquery AJAX的get方式请求 &#xff08;2&#xff09; 理解和掌握Jquery AJAX的pos…

Redis可视化工具-Another Redis Desktop Manager 安装与连接哨兵集群

目录 一、下载安装 1.1 下载 1.2 安装 二、使用 2.1 新建连接 2.2 新增数据 2.3 应用设置 2.3.1深色模式、语言 2.3.2多个连接的颜色标记 一、下载安装 Another Redis DeskTop Manager 是 Redis 可视化管理工具&#xff0c;体积小&#xff0c;完全免费。最重要的是稳定…

低代码平台名声臭,用起来却真香——60%开发者不敢承认

群体盲从意识会淹没个体的理性&#xff0c;个体一旦将自己归入该群体&#xff0c;其原本独立的理性就会被群体的无知疯狂所淹没。——《乌合之众》 不知道从什么时候开始&#xff0c;“低代码不行”的论调充斥着整个互联网圈子&#xff0c;csdn、掘金、知乎、B站、脉脉……到处…

面试华为,花了2个月才上岸,真的难呀····

花2个月时间面试一家公司&#xff0c;你们觉得值吗&#xff1f; 背景介绍 美本计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比…

32岁阿里P7,把简历改成不知名小公司,学历改成普通本科,工作内容不变,投简历全挂!...

hr靠什么来招人&#xff1f; 一位猎头讲述了自己和朋友打赌的故事&#xff1a; 朋友在阿里云&#xff0c;32岁&#xff0c;P7&#xff0c;他把简历上的公司改成不知名&#xff0c;学历改成普通本科&#xff0c;工作内容不变&#xff0c;结果投其他公司&#xff08;比如京东&…

Spring Boot异步任务、异步消息

目录 1.异步任务 1.1.概述 1.2.使用 2.异步消息 2.1.概述 2.2.使用 1.异步任务 1.1.概述 举一个例子&#xff0c;我现在有一个网上商城&#xff0c;客户在界面点击下单后&#xff0c;后台需要完成两步&#xff1a; 1.创建客户订单 2.发短信通知客户订单号 这里面第2…

【hello Linux】理解文件系统

目录 创建文件的过程&#xff1a; 删除文件的过程&#xff1a; 创建目录的过程&#xff1a; 查看inode编号&#xff1a; 硬链接 软链接 Linux&#x1f337; 我们知道文件所有数据 文件内容 文件属性信息&#xff1b; 未打开的文件是被存放到磁盘/固态硬盘中的&#xff1b; …

《前端bug齁逼多,真假开发说》2023/4/10-2023/4/18问题汇总

1 高德地图 运行抱错 INVALID_USER_SCODE 这里是错误信息对应原因 错误信息列表-参考手册-地图 JS API | 高德地图API 这里是高德地图api设置说明 准备-入门-教程-地图 JS API | 高德地图API 如果你自己能排查出错误 那不用看我的&#xff0c;如果都写的对还是抱错…

1686_MATLAB处理Excel文件

全部学习汇总&#xff1a; GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes servral …

非常详细的阻抗测试基础知识

编者注&#xff1a;为什么要测量阻抗呢&#xff1f;阻抗能代表什么&#xff1f;阻抗测量的注意事项... ...很多人可能会带着一系列的问题来阅读本文。不管是数字电路工程师还是射频工程师&#xff0c;都在关注各类器件的阻抗&#xff0c;本文非常值得一读。全文13000多字&#…

基于html+css的图片展示17

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

2023年4月-近期看书

复习书记 用于读书 文章目录 复习书记一、(2001)控制工程基础二、(3001)交通管理与控制三、(1001)英语 一、(2001)控制工程基础 学习这本书的前6章节。 参看视频链接&#xff1a; https://www.bilibili.com/video/BV1Sb411q7jU?p8&spm_id_frompageDriver&vd_source…

数字化转型危与机,20年老厂的升级之路

“投资大、周期长、见效慢”&#xff0c;是每一家企业在考虑数字化战略时&#xff0c;都会纠结的问题。 打江山容易&#xff0c;守江山难 企业在快速扩张的过程中&#xff0c;往往可以不需要过多的考虑细节的问题&#xff0c;跑马圈地的打法会更加有效。 但是市场占有量开始饱…

瀚高股份吕新杰:创新开源双驱动,躬耕国产数据库

作者 | 伍杏玲 近年来&#xff0c;国际形势不断变幻&#xff0c;也给人们带来巨大警示&#xff1a;关键核心技术是买不来、讨不来的&#xff0c;中国科技企业需寻找研发自强之路。 瀚高基础软件股份有限公司&#xff08;简称瀚高股份&#xff09;专注数据库十八年&#xff0c;始…

大厂面试-算法优化:冒泡排序你会优化吗?

关注公众号&#xff1a;”奇叔码技术“ 回复&#xff1a;“java面试题大全”或者“java面试题” 即可领取资料 原文&#xff1a;冒泡排序及优化代码 https://blog.csdn.net/weixin_43989347/article/details/122025689原文&#xff1a;十大经典排序算法 https://frxcat.fun/p…

史上最详细的八大排序详解!(建议收藏)

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对…

问题排查记录-ffmpeg链接libavfilter和libavcodec:未定义的引用

目录 一、问题背景 二、问题现象 2.1 ffmpeg测试例程 2.2 编译脚本 2.3 错误提示 三、问题排查 3.1 关于提示找不到“stdio" "iostream"头文件的问题 3.1.1查看工具链头文件检索位置 3.1.2 根据工具链路径查找头文件 3.1.3 在编译脚本中指定头文件路径…