Linux--Shell基础

news2024/11/26 8:45:13

学习笔记,记录以下课程中关于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=20

echo "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 % $a

if [ $a == $b ]
then
        echo 'a等于b'
else
        echo '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=20

echo "a = $a"
echo "b = $b"
#无输出内容,则输出空白行
echo
#判断a与b的关系
if [ $a -eq $b ]
then
    echo 'a = b'
elif [ $a -gt $b ]
then
    echo 'a > b'
else
    echo 'a < b'
fi

 

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

#!/bin/bash
read -p '请输入所要查询的用户名:' username
count=`cat /etc/passwd | grep $username | wc -l `
if [ $count -gt  0  ]
then
        echo '该用户存在'
else
        echo '该用户不存在'
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=20

if [ !false ]
then
    echo '真'
fi

#或运算
if [ $a -lt 20 -o $b -gt 30 ]
then
    echo '真'
else
    echo '假'

#与运算
if [ $a -lt 20 -a $b -gt 30 ]
then
    echo '真'
else
    echo '假'
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=efg

if [ $a != $b ]
then 
    echo 'true'
else
    echo 'false'
fi

if [ -z $a ]
then
    echo 'true'
else
    echo '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 ]
then
	echo '是目录'
else
	echo '不是目录'
fi

#判断是否是具有可读权限
if [ -r $filepath ] 
then 
	echo '可读'
else
	echo '不可读'
fi

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

#!/bin/bash
read -p '请输入需要创建的文件名称:' filepath

if [ -e $filepath ]
then
        echo '该文件已存在'
else
        touch $filepath
        echo '创建成功!'
fi

4.控制语句

4.1 条件判断语句 

if语句 

语法1(一个条件): 

if condition
then
    command1
    command2
    ...
fi

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

语法2(两个条件):

if condition
then
    command1
    command2
    ...
else
    command
fi

语法3(多个条件) :

if condition1
then
    command1
elif conditon2
then
    command2
else
    commandN
fi

case语句

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

实现加减乘除

read -p "请输入第一个操作数:"   num1
read -p "请输入操作符(+、-、*、/):"    operator
read -p "请输入第二个操作数:"   num2
 
case $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
do
    commands
done

输出1到10

for i in {1..10}
do
    echo $i
done

2)while

while condition
do
    commands
done

输出1到10

i=1
while [ $i -le 10 ]
do
    echo $i
    i=$(($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'  ]
then
        useradd $2
elif [ $1 = '-del'  ]
then
        userdel -r $2
else
        echo "命令输入错误"
fi

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

vim ~/.bashrc

 重新执行刚修改的文件

source .bashrc

测试命令:

user -add abc

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

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

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

相关文章

Linux 命令 —— top

Linux 命令 —— top 相对于 ps 是选取一个时间点的进程状态&#xff0c;top 则可以持续检测进程运行的状态。使用方式如下&#xff1a; 用法&#xff1a; top [-d secs] | [-p pid] 选项与参数&#xff1a; -d secs&#xff1a;整个进程界面更新 secs 秒。默认是 5 5 5 秒。…

遇到ubuntu设置交叉编译环境的问题

今天交叉编译器一直没安装成功&#xff0c;环境变量也配置了还是不对&#xff0c;最后发现Ubuntu是64位的要装 然后就好了 另外在进行嵌入式Linux开发的时候&#xff0c;要把主机、虚拟机、以及开发板设置在同一网段下&#xff0c;虚拟机一般设成临时的就可以&#xff0c;但是…

力扣之2648.生成 斐波那契数列(yield)

/*** return {Generator<number>}*/ var fibGenerator function*() {let a 0,b 1;yield 0; // 返回 0&#xff0c;并暂停执行yield 1; // 返回 1&#xff0c;并暂停执行while(true) {yield a b; // 返回 a b&#xff0c;并暂停执行[a, b] [b, a b]; // 更新 a 和 …

使用Pycharm在本地调用chatgpt的接口

目录 1.安装环境 2.建立多轮对话的完整代码&#xff08;根据自己使用的不同代理需要修改端口&#xff08;port&#xff09;&#xff09; 3.修改代码在自己的Pycharm上访问chagpt的api并实现多轮对话&#xff0c;如果不修改是无法成功运行的。需要确定秘钥和端口以保证正常访…

使用pygame建立一个简单的使用键盘方向键移动的方块小游戏

import pygame import sys# 初始化pygame pygame.init()# 设置窗口大小 screen_size (640, 480) # 创建窗口 screen pygame.display.set_mode(screen_size) # 设置窗口标题 pygame.display.set_caption("使用键盘方向键移动的方块的简单小游戏")# 设置颜色 bg_colo…

CHS_08.2.3.6_1+生产者-消费者问题

CHS_08.2.3.6_1生产者-消费者问题 问题描述问题分析思考&#xff1a;能否改变相邻P、V操作的顺序&#xff1f;知识回顾 在这个小节中 我们会学习一个经典的进程同步互斥的问题 问题描述 并且尝试用上个小节学习的p v操作 也就是信号量机制来解决这个生产者消费者问题 问题的描…

基于GAN-CNN-CNN的鲁棒笔迹识别方法(三)

上一篇文章提出了一个用于笔迹识别(鉴别)的三段式模型,同时也提出了一个新数据集HTID_1,本文主要针对模型的最后一部分--笔迹识别,在HTID_1上进行实验. 数据集 实验前先介绍一下HTID_1. HTID_1是用于笔迹识别的数据集,是基于本文提出的模型制作而成的.将互联网上收集的740人笔…

Unity Shader 滚动进度条效果

Unity Shader 滚动进度条效果 前言项目场景布置导入图片修改场景设置修改图片尺寸即可调整进度 ASE连线 前言 UI要实现一个滚动进度&#xff0c;于是使用Shader制作一个。 项目 场景布置 导入图片 修改一下导入图片的格式&#xff0c;这样才能循环起来 WrapMode改为Repea…

2024/2/1学习记录

echarts 为柱条添加背景色&#xff1a; 若想设置折线图的点的样式&#xff0c;设置 series.itemStyle 指定填充颜色就好了&#xff0c;设置线的样式设置 lineStyle 就好了。 在折线图中倘若要设置空数据&#xff0c;用 - 表示即可&#xff0c;这对于其他系列的数据也是 适用的…

Windows11 用 HyperV 安装 Ubuntu-16.04 虚拟机

Windows11 用 HyperV 安装 Ubuntu-16.04 虚拟机 1. 确保已经开启HyperV2. 准备Ubuntu16.04镜像&#xff08;推荐64位的&#xff09;3. HyperV ->快速创建 -> 更改安装源 选刚刚下载的镜像&#xff08;.iso&#xff09;文件就好 -> 创建虚拟机[^1] 前提&#xff1a;VMw…

(硬核中的硬核)链路追踪落地过程中的挑战与解决方案

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是蓝胖子&#x1f947; ☁️博客首页&#xff1a;CSDN主页蓝胖子的编程梦 &#x1f304;每日一句&#xff1a;编程中我们会遇到多少挫折&#xff1f;表放弃&#xff0c;沙漠尽头必是绿洲。 大家好&#xff0c;我是蓝胖子…

【Qt加密播放器】登录窗口功能补充

输入框小设计 目的&#xff1a;实现鼠标点击输入框时的聚焦效果。 首先在LoginForm构造函数中为账号和密码输入框添加事件过滤器。关于事件过滤器的具体介绍可以参考这篇博文&#xff1a;Qt消息机制和事件 ui->nameEdit->installEventFilter(this); ui->pwdEdit->…

uniapp+微信小程序+nodejs问题记录

一、前言 通过uniapp进行微信小程序调试。服务端使用NodeJs。 二、报错统计 1、本地调试时微信小程序报错&#xff1a;request:Cannot send network request to localhost 解决方法&#xff1a; 【微信小程序开发平台】-【本地设置】-勾选“不校验合法域名、web-view、TLS版本…

Python完善APC netbotz 250报告功能实现主动式运维。

首先介绍一下APC netbotz 250, 这是施耐德推出的一款机架式监控主机&#xff0c;能够对所有IT环境进行经济有效而且灵活的监控&#xff0c;号称APC史上性价比最高的环境监测方案&#xff0c;这可不是我吹的&#xff0c;是APC官网的介绍&#xff0c;可参考下面的官网截图。 我们…

Visual Studio 2022编译错误 Error MSB8041-此项目需要MFC库解决方案

Visual Studio 2022编译错误 Error MSB8041-此项目需要MFC库 错误原因&#xff1a; Visual Studio 2022安装的MFC库不够。 解决方案&#xff1a; 安装Visual Studio 2022 需要的MFC 库就可以了。 安装方法&#xff1a; 第一步&#xff0c;打开vs2022 工具 ->获取工具和功…

数据可视化Tableau

目录 一.第一次实验课内容 1、熟悉Tableau Desktop的工作环境。 2、熟悉数据导入、维度和度量的区分以及不同数据字段类型的标识符。 3、熟悉工作表的基本操作&#xff0c;主要包括行列功能区&#xff0c;标记卡&#xff0c;筛选器&#xff0c;智能推荐的使用。 4、作业--…

两个链表的第一个重合节点

法一&#xff1a;蛮力法 即顺序遍历第一个链表的每个节点&#xff0c;每遍历到一个节点&#xff0c;就在第二个链表中顺序遍历每个节点&#xff0c;比较是否有节点相同。该方法的时间复杂度是O&#xff08;mn&#xff09;&#xff0c;空间复杂度是O&#xff08;1&#xff09;。…

Java进击框架:Spring-综合(十)

Java进击框架&#xff1a;Spring-综合&#xff08;十&#xff09; 前言Rest ClientsWebClientRestTemplateHTTP接口 JMS (Java消息服务)使用Spring JMS发送消息接收消息注释驱动的侦听器端点 JMXEmail任务执行和调度Spring TaskExecutor 抽象Spring TaskScheduler 抽象支持调度…

cuda基础教程(一)

文章目录 0. CURA Runtime API1. CUDA人工智能编程1.1. CUDA介绍1.2. 课程内容 2. 异构计算和并行计算2.1. 什么是并行计算2.2. 什么是异构计算 3. CUDA介绍3.1. GPU的性能指标3.2. 什么是CUDA3.3. 如何学习CUDA 4. 系统GPU查询5. Linux系统6. CUDA安装7. 查询GPU信息8. CUDA编…

[C#][opencvsharp]winform实现自定义卷积核锐化和USM锐化

【锐化介绍】 图像锐化(image sharpening)是补偿图像的轮廓&#xff0c;增强图像的边缘及灰度跳变的部分&#xff0c;使图像变得清晰&#xff0c;分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓&#xff0c;或某些线性目标要素的特征。这种滤波方法…