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)

大家都在看

  • 6、SQL模糊查询LIKE concat用法

    concat用来拼接查询的字符串: SELECT * FROM page_demo WHERE name LIKE concat(‘%’,#{name},’%’) 模糊查询: 1、…

    数据库 2023年6月6日
    0138
  • 阿里巴巴编码规范-考试认证

    阿里巴巴编码规范-考试认证 雨打梨花深闭门,忘了青春,误了青春。 1、注册阿里云账号 2、购买认证 需要怒支付一顿早餐Q,可以用支付宝支付,选择支付宝支付然后直接输入支付密码就OK…

    数据库 2023年6月14日
    0184
  • MySQL完整版详解

    一、数据库的操作 1.创建数据库 如果您在可视化软件上创建数据库,请参阅下图 [En] If you create a database on a visualization so…

    数据库 2023年5月24日
    0100
  • mysql数据库创建数据库创建用户授权

    Liunx下登录数据库 mysql -u 用户名 -p 创建myblog用户,本地登录,口令是myblog create user ‘myblog’@&#8…

    数据库 2023年6月11日
    0103
  • ES6 Map映射

    ES6 Map映射 Map对象保存的是 键值对。任何类型值(对象或原始值)都可以作为一个键或一个值。 基础用法 //创建 let map = new Map(); //增|改,返回…

    数据库 2023年6月11日
    0103
  • 实时人流量监测——海康威视sdk初体验

    本文主要是博主使用海康SDK进行人流量统计的摸索过程,在这里简单记录一下。 查询文档,能实现人流量统计大概有两种方式,报警或者监听, 这边我选择了监听方式,NET_DVR_Star…

    数据库 2023年6月16日
    0173
  • 使用Typora + 阿里云OSS + PicGo 打造个人图床

    使用Typora + 阿里云OSS + PicGo 打造个人图床 为什么要打造图床? 让笔记远走高飞 试问以下场景: 我们要 markdown 笔记放到某博客上,直接进行复制即可。…

    数据库 2023年6月9日
    0103
  • MySQL查询性能优化七种武器之索引下推

    前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下: MySQL查询性能优化七种武器之索引潜水 MySQL查询性能优化七种武器之链路追踪 今天要讲的是MySQL的另…

    数据库 2023年5月24日
    0105
  • Linux常用指令

    Linux常用指令 到达底部 运行级别有以下几种 0级:关机 1级:单用户 (找回密码) 2级: 多用户没有网络服务 3级: 多用户有网络服务 4级: 系统未使用保留给用户 5级:…

    数据库 2023年6月16日
    098
  • SQLZOO练习二–SELECT from Nobel Tutorial

    We continue practicing simple SQL queries on a single table. This tutorial is concerned wi…

    数据库 2023年6月16日
    086
  • 软件基础的理论(1)

    软件基础的理论 一, 什么是软件产品 它是一个逻辑产品,没有实体,包括程序,文档和数据,需要通过终端设备才能体现出来功能和作用 二, 软件产品的中间过程文档 客户需求 &#…

    数据库 2023年6月16日
    0101
  • 第十九章 基于注解的AOP编程

    组装切面 将2 3 4步放在切面类中: 定义切面类: @Aspect 定义额外功能: @Around 原始方法的运行: ProceedingJoinPoint.proceed() …

    数据库 2023年6月14日
    089
  • 数据库基本知识和MySQL

    数据库的基本知识和MySQL 数据库 数据库 (database) 指保存有组织的数据的容器,人们一般情况说的数据库指的是数据库软件,即数据库管理系统 (DBMS) ,而数据库实确…

    数据库 2023年6月16日
    0135
  • 关于ThreadLocal的一道面试题

    问:上面这段代码会输出什么?为什么? 为什么输出1然后空指针了? 输出1是没有任何问题的。那空指针是为什么呢? 因为这是两个线程,子线程和主线程。子线程设置1,主线程肯定拿不到啊。…

    数据库 2023年6月16日
    0111
  • Database Plus 的云上之旅:SphereEx 正式开源 ShardingSphere on Cloud 解决方案

    作为 Database Plus 设计哲学的最佳实践,Apache 顶级开源项目 ShardingSphere 通过各行业多年的生产环境检验,受到了众多社区爱好者的关注和追捧。而随…

    数据库 2023年6月16日
    091
  • 多线程基础知识!!!

    1.1、继承Thread类(重点) public class MyThread extends Thread{ @Override public void run() { } pu…

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