Linux--Shell基础

学习笔记,记录以下课程中关于Linux的Shell基础知识。

黑马程序员linux入门到精通(下部分)_哔哩哔哩_bilibili

目录

1.编写规范

2.变量

2.1 变量的含义

2.2 变量的定义和使用

2.3 只读变量(了解)

2.4 接收用户输入(重点)

2.5 删除变量(了解)

3.运算符

3.1 算数运算符

3.2 关系运算符

3.3 逻辑运算符

3.4 字符串运算符

3.5 文件测试运算符

4.控制语句

4.1 条件判断语句 

4.2 循环语句

5.shell脚本附带选项(重点)


1.编写规范

1)代码规范:

 # !/bin/bash                文件首行,指定告知系统当前这个脚本要使用的shell解释器

2)文件命名规范:

        文件名.sh                    .sh是Linux下bash shell 的默认后缀

 使用流程:

1)创建.sh文件                touch/vim

2)编写shell代码

3)为文件添加执行权限   chmod  +x  文件

4)执行shell脚本              

        方法1:文件的绝对路径或相对路径

        方法2:/bin/bash  文件名       含义:直接运行解释器,其参数就是 shell 脚本的文件名     

示例1:

创建test.sh,实现第一个shell脚本程序,输出hello world

1)创建文件 

vim test.sh

 2)编写代码

#!/bin/bash
echo "hello world"

【注】输出的内容如果包括字母和符号(不包含变量),则需要用引号括起来。

 3)为文件添加执行权限

chmod +x test.sh

 4)执行shell脚本

./test.sh

注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

示例2:

使用root用户账号创建并执行test1.sh,实现创建一个shelltest用户,并在其家目录中新建try.html

创建文件
vim test1.sh编辑
#!/bin/bash
useradd shelltest;
touch /home/shelltest/try.html权限
chmod +x test1.sh执行文件
/bin/bash test1.sh  或cd到文件目录,执行./test1.sh

2.变量

2.1 变量的含义

         在一个脚本周期内,其值可以发生改变的量就是变量。其中脚本周期可以简单理解为当前的shell文件。

2.2 变量的定义和使用

定义形如:class_name="star"

使用形如:echo $class_name

变量名的规范

注意,变量名后面的等号不能有空格

变量的命名规则如下:

  • 只能使用英文字母,数字和下划线
  • 不能以数字开头
  • 不能使用bash中的关键字(可用help命令查看保留关键字)

示例1:定义一个变量为hello world并输出

创建文件
vim test2.sh 
编辑
#!/bin/bash
str="hello world"
echo $str
权限
chmod +x test2.sh
执行
./test2.sh

关于单双引号的问题:

双引号能够识别变量,双引号能够实现转义(类似于“\*”)

单引号是不能识别变量,只会原样输出,单引号是不能转义的

示例2:定义一个变量输出当前时间,要求格式为“年-月-日 时:分:秒”

创建文件
vim test3.sh
编辑
#!/bin/bash
time=`date -d +"%Y %m %d %H:%M%S"`
echo $time
权限
chmod +x test3.sh
执行
./test3.sh

【注】反引号`(Esc下方的那个键),当在脚本中需要执行一些指令并且将执行的结果赋给变量的时候需要使用“反引号”。 

2.3 只读变量(了解)

语法:readonly 变量名

示例:定义变量a并且其值为10,随后设置为只读变量,再去尝试重新赋值

创建文件
vim test4.sh
编写脚本
#!/bin/bash
a=10
readonly a
a=20
echo $a
权限
chmod +x test4.sh
执行
./test4.sh
2.4 接收用户输入(重点)

 语法:read -p 提示信息 变量名

示例:  提示用户输入文件路径并创建。

#! /bin/bash
read -p  '请输入需要创建的文件路径:'   filepath
touch  $filepath
echo  '创建文件成功!'
ls  -l  $filepath

执行文件 

2.5 删除变量(了解)

语法:unset 变量名

示例:定义变量b=20,再输出b的值,随后删除b ,最后再输出下b

#!/bin/bash
b=20
echo $b
unset b
echo $b

 

3.运算符

3.1 算数运算符

 下表列出了常用的算数运算符,假定变量a为10,变量b为20:

运算符说明举例
+加法`expr $a + $b` 结果为30
-减法`expr $a - $b` 结果为-10
*乘法`expr $a \* $b` 结果为200
/除法`expr $b / $a` 结果为2
%取余`expr $b  $a` 结果为0
=赋值a=$b 将变量b的值赋给a
==相等,相等返回true[ $a == $b ]  返回false
!=不等,不等返回true[ $a != $b ]   返回true

 注意:条件表达式要放在方括号之间,并且要有空格,例如:[$a==$b]是错误的,必须写成

[ $a == $b ]

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr(常用)。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 ' ):

#!/bin/bash

val=`expr 2 + 2`

echo "两数之和为:$val"

注意两点:

表达式和运算符之间要有空格,例如 2+2 是错误写法,必须写成 2 + 2。

完整的表达式要被反引号``包含,注意这个字符不是单引号',它在Esc键下边。

#!/bin/bash
#两个变量的初始化赋值
a=0
b=20echo "a=$a"
echo "b=$b"echo ''
echo 'a + b = ' expr $a + $b
echo 'a - b = ' expr $a - $b
echo 'a * b = ' expr $a \* $b
echo 'b / a = ' expr $b / $a
echo 'b % a = ' expr $b % $aif [ $a == $b ]
thenecho 'a等于b'
elseecho 'a不等于b'
fi

 

3.2 关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量a为10,变量b为20。

运算符说明举例
-eqequal,检测两个数是否相等,相等返回true[ $a -eq $b ] 返回 false
-nenot equal,检测两个数是否相等,不相等返回true[ $a -ne $b ] 返回true
-gt

great than,检测左边的数是否大于右边的,

如果是,则返回true

[ $a -gt $ $b ] 返回false
-lt

less than,检测左边的数是否大于右边的,

如果是,则返回true

[ $a -lt $b ] 返回true
-gegreat than or equal ,检测左边的数是否大于等于右边的,如果是,则返回true[ $a -ge $b ] 返回false
-leless than or equal,检测左边的数是否小于等于右边的,如果是,则返回true[ $a -le $b ] 返回true

示例

进行简单的比较 

#!/bin/bash
a=10
b=20echo "a = $a"
echo "b = $b"
#无输出内容,则输出空白行
echo
#判断a与b的关系
if [ $a -eq $b ]
thenecho 'a = b'
elif [ $a -gt $b ]
thenecho 'a > b'
elseecho 'a < b'
fi

 

写一个脚本,判断当前输入的用户是否存在,如果存在则提示“用户存在”否则提示“用户不存在”

#!/bin/bash
read -p '请输入所要查询的用户名:' username
count=`cat /etc/passwd | grep $username | wc -l `
if [ $count -gt  0  ]
thenecho '该用户存在'
elseecho '该用户不存在'
fi

3.3 逻辑运算符

下表列出了常用的布尔运算符,假定变量a为10,变量b为20: 

运算符说明举例
!

非运算,

表达式为 真 则返回false,否则返回true

[ ! false ] 返回 true
-o

or,或运算,

有一个表达式为真,则返回true

[ $a -lt 20 -o &b -gt 30]

返回true

-a

and,与运算,

全部表达式为真,才返回true

[ $a -lt 20 -o &b -gt 30]

返回fals

#!/bin/bash
a=10
b=20if [ !false ]
thenecho '真'
fi#或运算
if [ $a -lt 20 -o $b -gt 30 ]
thenecho '真'
elseecho '假'#与运算
if [ $a -lt 20 -a $b -gt 30 ]
thenecho '真'
elseecho '假'
3.4 字符串运算符

 下表列出了常用的字符串运算符,假定变量a为“abc”,变量b为“efg”

运算符说明举例
=两个字符串是否相等,相等返回true[ $a = $b ] 返回 false
!=两个字符串是否相等,不相等返回true[ $a != $b ] 返回 true
-z检测字符串长度是否为0,为0返回 true[ -z $a ] 返回 false
-n检测字符串长度是否为0,不为0返回 true[ -n $a ] 返回 true
str检测字符串是否为空,不为空返回 true

[ $a ] 返回 true

#!/bin/bash
a=abc
b=efgif [ $a != $b ]
then echo 'true'
elseecho 'false'
fiif [ -z $a ]
thenecho 'true'
elseecho 'false'
fi

3.5 文件测试运算符

文件测试运算符用于检测 Unix/Linux 文件的各种属性。

属性检测描述如下: 

操作符说明举例
-b file

检测文件是否块设备文件,

如果是,则返回true

[ -b $file ] 返回 false
-c file

检测文件是否是文字设备文件,

如果是,则返回true

[ -c $file ] 返回 false
-d file

检测文件是否是字符设备文件,

如果是,则返回true

[ -d $file ] 返回 false
-f file

检测文件是否是普通文件(既不是目录,也不是设备文件)。

如果是,则返回 true

[ -f $file ] 返回 true
-q file

检测文件是否设置了 SGID 位,

如果是,则返回 true

[ -q $file ] 返回 false
-k file

检测文件是否设置了黏着位(Sticky Bit )

如果是,则返回 true

[ -k $file ] 返回 false
-p file

检测文件是否有名管道,

如果是,则返回 true

[ -p $file ] 返回 false
-u file

检测文件是否设置了 SUID 位,

如果是,则返回 true

[ -u $file ] 返回 false
-r file

检测文件是否可读,

如果是,则返回 true

[ -r $file ] 返回 true
-w file

检测文件是否可写,

如果是,则返回 true

[ -w $file ] 返回 true
-x file

检测文件是否可执行,

如果是,则返回 true

[ -x $file ] 返回 true
-s file

检测文件是否为空(文件大小是否大于0)

不为空返回 true

[ -s $file]
-e file

检测文件(包括目录)是否存在,

如果是,则返回true

[ -e $file ] 返回 true

示例:测试上述标绿的语法

#!/bin/bash#定义文件的路径
filepath='/root/sss.txt'#判断是否是目录
if [ -d  $filepath ]
thenecho '是目录'
elseecho '不是目录'
fi#判断是否是具有可读权限
if [ -r $filepath ] 
then echo '可读'
elseecho '不可读'
fi

 使用-e运算符,改写“1.4 接收用户输入” 的案例,在创建文件的时候需要先判断是否存在,如果存在则提示用户并且不执行创建操作,如果不存在则创建。

#!/bin/bash
read -p '请输入需要创建的文件名称:' filepathif [ -e $filepath ]
thenecho '该文件已存在'
elsetouch $filepathecho '创建成功!'
fi

4.控制语句

4.1 条件判断语句 

if语句 

语法1(一个条件): 

if condition
thencommand1command2...
fi单行写法:
if [condition];then command;fi

语法2(两个条件):

if condition
thencommand1command2...
elsecommand
fi

语法3(多个条件) :

if condition1
thencommand1
elif conditon2
thencommand2
elsecommandN
fi

case语句

case expression in
pattern1)commands;;
pattern2)commands;;
...
esac

实现加减乘除

read -p "请输入第一个操作数:"   num1
read -p "请输入操作符(+、-、*、/):"    operator
read -p "请输入第二个操作数:"   num2case $operator in
"+")
result=$(($num1+$num2))
echo "计算结果为:$result"
;;
"-")
result=$(($num1-$num2))
echo "计算结果为:$result"
;;
"")
result=$(($num1*$num2))
echo "计算结果为:$result"
;;
"/")
result=$(($num1/$num2))
echo "计算结果为:$result"
;;
*)
echo "输入的操作符有误!"
;;
esac
4.2 循环语句

1)for 

for var in list
docommands
done

输出1到10

for i in {1..10}
doecho $i
done

2)while

while condition
docommands
done

输出1到10

i=1
while [ $i -le 10 ]
doecho $ii=$(($i+1))
done

5.shell脚本附带选项(重点)

这个功能可以简单理解为函数传参 ,利用脚本文件中的  $序号  ,可以接收外部参数。

例如:

传递:
./test.sh  a  b  c接收:
在脚本中可以用“$1”来表示 a ;
“$2”来表示 b ,以此类推。

 接收可以用“$”加上选项对应的序号即可。

示例:

1.编写test.sh,传递a,b,c,输出其值。 

#!/bin/bash
echo $1 $2 $3

 

2.创建自定义指令“user”,可以直接执行, 要求该指令具备以下语法和功能:

a.user -add 用户名         【添加用户】

b.user -del 用户名          【删除用户及其家目录】 

脚本文件编辑 

#!/bin/bash
if [ $1 = '-add'  ]
thenuseradd $2
elif [ $1 = '-del'  ]
thenuserdel -r $2
elseecho "命令输入错误"
fi

修改自启动文件,给该脚本文件设置别名,让执行该脚本像指令一样执行。

vim ~/.bashrc

 重新执行刚修改的文件

source .bashrc

测试命令:

user -add abc

使用命令 cat /etc/passwd ,可查看用户信息

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

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

相关文章

Github 2024-02-02开源项目日报Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-02统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目6HTML项目2TypeScript项目2C#项目1JavaScript项目1 ChatGPT提示库 创建周期&#xff1a;424 天开…

用Python处理TDC激光测距数据并绘制为图片

用Python处理TDC激光测距数据并绘制为图片 说明一、定义全局变量变二、主函数入口三、处理原始文件数据四、将数据叠加统计生成图片五、额外的辅助函数六、将数据进行各种形式统计叠加七、原始数据形式八、 测试结果 说明 1. 主要是将TDC激光测距数据进行统计叠加并绘制为图片…

【数据结构(C语言)】树、二叉树详解

目录 文章目录 前言 一、树的概念及结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用 二、二叉树的概念及结构 2.1 二叉树的概念 2.2 二叉树的基本形态 ​编辑2.3 特殊的二叉树 2.4 二叉树的性质 2.5 二叉树的存储结构 三、二叉树的顺序结…

C语言实现12种排序算法

1.冒泡排序 思路&#xff1a;比较相邻的两个数字&#xff0c;如果前一个数字大&#xff0c;那么就交换两个数字&#xff0c;直到有序。 时间复杂度&#xff1a;O(n^2)&#xff0c;稳定性&#xff1a;这是一种稳定的算法。 代码实现&#xff1a; void bubble_sort(int arr[],…

服务攻防-端口协议桌面应用QQWPS等RCEhydra口令猜解未授权检测

知识点&#xff1a; 1、端口协议-弱口令&未授权&攻击方式等 2、桌面应用-社交类&文档类&工具类等 章节点&#xff1a; 1、目标判断-端口扫描&组合判断&信息来源 2、安全问题-配置不当&CVE漏洞&弱口令爆破 3、复现对象-数据库&中间件&…

【Jenkins】配置及使用|参数化|邮件|源码|报表|乱码

目录 一、Jenkins 二、Jenkins环境搭建 1、下载所需的软件包 2、部署步骤 3、其他 三、Jenkins全局设置 &#xff08;一&#xff09;Manage Jenkins——Tools系统管理->全局工具配置分别配置JDK、Maven、Allure、Git&#xff0c;可以配置路径或者直接选择版本安装 1…

判断当前设备是不是安卓或者IOS?

代码(重要点): 当前文件要是 xxx.js文件,就需要写好代码后调用才会执行: // 判断是不是安卓 const isAndroid () > {return /android/.test(navigator.userAgent.toLowerCase()); }// 判断是不是ios const isIOS () > {return /iphone|ipad|ipod/.test(navigator.use…

JUC并发编程01——进程,线程(详解),并发和并行

目录 1.进程和线程的概念及对比1.进程概述 2.线程3.对比 2.并行与并发1.并发2.并行 3.线程详解3.1.创建和运行线程3.1.1.Thread3.1.2.Runnable结合Thread 创建线程3.1.3.Callable 3.2线程方法APIrun startsleep yieldjoininterrupt打断线程打断 park终止模式 daemon不推荐使用的…

Kotlin 协程:用源码来理解 ‘viewModelScope‘

Kotlin 协程&#xff1a;用源码来理解 ‘viewModelScope’ Kotlin 协程是 Kotlin 语言的一大特色&#xff0c;它让异步编程变得更简单。在 Android 开发中&#xff0c;我们经常需要在后台线程执行耗时操作&#xff0c;例如网络请求或数据库查询&#xff0c;然后在主线程更新 UI…

坚持刷题 | 完全二叉树的节点个数

Hello&#xff0c;大家好&#xff0c;我是阿月&#xff01;坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天刷&#xff1a;完全二叉树的节点个数 题目 222.完全二叉树的节点个数 代码实现 class TreeNode {int val;TreeNode left, right;public TreeNode(int val) …

Android进阶之路 - ViewPager2 比 ViewPager 强在哪?

我记得前年&#xff08;2022&#xff09;面试的时候有被问到 ViewPager 和 ViewPager2 有什么区别&#xff1f;当时因为之前工作一直在开发售货机相关的项目&#xff0c;使用的技术要求并不高&#xff0c;所以一直没去了解过 ViewPager2~ 去年的时候正好有相关的功能需求&#…

数学建模 - 线性规划入门:Gurobi + python

在工程管理、经济管理、科学研究、军事作战训练及日常生产生活等众多领域中&#xff0c;人们常常会遇到各种优化问题。例如&#xff0c;在生产经营中&#xff0c;我们总是希望制定最优的生产计划&#xff0c;充分利用已有的人力、物力资源&#xff0c;获得最大的经济效益&#…

pytorch_car_caring 排坑记录

pytorch_car_caring 排坑记录 任务踩坑回顾简单环境问题代码版本问题症状描述解决方法 cuda问题&#xff08;异步问题&#xff09;症状描述解决方法 任务 因为之前那个MPC代码跑出来的效果不理想&#xff0c;看了一天代码&#xff0c;大概看明白了&#xff0c;但要做改进还要有…

R-YOLO

Abstract 提出了一个框架&#xff0c;名为R-YOLO&#xff0c;不需要在恶劣天气下进行注释。考虑到正常天气图像和不利天气图像之间的分布差距&#xff0c;我们的框架由图像翻译网络&#xff08;QTNet&#xff09;和特征校准网络&#xff08;FCNet&#xff09;组成&#xff0c;…

【数睿】数睿常见问题处理

连接器请求地址修改 cat /home/sdata2/tomcat/bin/setenv.sh修改里面的 SYSTEM_URL 为数睿服务实际访问地址 如图所示 连接器执行 异常日志 2024-01-23 18:01:49,586 (conf-file-poller-0) [ERROR - org.apache.flume.node.PollingPropertiesFileConfigurationProvider$Fil…

全链路压测的关键点是什么?

全链路压测是一种重要的性能测试方法&#xff0c;用于评估应用程序或系统在真实生产环境下的性能表现。通过模拟真实用户行为和流量&#xff0c;全链路压测能够全面评估系统在不同负载下的稳定性和性能表现。本文将介绍全链路压测的关键点&#xff0c;以帮助企业更好地理解和应…

Redis核心技术与实战【学习笔记】 - 10.浅谈CPU架构对Redis性能的影响

概述 可能很多人都认为 Redis 和 CPU 的关系简单&#xff0c;Redis 的线程在 CPU 上运行&#xff0c;CPU 快 Reids 处理请求的速度也很快。 其实&#xff0c;这种认知是片面的&#xff0c;CPU 的多核架构及多 CPU 结构&#xff0c;也会影响到 Redis 的性能。如果不了解 CPU 对…

【目标检测】对DETR的简单理解

【目标检测】对DETR的简单理解 文章目录 【目标检测】对DETR的简单理解1. Abs2. Intro3. Method3.1 模型结构3.2 Loss 4. Exp5. Discussion5.1 二分匹配5.2 注意力机制5.3 方法存在的问题 6. Conclusion参考 1. Abs 两句话概括&#xff1a; 第一个真正意义上的端到端检测器最…

实习日志10

1.用户信息 1.1.在用户管理中编辑用户信息 1.2.绑定公司id 1.3.显示在页面 2.修改识别逻辑 2.1.分析 先识别&#xff0c;再判断&#xff0c;清空键把识别结果清空 2.2.写码 修改了发票识别逻辑&#xff0c;略... 3.接高拍仪 3.1.js引入报错 分析&#xff1a; 遇到的错误…

MySQL数据库基础第一篇(SQL通用语法与分类)

文章目录 一、SQL通用语法二、SQL分类三、DDL语句四、DML语句1.案例代码2.读出结果 五、DQL语句1.DQL-基本查询2.DQL-条件查询3.DQL-聚合函数4.DQL-分组查询5.DQL-排序查询6.DQL-分页查询7.DQL语句-执行顺序1.案例代码2.读出结果 六、DCL语句1.DCL-管理用户2.DCL-权限控制1.案例…