Shell脚本之基本语法

news2024/11/17 16:38:59

目录

一、变量定义

变量命名规则:

变量的赋值:

只读变量:

删除变量:

二、变量的类型

自定义变量: 

环境变量:

位置参数:

预定义变量:

三、键盘输入

四、数值运算

为什么数值需要特殊处理

声明变量类型 

expr或let数值运算工具

$((表达是)) 或 $[表达式]

五、运算符


一、变量定义

变量命名规则:

  • 可以包含字母,数字,下划线,首字母不能用数字开头,中间不能又空格
  • 为变量赋值等号之间不能为空格
  • 变量命名不能使用标点符号
  • 不能使用 bash 的关键字
  • shell 中默认的变量的类型都是字符,就算是数字字符也会被认为是字符串,如果需要进行字符相加则必须指定变量为数值
  • 如果定义的变量中没有空格,则定义变量时可以使用单引号或双引号,也可以使用,如:
    name=zs ,如果变量中包含了空格,则必须使用单引号或双引号引起来,如: "Kent Beck”
  • 可以使用命令的结果作为变量的值,但必须使用 `` $() 符号,如 : d=$(ls /etc) 获取 etc 目录下的所用文件赋给d
  • 环境变量一般用大写,编程习惯
示例:
# 以下时合法的变量名
ABC
ROOT__PATH
_var
var2
# 以下时非法的变量名
12abc
?abc

变量的赋值:

# 显示负值
name="zs" #正确
name = "zs" #错误
# 变量的使用
echo $name
echo ${name} #也可以这样写,花括号是可选的
# 使用语句为变量赋值
for f in $(ls /etc) # 将/etc目录下的所有文件循环赋给f变量
for f in `ls /etc` # 这样写也可以
# 变量可以重新定义
name="ww"
echo $name
name="zl"
echo $name

只读变量:

# 定义只读变量,该变量不能修改
name="avdfd"
readonly name
# 运行时会提示该变量是只读变量

删除变量:

# 删除name变量
unset name
# set可以查看所有的变量,包括环境变量和用户自定义的变量
set

二、变量的类型

  • 自定义变量:用户自己定义的变量,或者叫作本地变量
  • 环境变量:保存和系统操作环境相关的变量,可以添加环境变量
  • 位置变量:主要用于向脚本中传递参数或数据,变量名不能自定义,作用固定
  • 预定义变量:在 Bash 中已经定义好的变量,变量的作用也是预先定义好的

自定义变量: 

[root@localhost ~]# name=zs
[root@localhost ~]# echo
[root@localhost ~]# echo $name
zs
[root@localhost ~]# name="$name "123
#name变量加一个空格和123
[root@localhost ~]# echo $name
zs 123
[root@localhost ~]# name="$name"+234
#注意与其他编程语言不同,不能用+连接两个字符串
[root@localhost ~]# echo $name
zs 123+234
[root@localhost ~]# echo ${name} #也可以这样来用变量

环境变量:

用户自定义的变量也叫本地变量,只在定义它的当前shell中才也可以使用。环境变量会在当前shell和当 前shell的所有子shell中生效。 如果将环境变量写入相应的配置文件,则这个变量可以在所有的shell中 使用。可以理解为环境变量与本地变量的区别就是作用范围不同

设置环境变量

命令格式:export 变量名=变量值

查看:env

示例:
[root@localhost ~]# name=zs
[root@localhost ~]# export name
[root@localhost ~]# age=18
[root@localhost ~]# set
#在当前的shell中可以看到name和age变量
...
age=18
colors=/root/.dircolors
name=zs
[root@localhost ~]# bash
#打开一个子shell则只用看到name变量,也可以使用uset删除
[root@localhost ~]# set
...
name=zs
常见的环境变量:
PATH: 查找命令的路径,可以使用: echo $PATH 查看。

位置参数:

$n
n 是数字, $0 表示命令的本身, $1-9 表示第 1 到第 9 个参数, 10 以上的参数需要用 {} 括起
来,例如: ${10}
$*
表示命令行中的所有参数, $* 把所有参数看成一个整体
$@
表示命令行中的所用参数,与 $* 不同的是 $@ 把每个参数区分对待,可以将这个整体看作是
一个数组,数组中的每个元素都是独立的
$#
代表命令行中所有参数的个数

示例:

[root@localhost ~]# vim paramdemo.sh
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
[root@localhost ~]# ./paramdemo.sh 1 2 3 4
bash: ./paramdemo.sh: 权限不够
[root@localhost ~]# chmod 755 paramdemo.sh
[root@localhost ~]# ./paramdemo 1 2 3 4
bash: ./paramdemo: 没有那个文件或目录
[root@localhost ~]# ./paramdemo.sh 1 2 3
./paramdemo.sh
1
2
3
[root@localhost ~]# vim paramdemo02.sh
#!/bin/bash
echo "参数个数: $#"
echo "所有的参数(作为一个整体): $*"
echo "所有的参数(区分对待每个参数): $@"
[root@localhost ~]# chmod 755 paramdemo02.sh
[root@localhost ~]# ./paramdemo02.sh 1 2 3 4 5
参数个数: 5
所有的参数(作为一个整体): 1 2 3 4 5
所有的参数(区分对待每个参数): 1 2 3 4 5

预定义变量:

$?
最后一次执行命令的返回状态,如值为 0 则说明成功,如值为非 0 ,则说明命令执行不正确
$$
当前进程的进程号
$!
后台运行的最后一个进程的进程号

示例:

[root@localhost ~]# ls
abc index.html index.html.2 paramdemo02.sh sh
anaconda-ks.cfg index.html.1 index.html.3 paramdemo.sh
[root@localhost ~]# echo $?
0
[root@localhost ~]# ls /fdfdf
ls: 无法访问/fdfdf: 没有那个文件或目录
[root@localhost ~]# echo $?
2
[root@localhost ~]#

三、键盘输入

命令: read [ 选项 ] [ 变量名 ]
选项:
  • -p 提示信息,等待输入时的提示
  • -t 秒数,用于指定等待的时间,单位时秒
  • -n 字符数,只要接收到指定的字符数就会执行
  • -s 隐藏输入的数据,用于机密信息的输入,比如密码
示例:
[root@localhost ~]# vim readdemo.sh
#!/bin/bash
read -t 60 -p "请输入账号: " userName
echo "输入的账号是: $userName"
read -s -t 60 -p "请输入密码:" password
echo -e "\n"
echo “输入的密码: $password”
read -n 1 -t 30 -p "请选择[y/n]" select
echo -e "\n"
echo "输入的选择是: $select"
[root@localhost ~]# chmod 755 readdemo.sh
[root@localhost ~]# ./readdemo.sh
请输入账号: zs
输入的账号是: zs
请输入密码:
“输入的密码: 123456”
请选择[y/n]y
输入的选择是: y
[root@localhost ~]#

四、数值运算

为什么数值需要特殊处理

shell 中变量默认都是字符型的,不管是其字面值是不是数值,所以当两个变量相加时,默认是字符串 拼接的操作,例如:
[root@localhost ~]# num1=1
[root@localhost ~]# num2=2
[root@localhost ~]# num3=$num1+$num2
[root@localhost ~]# echo $num3
1+2

声明变量类型 

格式: declare [+/-][ 选项 ] 变量名
  • - 给变量设置类型属性
  • + 取消变量的类型属性,注意与我们的日常习惯不同
  • -i 将变量指定为整型
  • -x 将变量声明为环境变量
  • -p 显示指定变量被设置的类型

示例:

[root@localhost ~]# num1=1
[root@localhost ~]# num2=2
[root@localhost ~]# num3=$num1+$num2
[root@localhost ~]# echo $num3
1+2
[root@localhost ~]# declare -i num4=$num1+$num2
[root@localhost ~]# echo $num4
3
#此处是数值相加,而不是字符串相加了
[root@localhost ~]#

exprlet数值运算工具

[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# c=$(expr $a + $b)
#注意空格
[root@localhost ~]# echo $c
3
[root@localhost ~]#

$((表达是)) $[表达式]

推荐使用的方式,示例:

[root@localhost ~]# a=5
[root@localhost ~]# b=6
[root@localhost ~]# c=$((a+b))
[root@localhost ~]# echo $c
11
[root@localhost ~]# a=8
[root@localhost ~]# b-9
-bash: b-9: 未找到命令
[root@localhost ~]# b=9
[root@localhost ~]# c=$[a + b]
[root@localhost ~]# echo $c
17
[root@localhost ~]#

五、运算符

优先级运算符说明
13-+单目,正负运算符
12!, ~逻辑非,按位取反,或补码
11*, /, %乘,除,取余
10+, -加,减
9>>, <<按位左移,按位右移
8>, <, <=, >=大于,小于,大于等于,小于等于
7==, !=等于,不等于
6&按位
5^按位异
4
3&&逻辑
2
1=, +=, -=, *=, /=, %=, &=, ^=各种赋值
优先级的数值越大,优先级越高,注意和其他语言的数值月底优先级越高不同。
示例:
[root@localhost ~]# num = $(( (15 + 34) * 5 / 2 ))
-bash: num: 未找到命令
[root@localhost ~]# num=$(( (15 + 34) * 5 / 2 ))
[root@localhost ~]# echo num
num
[root@localhost ~]# echo $num
122
[root@localhost ~]# b=$((19%2))
[root@localhost ~]# echo $b
1
[root@localhost ~]# c=$(( 1 && 0 ))
[root@localhost ~]# echo $c
0
[root@localhost ~]#

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

余集和拉格朗日定理

L&#xff1a;一个群的例子&#xff08;在下面的文章中进一步详细介绍&#xff09;;R&#xff1a;约瑟夫路易拉格朗日&#xff08;1736-1813&#xff09;&#xff0c; 一、说明 数学家总是痴迷于根据乍一看似乎完全无关的事实/观察来形成概括。为什么&#xff1f;原因很简单&am…

ideaSSM图书借阅管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 SSM 图书借阅管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码 和数据库&#xff0c;系统主…

JS-11A/11时间继电器 板前接线 JOSEF约瑟

系列型号&#xff1a; JS-11A/11集成电路时间继电器&#xff1b;JS-11A/12集成电路时间继电器&#xff1b; JS-11A/13集成电路时间继电器&#xff1b;JS-11A/136集成电路时间继电器&#xff1b; JS-11A/137集成电路时间继电器&#xff1b;JS-11A/22集成电路时间继电器&#…

一点点金融 4

一点点金融 4 第一性原理&#xff1a;关键事件前后&#xff0c;市场会从不确定性转变为确定性弹簧板、天花板&#xff1a;作为止损、换策略的依据怎么判断弹簧板、天花板&#xff1f; 第一性原理&#xff1a;关键事件前后&#xff0c;市场会从不确定性转变为确定性 在关键事件…

74LVC04六角逆变器-国产兼容MS9113

MS9113S 是一款 S/PDIF 信号接收器。当输入信号频率为 0.1MHz 至 40MHz 时&#xff0c;芯片放大该输入信号至电源电压。最小输入信号幅度的典型值为 80mV。MS9113S 包含一个信号标识位管脚&#xff0c;有输入信号则为高电平&#xff0c;无输入信号则为低电平。MS9113S 还包含一…

LeetCode-94. 二叉树的中序遍历【栈 树 深度优先搜索 二叉树】

LeetCode-94. 二叉树的中序遍历【栈 树 深度优先搜索 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;递归解题思路二&#xff1a;迭代解题思路三&#xff1a;0 题目描述&#xff1a; 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1…

调用飞书获取用户Id接口成功,但是没有返回相应数据

原因&#xff1a; 该自建应用没有开放相应的数据权限。 解决办法&#xff1a; 在此处配置即可。

Redis高可用主从复制与哨兵模式

前言 在生产环境中&#xff0c;除了采用持久化方式实现 Redis 的高可用性&#xff0c;还可以采用主从复制、哨兵模式和 Cluster 集群的方法确保数据的持久性和可靠性。 目录 一、主从复制 1. 概述 2. 作用 3. 主从复制流程 4. 部署 4.1 安装 redis 4.2 编辑 master 节…

基于深度学习的条形码二维码检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5的条形码二维码检测系统。核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及基于Streamlit的交互…

年少不知EFCore好,错把SqlSugar当成宝

背景&#xff1a;依然记得我的第一份WebApi项目使用得是SqlSugar&#xff0c;当时还没有系统学习b/s这边的知识&#xff0c;跟着别人做项目用SqlSugar觉得非常方便&#xff0c;减少了自己手写ADO.Net的痛苦。但是今天发现这个EFCore也是巨好用啊&#xff0c;下面写一下他的简单…

C语言——内存函数

前言&#xff1a; C语言中除了字符串函数和字符函数外&#xff0c;还有一些函数可以直接对内存进行操作&#xff0c;这些函数被称为内存函数&#xff0c;这些函数与字符串函数都属于<string.h>这个头文件中。 一.memcpy&#xff08;&#xff09;函数 memcpy是C语言中的…

LlamaIndex——RAG概述

文章目录 一、使用LLM1. 模型2. 词嵌入3. Prompt 二、加载1. 加载2. 转换&#xff08;1&#xff09;高级API&#xff08;2&#xff09;低级API 三、索引/EmbeddingTop K Retrieval 四、存储五、查询六、评估1. 生成结果质量评估2. 检索结果评估 RAG&#xff08;检索增强生成&am…

【javaScript】DOM编程入门

一、什么是DOM编程 概念&#xff1a;DOM(Document Object Model)编程就是使用document对象的API完成对网页HTML文档进行动态修改&#xff0c;以实现网页数据和样式动态变化的编程 为什么要由DOM编程来动态修改呢&#xff1f;我们就得先理解网页的运行原理&#xff1a; 如上图&a…

回溯算法|491.递增子序列

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {if (path.size() > 1) {result.push_back(path);// 注意这里不要加return&#xff0c;要取树上…

vlookup跨表使用

VLOOKUP&#xff08;查找值&#xff0c;数据表&#xff0c;列序数&#xff0c;匹配条件&#xff09;。打开两表格&#xff0c;输入查找值和表格数据格式一致&#xff0c;查找表格或数据范围是连续的。 跨表VLOOKUP使用步骤&#xff1a; 插函数单元格&#xff0c;输“VLOOKUP()…

各类系统业务功能架构图整理

一、前言 很多软件系统一直经久不衰&#xff0c;主要这些系统都是一些生产工作经营不可或缺的系统。比如财务系统&#xff0c;商城系统&#xff0c;支付系统&#xff0c;供应链系统&#xff0c;人力资源管理系统&#xff0c;ERP系统等等。这些系统不管大公司还是小公司往往都需…

Fastjson 1.2.47 远程命令执行漏洞复现分析环境

Fastjson 1.2.47 远程命令执行漏洞 1、靶机环境安装 1.1、虚机机linux环境参数 1、操作系统&#xff1a;CentOS Linux release 7.4.1708 (Core) 2、IP&#xff1a;192.168.127.1321.1、docker与docker compose安装 1.2、下载https://github.com/vulhub/vulhub/tree/master/…

moment.js 产出未知格式的时间,可能的原因

moment.js 产出未知格式的时间&#xff0c;可能的原因 有个问题困扰我好久了&#xff0c;在项目中使用格式化时间的时候会产出一些千奇百怪的格式&#xff0c;产出的文字我都不认识。 百思不得其解&#xff0c;终于今天在看代码的时候发现了这个问题。 它的表现是这样的&…

Redis中的复制功能(四)

复制的实现 步骤2:建立套接字连接 在SLAVEOF命令执行之后&#xff0c;从服务器将根据命令所设置的IP地址和端口&#xff0c;创建连向主服务器的套接字连接&#xff0c;如图所示。如果从服务器创建的套接字能成功连接(connect)到主服务器&#xff0c;那么从服务器将为这个套接…

第二十一章 RabbitMQ

一、RabbitMQ 介绍 在介绍 RabbitMQ 之前&#xff0c;我们先来看下面一个电商项目的场景&#xff1a; - 商品的原始数据保存在数据库中&#xff0c;增删改查都在数据库中完成。 - 搜索服务数据来源是索引库&#xff08;Elasticsearch&#xff09;&#xff0c;如果数据库商品…