Shell基础 (一)

news2024/11/25 9:35:56

目录

一、关于shell

1、什么是shell?

2、shell入门

二、shell进阶(重点)

1、变量

         2、条件判读语句

         3、运算符


一、关于shell

1、什么是shell?

Shell(外壳)是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。

Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

什么是脚本?

脚本简单地说就是一条条的文字命令,这些文字命令是可以看到的(如:可以用记事本打开查看、编辑)。

常见的脚本:JavaScript(简称js,常用的前端的脚本语言)、VBScript、ASP、JSP、PHP(传说中的3P,其中是ASP最为古老,JSP和PHP是后端的脚本语言)、SQL、Perl、Shell、Python、Rudy(小日本发展的)、JavaFX、Lua等。

为什么要学习shell?

程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务。(shell属于内置的脚本)
语法简单,代码写起来比较优雅,但算不上优雅。

常见的shell种类?

在Linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是**/bin/bash**,流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点和用途。(cat /etc/shells)

csh
C shell 使用的是“类C”语法,csh是具有C语言风格的一种shell,其内部命令有52个,较为庞大。目前使用的并不多,已经被**/bin/tcsh**所取代。

ksh
Kron shell 的语法与Bourne shell 相同,同时具备了C shell的易用特点。许多安装脚本都使用ksh,ksh有42条内部命令,与bash相比有一定限制性。

tcsh
tcsh是csh的增强版,与C shell完全兼容。

sh
sh是一个快捷方式,已经被**/bin/bash**所取代。

nologin
指用户不能登录(vi /etc/passwd 进行查找)

zsh
目前Linux里最庞大的一种shell:zsh。它有84个内部命令,使用起来也比较复杂,一般情况下,不会使用该shell。

bash
大多数Linux系统默认使用的shell,bash shell 是 Bourne shell 的一个免费版本,它是最早的Unix shell,bash还有一个特点,可以通过help命令来查看帮助。包含的功能几乎可以涵盖shell所具有的功能,所以一般的shell脚本都会指定它为执行路径。

2、shell入门

  • 编写规范
#!/bin/bash   [指定告知系统当前这个脚本要使用的Shell解释器,虽然是个注释但一定要写]
Shell相关的指令
  • 文件命名规范问题
文件名.sh		[指示强调它是shell文件,跟上面的种类没有关系。]
注意:见名知意。不要他妈的取中文和加空格,虽然没影响,但是后期随着代码或者项目的改变容易出错。

使用流程

  1. 创建.sh文件 touch(先创建,在编写)或者vim
  2. 编写shell代码
  3. 执行shell脚本 脚本必须有执行权限,你只给我一个可读权限,我执行************

案例1:创建test.sh,实现第一个shell 脚本程序,输出Hello World!

# 1、创建文件
touch test.sh
# 2、编写shell代码
vim test.sh
	#!/bin/bash
	echo 'Hello World!'
	注意:输出的内容如果包含字母和符号(不包含变量),则需要用引号包括起来。如果是纯数字可以包也可以不包。
	代码结尾的分号也是可加可不加,什么时候加呢?当你一行要写两个代码的时候,需要加。换行则不需要。通常脚本里面呢都不会加分号。
ll test.sh    执行该命令发现他并没有执行权限
chmod +x test.sh	赋值执行权限
ll test.sh		再次查看
# 3、执行
./test.sh
注意:这里在运行的时候一定要写./test.sh,而不是test.sh,直接写test.sh,Linux系统回去PATH(环境变量)里寻找有没有叫test.sh的。而当前的目录并不在PATH里,所以写成test.sh 是会找不到命令的,要用./test.sh 告诉系统,就在当前目录里面找。

案例2:使用root用户账号创建并执行test2.sh,实现创建一个shelltest用户,并在其家目录下创建文件try.html。

# 1、创建文件
touch test2.sh     
# 2、编写shell脚本
vi test2.sh
	#!/bin/bash
	useradd shelltest
	touch /home/shelltest/try.html
chmod +x test2.sh  # 赋值执行权限
# 3、执行
脚本执行的另外一种方式:/bin/bash 脚本的路径(了解)
/bin/bash test2.sh   # 此操作需要切换到root用户
ls /home/shelltest/   # 查看脚本中的命令是否执行成功

二、shell进阶(重点)

1、变量

1.1、变量的含义

什么是量?
量就是数据。

什么是变量?
数据可以发生改变就是变量;
在一个脚本周期内,其值可以发送改变的量就是变量。

什么叫做一个脚本周期?
一个脚本周期我们可以简单的理解为当前的shell文件。
从第一行执行到最后一行这个过程就是脚本周期。

变量是shell中不可或缺的一部分,也是最基础、最重要的组成部分。

1.2、变量的定义与使用

变量,先定义后使用。

定义 如:class_name=“bigdata”
使用 如:echo $class_name

变量就是由两部分组成,一个是变量名,另外一部分是变量的值
变量名和变量值是什么关系?
变量名和变量值是使用和被使用关系;我们的变量名来使用变量值。

变量名的规范:
注意:变量名后面的等号左右不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线”_“。
不能使用标点符号。
不能使用bash里的关键字(可以通过help命令查看保留关键字)。

在使用变量的时候一定需要在变量名前面添加一个$符合,该要求在其他语言中也存在的(例如PHP)

案例1:使用变量改写入门脚本中的第一个shell脚本

# 1、创建文件
touch test3.sh
# 2、编写脚本
vim test3.sh
	#!/bin/bash
	str='hello world'
	echo $str     # 注意:这里可以叫引号 但是 '$str' 和 "$str" 执行出来的效果不同,双引号能够识别变量,单引号只能原样输出
chmod +x test3.sh  # 赋值执行权限
# 3、执行脚本
./test3.sh

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

# 1、创建文件
touch test4.sh
# 2、编写脚本
vi test4.sh
	#!/bin/bash
	dt=`date +%F %t`
	# 反引号(ESC键下面的键),当在脚本中需要执行一些指令并且将执行的结果赋值给变量的时候需要使用‘反引号’
	echo $dt
chmod +x test4.sh
# 3、执行脚本呢
./test4.sh

1.3、只读变量(了解)

只读变量在定义之后,只能被读,不能修改。

语法:readonly 变量名

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

touch test5.sh
vim test5.sh
	#!/bin/bash
	a=10
	readonly a
	a=20
	echo $a
chmod +x test5.sh
./test5.sh  # /bin/bash test5.sh
最后结果依然为10

1.4、接受用户变量

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

案例:编写一个test6.sh,要求执行之后提示用户输入文件的名称(路径),然后自动为用户创建该文件

touch test6.sh
vi test6.sh
	#!/bin/bach
	read -p '请输入需要创建的文件路径:' filepath
	touch $filepath
	echo '文件创建成功!'
	ls -l $filepath
chmod +x test6.sh
./test6.sh

1.5、删除变量(了解)

语法:unset 变量名

案列:定义变量b=20,在输出b的值,随后删除b,最后在删除b

touch test7.sh
vi test7.sh
	#!/bin/bach
	b=20
	echo $b
	unset b
	echo $b
chmod +x test7.sh
./test7.sh

2、条件判读语句

​ 老婆给程序员老公打电话:下班顺利买一斤包子带回来,如果看到卖西瓜的,买一个。当晚程序员老公手捧这一个包子进了家门···老婆怒道:你怎么就买了一个包子?!老公回答:因为看到了卖西瓜的。
​ 把程序员老婆的话当作一段需求分析一下吧。买一斤包子是一个确定无疑的需求项,无论后面是什么情况什么条件,前面这一斤包子是肯定要买的。看到卖西瓜的是一个条件判断,后面‘买一个’是一个模糊不清的需求项,买一个什么呢?需求里没说啊。客户把这个当作开发人员默认了解的内容了。可是作为一个成熟合格的程序员,应该老婆的丈夫应该马上跟进确认需求“买一个什么?”,要不然程序该怎么写呢?所以笑话里面的程序员是不合格的,起码是不积极不负责的。在没有明确需求的情况下,他只能按照自己的理解来完成工作了。那比较可能的结果就有如下几种:
1、看到卖西瓜的,买一个西瓜
2、看到卖西瓜的,买一个包子
3、看到卖西瓜的,买一个卖西瓜的
4、看到卖西瓜的,买一个老婆一直想买的东西
5、看到卖西瓜的,随便买一个东西

语法1:

if 条件
then
	命令1
	命令2
fi

单行写法:(一般用在命令行)
if [条件];then 命令; fi

语法2:

if 条件
then
	命令1
	命令2
else
	命令
fi

语法3:

if 条件1
then
	命令1
elif 条件2
then
	命令2
else
	命令
fi

这里就不写案例了,学完下面运算符我们再去做

3、运算符

在shell中,运算符和其他脚本语言一样,常见的有算数运算符、关系运算符、逻辑运算符、字符串运算符、文件运算符。

3.1、算数运算符

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

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr。expr最常用。
expr是Linux内置命令,可在命令行直接执行。

expr是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 ’ 记得点表格里面的举例):
 

#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为:$val"

两点注意:
表达式和运算符之间要有空格,2+2 是不对的,必须写成 2 + 2 ,这与我们熟悉的大多编程语言不一样。
完整的表达式要被 `` 包含,注意这个字符不是常用的单引号,是Esc键下边。

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

vim test8.sh
	#!/bin/bash
	#两个变量的初始赋值
	a=10
	b=20
	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
chmod +x test8.sh
./test8.sh

3.2、关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量a为10,变量b为20:

-eq :equal
-ne:not equal
-gt:great then
-lt:less then
-ge: great then or equal
-le: less than or equal 

案列:使用 a=10,b=20 完成本案例

vim test9.sh
	#!/bin/bash
	a=10
	b=20
	echo "a = $a"
	echo "b = $b"
	echo ""
	if [ $a -eq $b ]
	then
		echo 'a=b'
	else
		echo 'a!=b'
	fi
	
	if [ $a -ne $b ]
	then
		echo 'a!=b'
	else
		echo 'a=b'
	fi
	
	if [ $a -gt $b ]
	then
		echo 'a>b'
	else
		echo 'a<b'
	fi
	
	if [ $a -lt $b ]
	then
		echo 'a<b'
	else
		echo 'a>b'
	fi
	
	if [ $a -ge $b ]
	then
		echo 'a>=b'
	else
		echo 'a<b'
	fi
	
	if [ $a -le $b ]
	then
		echo 'a<=b'
	else
		echo 'a>b'
	fi
chmod +x test9.sh
./test9.sh

3.3、逻辑运算符

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

vim test10.sh
    #!/bin/bash
    a=10
    b=20
    if [ !false ]
    then
            echo '真'
    else
            echo '假'
    fi

    if [ $a -lt 20 -o $b -gt 100 ]
    then
            echo '真'
    else
            echo '假'
    fi

    if [ $a -lt 20 -a $b -gt 100 ]
    then
            echo '真'
    else
            echo '假'
    fi

chmod +x test10.sh
./test10.sh

3.4、字符串运算符

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

案列:将上述的语法验证一下

vim test11.sh
	#!/bin/bash
	a='abc'
	b='def'
	
	if [ $a = $b ]
	then
		echo 'true'
	else
		echo 'false'
	fi
	
	if [ $a != $b ]
	then
		echo 'true'
	else
		echo 'false'
	fi
	
	if [ -z $a ]
	then
		echo 'false'
	else
		echo 'true'
	fi
	
	if [ -n $a ]
	then
		echo 'true'
	else
		echo 'false'
	fi
	
	if [ $a ]
	then
		echo 'true'
	else
		echo 'false'
	fi
chmod +x test10.sh
./test10.sh

 3.5、文件测试运算符(重点)

文件测试运算符用于检测Unix/Linux 文件的各种属性。
属性检测描述如下:

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

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

相关文章

《程序员面试金典(第6版)》面试题 02.08. 环路检测

题目描述 给定一个链表&#xff0c;如果它是有环链表&#xff0c;实现一个算法返回环路的开头节点。若环不存在&#xff0c;请返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xf…

如果想了解营销的最高境界,请看如何开创新品类?

如果想了解营销的最高境界&#xff0c;请看 如何开创新品类&#xff1f; 中国奶粉第一品牌飞鹤奶粉&#xff5e; 品牌策划人王博总结的方法 趣讲大白话&#xff1a;看看高手怎么想 【安志强趣讲信息科技95期】 ******************************* 不懂品牌营销的程序员不是好厨师…

第一次使用Python for Qt中的问题

在创建带有form的python for qt的时候&#xff0c;使用的库是pySide6&#xff0c;而不是pyqt。 因此&#xff0c;需要安装pyside6。 Running "/usr/bin/python3 -m pip install PySide6 --user" to install PySide6. ERROR: Could not find a version that satisfi…

hivesql实现不同的求和需求【分组求和、帕累托累计求和、滑动求和】

hivesql求和&#xff0c;分组求和&#xff0c;帕累托累计求和&#xff0c;滑动求和 实现功能如下示例&#xff1a; 列s1&#xff1a;分组求和&#xff0c;这里以sku_id分组求和&#xff0c;E5单元格对应sku_ida01时的C列求和&#xff1b; 列s2&#xff1a;帕累托求和&#x…

X264简介-Android使用(一)

X264 简介及使用 1、简介 2、环境搭建 3、使用 4、小结 简介 官网连接&#xff1a;https://www.videolan.org/developers/x264.html 官方文档&#xff1a;https://wiki.videolan.org/Category:X264/ x264是用于编码H.264/MPEG-4 AVC视频流的免费软件库。它世界上最流行的…

每天一个linux命令:性能监控和优化命令之top

top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止…

将fluentMeshing网格转换为openFoam网格

简介 fluentMeshing是一个绘制源生多面体网格的强大工具&#xff0c;其生成的网格可以进一步导出&#xff0c;转换为OpenFoam格式&#xff0c;供OpenFoam计算。 本文将介绍如何把fluentMeshing网格转换为openFoam网格&#xff0c;以及其注意事项 步骤 &#xff08;1&#x…

【QML】锚布局

文章目录1、锚&#xff08;Anchors&#xff09;2、一些示例Qt Quick中有两套与布局管理相关的类库&#xff0c;一种是Item Positioner&#xff08;定位器&#xff09;&#xff0c;一种是Item Layout&#xff08;布局&#xff09; 定位器&#xff1a;Row&#xff08;行定位器&am…

【NLP经典论文阅读】Efficient Estimation of Word Representations in Vector Space(附代码)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

UE4 c++ Mediaplayer取消自动播放,运行时首帧为黑屏的问题

0&#xff0c;前言 工作需要使用C制作一个ue4的视频插件&#xff0c;其中一个功能是能够选择 运行时是否自动播放 视频的功能。 在实现时遇见了一个问题&#xff0c;取消自动播放之后&#xff0c;运行时首帧是没有取到的&#xff0c;在场景里面看是黑色的。就这个问题我想到了使…

Kubernetes k8s 笔记

核心功能 容器编排和管理&#xff1a;Kubernetes可以自动化容器的部署、管理和扩展&#xff0c;使得应用程序可以在多个容器之间进行平滑的切换。自动化负载均衡&#xff1a;Kubernetes可以通过将请求分配到不同的容器来平衡负载&#xff0c;以确保应用程序的高可用性和性能。…

【大数据离线开发】8.4 Hive的查询、操作以及自定义函数

8.5 Hive的查询 执行SQL&#xff08;HQL&#xff09;。HQL是SQL的一个子集 案例&#xff1a;创建部门表&#xff0c;对数据进行查询 创建部门表 create table deptno(deptno int,dname string,loc string ) row format delimited fileds terminated by ,;导入数据 load data…

函数式编程:Lambda 表达式

函数式编程&#xff1a;Lambda 表达式 每博一文案 曾经读过的依然令我感动的句子&#xff0c;生活总是不如意&#xff0c;但往往是在无数痛苦中&#xff0c;但往往是在无数痛苦中&#xff0c;在重重矛盾 和艰难中才能成熟起来&#xff0c;坚强起来&#xff0c;爱情啊&#xf…

JMeter 控制并发数

文章目录一、误区二、正确设置 JMeter 的并发数总结没用过 JMeter 的同学&#xff0c;可以先过一遍他的简单使用例子 https://blog.csdn.net/weixin_42132143/article/details/118875293?spm1001.2014.3001.5501 一、误区 在使用 JMeter 做压测时&#xff0c;大家都知道要这么…

又拍云邵海杨 - 25年Linux老兵,聊聊运维的“术”与“道”

您好邵总&#xff0c;请您先做个自我介绍吧&#xff0c;聊聊您的履历和现状&#xff0c;让大家更好的认识您&#xff0c;了解您的背景也有助于读者理解后面的采访内容 我是来自又拍云的邵海杨&#xff0c;从1998年开始使用Linux至今快25年了&#xff0c;资深(老鸟)Linux系统运维…

Log Structure Merge Tree

LSM是一种基于日志追加写的数据结构&#xff0c;非常适合为具有高写入数据提供索引访问 LSM基于以下前提 内存读写速度远高于磁盘&#xff0c;但内存有限磁盘顺序读写速度远高于随机读写 结构 WAL WAL(write-ahead log)是用于在系统错误时提供持久化&#xff0c;在写入数据…

SpringBoot自动装配原理、条件注解及封装Starter

1.什么是 SpringBoot 自动装配&#xff1f; 我们现在提到自动装配的时候&#xff0c;一般会和Spring Boot联系在一起。但是实际上SpringFramework 早就实现了这个功能。Spring Boot 只是在其基础上&#xff0c;通过 SPI 的方式&#xff0c;做了进一步优化。 SpringBoot 定义了…

C++之string字符串不同类型间转换

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; ✏️作者主页&#xff1a;枫霜剑客 &#x1f4cb; 系列专栏&#xff1a;C实战宝典 &#x1f332;上一篇: VS2019加载解决方案时不能自动打开之前的文档&#xff08…

pytorch 笔记:torch.fft

1 FFT 进行一个维度的快速傅里叶变换 torch.fft.fft(input, nNone, dim- 1, normNone, *, outNone) 1.1 主要参数 input输入&#xff0c;需要傅里叶变换的tensorn 需要变换的tensor的长度&#xff0c;默认是input的长度 如果比input长度大&#xff0c;那么补0如果比input长度…

乐山持点科技:抖音极速版电商入驻指南

“抖音极速版电商”拥有海量活跃用户&#xff0c;着眼下沉市场&#xff0c;为消费者带来高性价比产业带源头好货。针对中小商家设立更宽松的经营要求、提供简单易上手的经营工具&#xff0c;助力商家轻松经营&#xff01;来看入驻指南&#xff1a;一、抖音与抖音极速版电商入驻…