Shell脚本之基本语法

目录

一、变量定义

变量命名规则:

变量的赋值:

只读变量:

删除变量:

二、变量的类型

自定义变量: 

环境变量:

位置参数:

预定义变量:

三、键盘输入

四、数值运算

为什么数值需要特殊处理

声明变量类型 

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.mzph.cn/news/792188.shtml

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

相关文章

数据结构—堆

什么是堆 堆是一种特殊的树形结构&#xff0c;其中每个节点都有一个值。堆可以分为两种类型&#xff1a;最大堆和最小堆。在最大堆中&#xff0c;每个节点的值都大于等于其子节点的值&#xff1b;而在最小堆中&#xff0c;每个节点的值都小于等于其子节点的值。这种特性使得堆…

RPA自动化小红书自动化写文以及发文!

1、视频演示 RPA自动化小红书自动写作发文 2、核心功能点 采集笔记&#xff1a;采集小红书上点赞量大于1000的爆款笔记 下载素材&#xff1a;下载爆款笔记的主图 爆款改写&#xff1a;根据爆款笔记的标题仿写新的标题以及新的文案 自动发布&#xff1a;将爆款笔记发布到小红…

Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

第N6周:使用Word2vec实现文本分类

import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,pathlib,warnings #忽略警告信息 warnings.filterwarnings("ignore") # win10系统 device torch.device("cuda"if torch.cuda.is_ava…

基于springboot+vue+Mysql的招生管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

震惊!!原来阻塞队列消息队列这样理解会更简单!!!

震惊!!原来阻塞队列&&消息队列这样理解会更简单!!! 一:阻塞队列二:消息队列2.1:生产者消费者模型2.1.1:解耦合:2.1.2:削峰填谷: 三:消息队列代码3.1.13.1.2:3.1.3:生产慢,消费快,消费阻塞3.1.3:生产快,消费慢,生产阻塞 二级目录二级目录 一:阻塞队列 阻塞队列:先进先出…

gitcode 配置 SSH 公钥

在 gitcode 上配置SSH公钥后&#xff0c;可以通过SSH协议安全地访问远程仓库&#xff0c;无需每次都输入用户名和密码。以下是配置SSH公钥的步骤&#xff1a; 5分钟解决方案 用 OpenSSH公钥生成器 生成 公钥和私钥&#xff0c;私钥文件&#xff08;id_rsa&#xff09;下载&am…

【Leetcode】top 100 图论

基础知识补充 1.图分为有向图和无向图&#xff0c;有权图和无权图&#xff1b; 2.图的表示方法&#xff1a;邻接矩阵适合表示稠密图&#xff0c;邻接表适合表示稀疏图&#xff1b; 邻接矩阵&#xff1a; 邻接表&#xff1a; 基础操作补充 1.邻接矩阵&#xff1a; class GraphAd…

Open3D(C++) 鲁棒损失函数优化的ICP算法

目录 一、损失函数1、关于2、损失函数3、Open3D实现二、代码实现三、结果展示1、配准前1、配准后本文由CSDN点云侠原创,

C语言----数据在内存中的存储

文章目录 前言1.整数在内存中的存储2.大小端字节序和字节序判断2.1 什么是大小端&#xff1f;2.2 练习 3.浮点数在内存中的存储3.1.引子3.2.浮点数的存储3.2.2 浮点数取的过程 前言 下面给大家介绍一下数据在内存中的存储&#xff0c;这个是一个了解c语言内部的知识点&#xf…

【Linux学习】Linux 的虚拟化和容器化技术

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

MySQL 导入库/建表时/出现乱码

问题描述&#xff1a; 新建不久的项目在使用Navicat for MySQL进行查看数据&#xff0c;发现表中注释的部分乱码&#xff0c;但是项目中获取的数据使用不会。 猜测因为是数据库编码和项目中使用的不一样&#xff0c;又因为项目的连接语句定义了需要编码&#xff0c;故项目运行…

浅述安防视频监控平台EasyCVR视频汇聚管理系统运维管理能力

智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。国标GB28181协议视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、…

在云端遇见雨云:一位服务器寻觅者的指南

引言&#xff1a;寻觅一座云端归宿 当我踏入数字世界的边缘&#xff0c;带着对网络的探索与期待&#xff0c;我迫切需要一座安全可靠的数字栖息地。云计算技术正如一场魔法般的变革&#xff0c;而在这片广袤的云端中&#xff0c;雨云就像是一位友善的向导&#xff0c;引领我穿越…

30.多个线程交替执行

线程一输出a,5次&#xff1b; 线程二输出b,5次&#xff1b; 线程三输出c,5次&#xff1b; 现在要求输出abcabcabcabcabc怎么实现&#xff1f; 采用wait和notifyAll实现 public class ThreadTest {public static void main(String[] args) {WaitNotify waitNotify new Wai…

3DGS实时高质量大规模场景渲染最新SOTA!

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文pdf 添加微信&#xff1a;dddvision&#xff0c;备注&#xff1a;3D高斯&#xff0c;拉你入群。文末附行业细分群 详细内容请关注3DCV 3D视觉精品课程&#xff1a;…

【Java EE】Maven jar 包下载失败问题的解决方法

文章目录 1. 配置好国内的Maven源1.1配置当前项⽬setting1.2设置新项⽬的setting 2.重新下载jar包3.其他问题⭕总结 1. 配置好国内的Maven源 因为中央仓库在国外, 所以下载起来会⽐较慢, 所以咱们选择借助国内⼀些公开的远程仓库来下载资源 接下来介绍, 如何设置国内源 1.1配…

【JAVAEE学习】探究Java中多线程的使用和重点及考点

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

Arcgis研究区图经纬度(南北)切换为英文字体(SN)

只在做英文论文研究区图的时候用&#xff0c;平常为了方便还是切换为中文

面试题:JVM 调优

一、JVM 参数设置 1. tomcat 的设置 vm 参数 修改 TOMCAT_HOME/bin/catalina.sh 文件&#xff0c;如下图 JAVA_OPTS"-Xms512m -Xmx1024m" 2. springboot 项目 jar 文件启动 通常在linux系统下直接加参数启动springboot项目 nohup java -Xms512m -Xmx1024m -jar…