Linux–>shell

shell是什么

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序。

用户可以用Shell来启动,挂起,停止,编写一些程序。

Linux-->shell

Shell脚本执行方式

脚本格式要求

  1. 脚本以 #!/bin/bash 开头
  2. 脚本需要有可执行权限
  3. 一般shell脚本文件以 .sh 为后缀
  4. 在shell中用 # 表示注释
  5. 多行注释为 起始处 :<结尾处!

创建的shell脚本文件即使是root权限也不会给x执行权限,需要自己增加

脚本常用执行方式

  1. 输入脚本的绝对路径或相对路径

    需要该脚本的执行权限
    2.

sh &#x811A;&#x672C;.sh

这样不需要执行权限 需要cd跳转到存放sh脚本文件的目录下才可使用

Shell变量

Shell变量介绍

  1. Linux的Shell中变量分为, 系统变量用户自定义变量
  2. 系统变量: (HOME) PWD(SHELL) USER等等
  3. 显示当前shell中所有变量
set

Shell用户自定义的变量

基本语法(在 xxx.sh 文件内)

  1. 定义变量
&#x53D8;&#x91CF;=&#x503C;
  1. 输出变量
echo $&#x53D8;&#x91CF;

输出变量为 $变量名
即使是 echo “A=$A”,shell也会将 $变量名 这种格式的认为是变量而不是字符串
必须 变量=值 之间不能存在空格!

  1. 撤销变量
unset &#x53D8;&#x91CF;&#x540D;
  1. 声明静态变量

静态变量不会被反复定义和初始化
静态变量一旦定义就无法unset了

readonly &#x53D8;&#x91CF;&#x540D;=&#x503C;

Shell变量的定义规则

  1. 变量名可以由, 字母数字下划线组成, 不能以数字开头
  2. 等号俩侧不能有空格!
  3. 变量名一般为大写
  4. 如果用变量表示路径的时候必须用大括号!

将指令返回的结果赋值给变量

A=命令
A=$(&#x547D;&#x4EE4;)
A=${&#x547D;&#x4EE4;}       #&#x6700;&#x597D;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#xFF0C;&#x9632;&#x6B62;&#x5728;&#x7528;&#x53D8;&#x91CF;&#x8868;&#x793A;&#x8DEF;&#x5F84;&#x7684;&#x65F6;&#x5019;&#x51FA;&#x9519;&#xFF01;

命令上面是 反引号!在tab键上面一个键

设置环境变量

基本语法

    &#x5C06;shell&#x53D8;&#x91CF;&#x8F93;&#x51FA;&#x4E3A;&#x73AF;&#x5883;&#x53D8;&#x91CF;
  1. 让这个变量可以在其他文件中使用。
  2. 设置环境变量必须在 /etc/profile 文件内
  3. 这个文件也设置jdc等环境变量
  4. 设置环境变量后需要 source 才能让配置生效

1.

export &#x53D8;&#x91CF;&#x540D;=&#x53D8;&#x91CF;&#x503C;

让修改后的配置信息立即生效
2.

source &#x914D;&#x7F6E;&#x6587;&#x4EF6;

查询环境变量的值
3.

echo $&#x53D8;&#x91CF;&#x540D;

位置参数变量

假设我们输入命令

./hello.sh 100 200 300

要想让shell脚本文件获取到这个 100 200 300数据,就可以使用位置参数变量了

基本语法

  • $n
  • n为数字
  • $0 代表命令本身,$1~$9 代表第一个到第9个参数
  • 10以上的参数用 ${10} 这样写
  • $*
  • 这个表示所有参数
  • $*把所有参数当成一个整体
  • $@
  • 这个表示所有参数
  • $# 把所有参数区分当成个体看呆
  • $#
  • 这个代表所有参数的个数

预定义变量

就是shell设计者事先定义好的变量,可以直接在shell脚本中使用。

基本语法

  • [ 当前进程的进程号 ]
  • $? 最好溢出执行的命令的返回状态,如果这个变量值为0,证明上一个命令正确执行,否则就不正确执行

路径 &
这种方式可以让程序在后台执行

运算符

基本语法

$((&#x8FD0;&#x7B97;&#x8868;&#x8FBE;&#x5F0F;))

expr m + n

$[&#x8FD0;&#x7B97;&#x5F0F;]

如果要将expr的运算表达式赋给变量,需要用反引号将其包含起来
expr中符号的用法:
* 乘
/ 除
% 取余
m + n 在expr中需要存在空格!

条件判断

判断语句基本语法 (双分支)

if [ &#x5224;&#x65AD;&#x6761;&#x4EF6; ]
then
    &#x6761;&#x4EF6;&#x4E3A;true&#x6267;&#x884C;&#x7684;&#x8BED;&#x53E5;
else
    &#x6761;&#x4EF6;&#x4E3A;flase&#x6267;&#x884C;&#x7684;&#x8BED;&#x53E5;
fi

简写法:

[ &#x5224;&#x65AD;&#x6761;&#x4EF6; ] && &#x6761;&#x4EF6;&#x4E3A;true&#x6267;&#x884C;&#x8BED;&#x53E5;
  1. 判断条件前后要有空格
  2. if 和条件之间需要空格
  3. [ ]返回false(有空格!)
  4. [ dwadwa ]返回true
  5. 0为true ,>1 为false

常用判断条件

在前面加上 ! 即为否定

比如 ! -f 文件不存在

  1. 字符串之间比较 =
if [ &#x5B57;&#x7B26;&#x4E32;1 = &#x5B57;&#x7B26;&#x4E32;2 ]
  1. 俩个整数的比较
if [ 1 -lt 2 ]

符号 描述 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于
3. 按照文件权限判断

if [ &#x9009;&#x9879; &#x6587;&#x4EF6;&#x8DEF;&#x5F84; ]

符号 描述 -r 有读的权限 -w 有写的权限 -x 有执行的权限
4. 按照文件类型进行判断

if [ &#x7B26;&#x53F7; &#x6587;&#x4EF6;&#x8DEF;&#x5F84; ]

符号 描述 -f 文件存在且是一个常规文件 -e 文件存在 -d 文件存在且是一个目录

流程控制(多分支if)

基本语法

if [ &#x6761;&#x4EF6;&#x5224;&#x65AD; ]
then
    &#x4EE3;&#x7801;
elif [ &#x6761;&#x4EF6;&#x5224;&#x65AD; ]
then
    &#x4EE3;&#x7801;
...

fi

流程控制(case语句)

基本语法

case $&#x53D8;&#x91CF;&#x540D; in
"&#x503C;1")
    &#x4EE3;&#x7801;1
;;
"&#x503C;2")
    &#x4EE3;&#x7801;2
;;
.....

*)
    &#x6700;&#x7EC8;&#x60C5;&#x51B5;
;;
esac

循环

for循环

基本语法1

for &#x53D8;&#x91CF; in &#x503C;1 &#x503C;2 &#x503C;3...

do
&#x4EE3;&#x7801;
done

举例:

for i in $*
do
    echo "num is $i"
done

输入10 11 12
输出 num is 10 11 12
因为$*是把位置参数当成整体

for i in $@
do
    echo "num is $i"
done

输入10 11 12
输出
num is 10
num is 11
num is 12
因为$@是把位置参数当成了个体

基本语法2

for((&#x521D;&#x59CB;&#x53D8;&#x91CF;;&#x5FAA;&#x73AF;&#x6761;&#x4EF6;;&#x53D8;&#x91CF;&#x53D8;&#x5316;))
do
&#x4EE3;&#x7801;
done

举例

从1加到100的值输出显示

SUM=0               #&#x7ED9;SUM&#x53D8;&#x91CF;&#x521D;&#x59CB;&#x5316;
for((i=1;i<=100;i++)) do sum="$[$SUM+$i]" #运算符,这里的sum不加美元符号是因为这里是给sum赋值 done echo "$sum" < code></=100;i++))>

while循环

需要注意的是条件判断前后需要空格

while 和条件之间也需要空格

且这里的条件和for里面循环条件不同, 这里的循环条件要用if里面的规则!

基本语法

while [ &#x6761;&#x4EF6;&#x5224;&#x65AD; ]
do
&#x7A0B;&#x5E8F;
done

举例

从1加到n的值

SUM=0
i=0
while [ $i -le $1 ]
do
    SUM=$[$SUM+$i]
    i=$[$i+1]
done
echo "SUM=$SUM"

read读取控制台输入(相当于scanf,Scanner这种)

基本语法

read (&#x9009;&#x9879;) (&#x53C2;&#x6570;) &#x63A5;&#x53D7;&#x503C;&#x5F97;&#x53D8;&#x91CF;

选项

-p 指定读取值时的提示信息

-t 指定读取值的等待时间,如果未在规定时间输入就不等待

举例

read -p "&#x8BF7;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x503C;num=" NUM

其中NUM1是接受从控制台输入值的变量

-p 后面的内容是从控制台等待读取值的时候的提示信息

这个相当于scanf(“请输入一个值num=%d”,$NUM1)

read -t 10 NUM2

等待10s如果10后没有获取到数值就停止等待

结合起来写法

read -p &#x53C2;&#x6570; -t &#x53C2;&#x6570; &#x63A5;&#x53D7;&#x503C;&#x53D8;&#x91CF;

函数

shell编程有系统函数和自定义函数俩种。

系统函数

常用几个系统函数!多的自己查=-=

basename

功能:返回完整路径最后 / 的部分,常用于获取文件名

基本语法

basename &#x6587;&#x4EF6;&#x8DEF;&#x5F84; &#x6587;&#x4EF6;&#x540E;&#x7F00;

basename会删除掉所有的前缀包括最后一个 ‘/’ 字符,然后将字符串显示出来

举例

basename /home/aaa/text.txt         &#x8FD9;&#x6837;&#x4F1A;&#x8FD4;&#x56DE; text.txt &#x8FD9;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;
basename /home/aaa/text.txt .txt    &#x8FD9;&#x6837;&#x4F1A;&#x8FD4;&#x56DE; text &#x8FD9;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;

dirname

功能:返回完整路径最后 ‘/’ 的前面部分,常用于返回路径部分

基本语法

dirname &#x7EDD;&#x5BF9;&#x8DEF;&#x5F84;

举例

dirname /home/aaa/bbb/a.txt     &#x8FD9;&#x6837;&#x8FD4;&#x56DE; /home/aaa/bbb &#x8FD9;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;

自定义函数

基本语法

function &#x51FD;&#x6570;&#x540D;()
{
    &#x4EE3;&#x7801;&#x5757;;
    return $&#x53D8;&#x91CF;  #&#x5982;&#x679C;&#x4E0D;&#x9700;&#x8981;&#x8FD4;&#x56DE;&#x503C;&#x5C31;&#x53EF;&#x4EE5;&#x4E0D;&#x5199;return
}

调用方法

&#x51FD;&#x6570;&#x540D; &#x503C;1 &#x503C;2 &#x503C;3....

自定义函数的括号里面不需要加形参!

在自定义函数内部的 $1,$2是形参,代表的是
函数名 值1 值2 值3
$1是值1,$2是值2

一般的我们会在调用函数后使用 $? 来调用结果

但是这个只能获取到0到255之间的数

常用几种写法

写法1

function add()
{
    s=$[ $1 + $2 ]
    retrun $s
}
read -p "&#x7B2C;&#x4E00;&#x4E2A;&#x503C;" a
read -p "&#x7B2C;&#x4E8C;&#x4E2A;&#x503C;" b
add $a $b
echo $?     #&#x524D;&#x9762;&#x4E00;&#x6761;&#x547D;&#x4EE4;&#x6267;&#x884C;&#x7684;&#x7ED3;&#x679C;&#x4EE3;&#x7801;&#xFF0C;&#x8FD9;&#x4E2A;&#x7ED3;&#x679C;&#x4EE3;&#x7801;&#x53EA;&#x80FD;&#x8FD4;&#x56DE;0--255

解决return只能返回0~255的方法

举例:

function add()
{
    s=$[ $1 + $2 ]      #&#x8FD9;&#x91CC;&#x7684;1&#x548C;2&#x662F;&#x5F62;&#x53C2;&#xFF0C;&#x4EE3;&#x8868;a&#xFF0C;b&#x7684;&#x503C;
    echo $s     #&#x6253;&#x5370;&#x8F93;&#x51FA;s&#x7684;&#x53D8;&#x91CF;&#x503C;
}
read -p "&#x7B2C;&#x4E00;&#x4E2A;&#x6570;=" a
read -p "&#x7B2C;&#x4E8C;&#x4E2A;&#x6570;=" b
sum=$(add $a $b)    #&#x6253;&#x5370;&#x8F93;&#x51FA;&#x7684;&#x503C;&#x8D4B;&#x7ED9;sum&#x53D8;&#x91CF;&#xFF01;
echo $sum

局部变量

一般用于定义局部变量,用于函数体内, 作用域为定义位置开始到函数结束

local &#x53D8;&#x91CF;&#x540D;=&#x503C;

这样定义的是局部变量

Original: https://www.cnblogs.com/wdadwa/p/Linux_Learning_11.html
Author: wdadwa
Title: Linux–>shell

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611726/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Tomcat8下的Redis会话共享

    前言: 最近在做网站的升级,从 Tomcat7升级到 Tomcat8版本,因为没接触过,就以为升级下Tomcat的版本就万事大吉,可是天不如人愿,很顺利的将应用升级到了Tomcat…

    数据库 2023年6月14日
    0100
  • 计算机图形学

    计算机图形学 光追一般指光线追踪。 光线跟踪(也叫ray tracing或者光束投射法)。是一个在二维(2D)屏幕上呈现三维(3D)图像的方法。 BRDF是双向反射分布函数(Bid…

    数据库 2023年6月14日
    065
  • [Mysql]Ubuntu如何安装Mysql+启用远程连接[完整版]

    嗯。以下是我踩了好几个小时的所有坑总结出来的血泪史。我希望我能帮你少踩几个坑。正常情况下,一步一步地,不会有任何问题。 [En] Yeah. The following is th…

    数据库 2023年5月24日
    089
  • SQL Server如何修改登录密码

    SQL Server如何修改登录密码 我们在打开SQLserver的时候一般选择的是”Windows身份认证”进行登录,如果选择混合模式该怎么登录呢?或者忘…

    数据库 2023年6月9日
    082
  • MySQL实战45讲 16

    16 | “order by”是怎么工作的? 以市民表为例,假设要查询城市是”杭州”的所有人名字,并且按照姓名 排序返回前 1000…

    数据库 2023年6月14日
    085
  • Linux的一些的常用命令

    小杰笔记: 记录一下Linux的一些常见命令: 1:Linux关机与重启的命令: 2:切换目录与查看目录的文件: 3:文件目录的创建与删除: 4:文件的复制 删除与移动: 5:如何…

    数据库 2023年6月6日
    064
  • redis 从安装到实现远程连接–centos7下

    Java 端配置 上面的配置完成后,我们可以创建一个普通的 JavaSE 工程来测试下了,Java 工程创建成功后,添加 Jedis 依赖,如下 然后我们可以通过如下一个简单的程序…

    数据库 2023年6月16日
    073
  • Typora加七牛云实现实时图片自动上传

    Typora加七牛云实现实时图片自动上传 前言: ​ Typora是一款轻便简洁的Markdown编辑器,支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别.重点是免…

    数据库 2023年6月9日
    0188
  • ShardingSphere 云上实践:开箱即用的 ShardingSphere-Proxy 集群

    本次 Apache ShardingSphere 5.1.2 版本更新为大家带来了三大全新功能,其中之一即为使用 ShardingSphere-Proxy chart 在云环境中快…

    数据库 2023年6月16日
    082
  • MySQL实战45讲 3

    03 | 事务隔离:为什么你改了我还看不见? 事务 Transaction TRX 事务就是 要保证一组数据库操作,要么全部成功,要么全部失败。 MySQL 原生的 MyISAM …

    数据库 2023年5月24日
    067
  • MySQL 事务和锁

    事务概述 当多个用户访问相同的数据时,在更改数据的过程中,其他用户可能会同时发起更改请求,为了确保数据库记录的更新从一种一致性状态更改为另一种一致性状态,需要使用事务处理,它具有以…

    数据库 2023年5月24日
    059
  • Matplotlib(基本用法)

    Matplotlib 是数据分析绘图的常见模块,可以算是 2D-绘图(Python)领域使用最广泛的套件,可以将数据图形化,并且提供多样化的输出格式,利于数据的显示并分析。 接下来…

    数据库 2023年6月16日
    079
  • python中的cls和self区别

    self:Always use self for the first argument to instance methods self是作为类进行实例化传递的第一个参数,也就是我…

    数据库 2023年6月6日
    057
  • Javaweb-文件上传和邮件发送

    1.文件上传 新建空项目 准备工作 在maven仓库里下载commons io 和 commons fileupload两个jar包 实用类介绍 文件上传注意事项 为保证服务器安全…

    数据库 2023年6月16日
    080
  • 时序数据库InfluxDB的基本语法

    一 了解InfluxDB的必要性 Time series data is a series of data points each associated with a specif…

    数据库 2023年6月16日
    088
  • 记一次部署系列:prometheus通过pushgateway配置自定义监控项

    1、部署pushgateway并配置prometheus能够拿到pushgateway的数据,类似下图。部署过程参考:https://www.cnblogs.com/sunnyto…

    数据库 2023年6月9日
    0215
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球