Shell脚本学习笔记(更新中...)

news2024/9/20 8:06:59

一、什么是shell

shell的作用是:

  • 解释执行用户输入的命令程序等。

  • 用户输入一条命令,shell就解释一条。

  • 键盘输入命令,LInux给与响应的方式,称之为交互式。

shell是一块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入,解释给操作系统,然后处理操作系统的输出结果,输出到屏幕给与用户看到结果。

从我们登录Linux, 输入账号密码到进入Linux交互式界面,所有的操作,都是交给shell解释并执行。

我们想要获取计算机的数据,不可能每次都编写程序,编译后,再运行,再得到我们想要的。例如你想找到一个文件,可以先写一段C语言的代码,然后调用系统函数,通过gcc编译后,运行程序才能找到文件。

因此有大牛开发shell解释器,能够让我们方便的使用Linux,例如只要桥下ls -lh 这样的字符串,shell解释器就会针对这句话翻译,解释成ls -l -h 然后执行,通过终端输出结果,无论是图形化或是命令行界面。

即使我们用的图形化,点的动作,却也只是

  • 命令行操作,shell解释器执行后,输出结果到黑屏命令行界面。

  • 图形化操作,shell接受点击操作,输出图案数据。

二、什么是Shell脚本

shebang 美/ʃɪˈbæŋ/ : n.工作;事情;住所
当命令或者程序语句写在文件中,我们执行文件,读取其中的代码,这个程序文件就称之为shell脚本。在shell脚本里定义多条linux命令以及循环控制语句,然后将这些Linux命令一次性执行完毕,执行脚本文件的方式称之为,非交互式方式。

  • windows系统中shell脚本:以".bat"结尾的批处理脚本文件。

  • Linux系统中shell脚本:以".sh"结尾的脚本文件。

shell脚本规则

在Linux系统中,shell脚本或者称之为(bash shell程序)通常都是vim编辑,由Linux命令、bash shell指令、逻辑控制语句和注释信息组成。

三、Shebang

计算机程序中,shebang指的是出现在文本文件的第一行前两个字符 #!

在Unix系统中,程序会分析shebang后面的内容,作为解释器的指令,例如

  • #!/bin/sh开头的文件,程序在执行的时候会调用 /bin/sh,也就是bash解释器。

  • #!/usr/bin/python 开头的文件,代表指定python解释器去执行。

  • #!/usr/bin/env 解释器名称,是一种在不同平台上都能正确找到解释器的办法。

注意事项

  • 如果脚本未指定shebang,脚本执行的时候,默认用户当前shell去解释脚本,即$SHELL。

  • 如果shebang指定了可执行的解释器,如 /bin/bash /usr/bin/python ,脚本在执行时,文件名会作为参数传递给解释器。

  • 如果 #! 指定的解释器程序没有可执行权限,则会报错“bad interpreter: Permission denied”。

  • 如果#! 指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前的SHELL去执行这个脚本。

  • 如果 #! 指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”。

  • 在 #! 之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会自动$PATH中寻找解释器的。

  • 如果你使用“bash test.sh”这样的命令来执行脚本,那么 #! 这一行将会被忽略掉,解释器当然是用命令行中显示或指定的bash。

脚本案例如下:

[root@localhost opt]# cat test.sh
#! /bin/bash
ls .
echo "脚本执行完毕~"

四、脚本注释,脚本开发规范

  • 在shell脚本中,#后面的内容代表注释掉的内容,提供给开发者或使用者观看,系统会忽略此行。

  • 注释可以单独写一行,也可以跟在命令后面。

  • 尽量保持爱写注释的习惯,便于以后回顾代码的含义,尽量使用英文、而非中文

#! /bin/bash
​
# Date: 2024-05-20 16:52
# Author: created by chengjiagnbo
# blog: https://blog.csdn.net/u010132847?type=blog

五、执行shell脚本的方式

  • bash script.sh 或 sh scripte.sh ,文件本身没权限执行,没x权限,则使用的方法,或脚本未指定 shebang,重点推荐的方式。

  • 使用 绝对/相对 路径执行脚本, 需要文件含有x权限。

  • source script.sh 或者 . script.sh ,代表 执行的含义, source等于点"." 。

  • 少见的用法, sh < script.sh

[root@localhost opt]# ls
test.sh
[root@localhost opt]# sh < test.sh
test.sh
脚本执行完毕~
[root@localhost opt]# bash test.sh
test.sh
脚本执行完毕~
[root@localhost opt]# source test.sh
test.sh
脚本执行完毕~
[root@localhost opt]# . test.sh
test.sh
脚本执行完毕~

六、shell和运维

shell脚本语言很适合处理纯文本类型数据,且Linux的哲学思想就是一切皆文件,如果日志、配置文件、文本、网页文件,大多数都是纯文本类型的,因此shell可以方便的进行文本处理,好比强大的Linux三剑客(grep、sed、awk)。

6.1、脚本语言

shell脚本语言属于一种弱类型语言 无需声明变量类型,直接定义使用,数据类型默认都是字符串类型。

强类型语言,必须先定义变量类型,确定是数字、字符串等,之后再赋予同类型的值。

Centos7系统中支持的shell情况,有如下种类

[root@localhost opt]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

默认的sh解释器

[root@localhost opt]# ll /usr/bin/sh
lrwxrwxrwx. 1 root root 4 Jan 29 12:03 /usr/bin/sh -> bash

6.2、其他脚本语言

PHP是网页程序语言,专注于Web网页开发,诸多开源产品,wordpress、discuz开源产品doushiPHP开发。

Perl语言,擅长支持强大的正则表达式,以及运维工具的开发。

Python语言,明星语言,不仅适用于脚本程序开发,也擅长Web页面开发,如(系统后台,资产管理平台),爬虫程序开发,大量Linux运维工具也由Python开发,甚至于游戏开发也是用。

6.3、shell的优势

虽然有诸多脚本变成语言,但是对于Linux操作系统内部应用而言,shell是最好的工具,Linux底层命令都支持shell语句,以及结合三剑客(grep、sed、awk)进行高级用法。

  • 擅长系统管理脚本开发,如软件启停脚本、监控报警脚本、日志分析脚本

每个语言都有自己擅长的地方,扬长避短,达到高效运维的目的是最合适的。

#Linux默认shell
[root@localhost ~]# echo $SHELL
/bin/bash

七、bash基础特性

7.1、bash是什么

  • bash是一个命令处理器,运行在文本宽口中,并能执行用户直接输入的命令。

  • bash还能从文件中读取linux命令,称之为脚本。

  • bash支持通配符、管道、命令替换、条件判断等逻辑控制语句。

bash有诸多方便的功能,有助于运维人员提升工作效率。

7.2、命令历史

shell会保留其会话中用户提交执行的命令

history #命令,查看历史命令记录,注意【包含文件中和内存中的历史记录】
[root@localhost ~]# echo $HISTSIZE    #shell进程可保留的命令历史的条数
1000
[root@localhost ~]# echo $HISTFILE    #存放历史命令的文件,用户退出登录后,持久化命令个数
/root/.bash_history

history命令

history #命令 以及参数
-c: 清空内存中命令历史。
-r: 从文件中恢复历史命令
数字:显示最近n条命令 ,如history 10

7.3、特性汇总

文件路径tab健补全

命令补全

快捷键 ctrl + a,e,u,k,l

通配符

命令历史

命令别名

命令行展开

八、变量含义

学生时代所学的数学方程式, 如x=1,y=2, 那会称之为x, y是未知数。

对于计算机角度, x=1, y=2等于定义了两个变量,名字分别是x, y,且赋值了1和2。

变量是暂时存储数据的地方,是一种数据标记(房间号,标记了客人所在的位置),数据存储在内容空间,通过调用正确的变量名字,即可取出对应的值。

九、shell变量

9.1、变量定义与赋值,注意变量与值之间不得有空格

[root@localhost ~]# name = "波哥"
-bash: name: command not found

变量名
变量类型,bash默认把所有变量都认为是字符串。

bash变量是弱类型,无需事先声明类型,是将声明和赋值同时进行。

9.2、变量替换/引用

[root@localhost ~]# name="波哥带你学bash"
[root@localhost ~]# echo ${name}
波哥带你学bash
[root@localhost ~]# echo $name   #可以省略花括号
波哥带你学bash

9.3、变量名规则

  1. 名称定义要做到见名知意,切按照规则来,切不得引用保留关键字(help检查保留字)

  2. 只能包含数字、字母、下划线

  3. 不能以数字开头

  4. 不能用标点符号

  5. 变量名严格区分大小写

有效的变量名:
NAME_BOGE
_boge
boge1
bogE1
Boge2_ge

无效的变量名:
?boge
bo*ge
bo+ge

9.4、变量的作用域

作用域的理解(盒子的嵌套)

9.5、本地变量的识别

单引号变量,不识别特殊语法。
双引号变量,能识别特殊符号。

示例:

备注:echo: 美/ˈekoʊ/v.回响,发出回声;

9.6、不同的执行方式,不同的shell环境

示例:

解答:

  1. 每次调用bash/sh解释器执行脚本,都会开启一个子shell,因此不保留当前的shell变量,通过pstree命令检查进程树。

  2. 调用source或者点“.”符号,在当前shell环境加载脚本,因此保留变量。

备注:如果centos系统执行pstree命令时,碰到“-bash: pstree: command not found”, 则执行命令“yum -y install psmisc”安装。

9.7、一个面试题

问,如下输出的内容是什么

[root@localhost ~]# cat test.sh
user=`whoami`
[root@localhost ~]# sh test.sh
[root@localhost ~]# echo $user

A. 当前用户
B. 空

[root@localhost ~]# source test.sh
[root@localhost ~]# echo $user

A. 当前用户
B. 空

备注:在linux中的反引号"`"命令执行结果会被保留下来。

十、环境变量设置

环量变量一般指的是用export内置命令导出的变量,用于定义shell的运行环境,保证shell命令的正确执行。

shell通过环境变量确定登录的用户名、PATH路径、文件系统等各种应用。

环境变量可以在命令行中临时创建,但是用户退出shell终端,变量即丢失,如果永久生效,需要修改环境变量配置文件

  • 用户个人配置文件 ~/.bash_profile、~/.bashrc 远程登录用户特有文件。

  • 全局配置文件 etc/profile、/etc/bashrc。系统建议最好创建在/etc/profile.d/, 而非直接修改主文件,修改全局配置文件,影响所有登录系统的用户。

10.1、*检查系统环境变量的命令:

  • set: 输出所有变量,包括全局变量、局部变量。

  • env: 只显示全局变量。

  • declare: 输出所有的变量,如同set。

  • export: 显示和设置环境变量值。

10.2、撤销环境变量

  • unset 变量名,删除变量或函数。

10.3、设置只读变量

  • readonly, 只有shell结束,只读变量失效。

10.4、系统保留环境变量关键字

bash内嵌了诸多环境变量,用户定义bash的工作环境, 查看命令

[root@localhost ~]# export |awk -F '[ :=]' '{print $3}'

10.5、bash多命令执行

多条命令时用英文分号分开,如
[root@localhost home]# cd /;ls;cd /home;cd jiangbo;pwd

10.6、linux环境变量文件加载顺序

十一、特殊变量

11.1、shell的特殊变量,用在如脚本,函数传递参数使用

如下特殊的,位置参数变量

$0:获取shell脚本文件名,以及脚本路径。
$n: 获取shell脚本的第n个参数,n在1~9之间, 如$1, $2...$9, 大于9则需要写, ${10},参数空格隔开。
$#: 获取执行的shell脚本后面的参数总个数。
$*: 获取shell脚本所有参数,不加引号等同于$@作用,加上引号"$*"作用是 接收所有参数为单个字符串, “$1 $2...
$@: 不加引号,效果同上,加引号,是接收所有参数为独立字符串, 如“$1” "$2" "$3" ..., 空格保留

示例:

[root@localhost ~]# cat test.sh
#! /bin/bash
echo '特殊变量 $0 $1 $2 ..的实践'
echo '结果:' $0 $1 $2

echo '######################'
echo '特殊变量$# 获取参数总个数'
echo '结果:' $#

echo '######################'

echo '特殊变量$@ 实践'
echo '结果:' $@ 
[root@localhost ~]# sh test.sh jiangbo 180 180 180 
特殊变量 $0 $1 $2 ..的实践
结果: test.sh jiangbo 180
######################
特殊变量$# 获取参数总个数
结果: 4
######################
特殊变量$@ 实践
结果: jiangbo 180 180 180

11.2、$* 和 $@的区别你了解吗?

$*和$@ 都表示传递给函数或脚本的所有参数。
当$*和$#不被双引号“ ”引起来时,他们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。
但是当他们被双引号“ ”包含时,就会有区别了:
“$*”会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
“$@”仍然将每个参数都看做一份数据,彼此之间是独立的。

示例:

[root@localhost ~]# cat different.sh 
#! /bin/bash
echo "print echo param from \"\$*\""
for var in "$*"
do
    echo "$var"
done

echo "########################"
echo "print each param from \"\$@\""
for var in "$@"
do
    echo "$var"
done
[root@localhost ~]# sh different.sh  jiangbo 180 180 180
print echo param from "$*"
jiangbo 180 180 180
########################
print each param from "$@"
jiangbo
180
180
180

备注:\"\$*\"中的反斜杠表示转义符号,for表示循环,do...done表示循环体。

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

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

相关文章

如何使用maven运行SpringBoot程序?

目录 一、什么是maven 二、什么是SpringBoot 三、如何使用maven运行SpringBoot程序&#xff1f; 一、什么是maven Maven&#xff1a;简化Java项目构建的自动化工具 在软件开发的世界里&#xff0c;Maven以其强大的项目管理和构建自动化功能&#xff0c;为Java开发者提供了…

不含一阶导数项的线性二阶微分方程的通解

假设这里有一个线性二阶微分等式&#xff0c;形式如下&#xff1a; &#xff08;1&#xff09; 其中是连续的&#xff0c;是在实闭区间是连续的,如果有人倾向于推广&#xff0c;在相对假弱的假设下&#xff0c;这个结果能够被发现。如果是下列其次线性方程的任意两个线性无关的…

Jmeter环境安装(超级简单)

Jmeter的安装是非常简单的&#xff0c;只需要将下载的安装包解压后&#xff0c;就可以运行了&#xff01;&#xff01; 一、首先要下载Jmeter 1.1、官网下载&#xff1a; 下载最新版&#xff1a;https://jmeter.apache.org/download_jmeter.cgi https://jmeter.apache.org/…

【Redis】 关于列表类型

文章目录 &#x1f343;前言&#x1f340;常见操作命令介绍&#x1f6a9;lpush&#x1f6a9;lpushx&#x1f6a9;rpush&#x1f6a9;rpushx&#x1f6a9;lrange&#x1f6a9;lpop&#x1f6a9;rpop&#x1f6a9;lindex&#x1f6a9;linsert&#x1f6a9;llen&#x1f6a9;lrem&…

暴雨公司受邀参加中国图象图形大会

5月24日至26日&#xff0c;备受瞩目的中国图象图形大会&#xff08;CCIG 2024&#xff09;在古都西安圆满落幕。本届大会主题为“图聚智生&#xff0c;象合慧成”&#xff0c;由中国图象图形学学会主办&#xff0c;空军军医大学、西安交通大学、西北工业大学承办&#xff0c;陕…

牛客NC166 连续子数组的最大和(二)【中等 前缀和数组+动态规划 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21 思路 前缀和数组动态规划Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…

动效设计师的角色与职责:创造视觉魔法!

当今社会&#xff0c;随着视频游戏和数字产品的不断发展&#xff0c;动态设计师这个职业也在逐步发展壮大&#xff0c;同时也吸引了很多热爱动画设计的朋友。动态设计的目的是在第一时间吸引用户的注意力。那你知道动态设计师是做什么的吗&#xff1f;动态设计师的发展前景如何…

【Postman接口测试】第一节.接口测试基础认识

文章目录 前言一、接口的基础 1.1 什么是接口 1.2 软件为什么需要接口 1.3 为什么要做接口测试二、接口测试的基础 2.1 接口测试介绍 2.2 接口测试的实现方式三、接口返回数据和JSON详解四、接口测试协议详解总结 前言 一、接口的基础知识 1.1 什么是…

重生之while在鸣潮学习HTML标签

个人主页&#xff1a;终端 HTML标签 目录 2.1标题标签 2.2段落标签 2.3换行标签 2.4列表标签 2.5超链接标签 2.6图片标签 2.7表格标签 2.8-2.9表单标签&表单项 2.10布局相关标签 2.11特殊字符 2.1标题标签 标题标签 代码 <h1>鸣</h1> <h2>潮<…

Unity功能——设置Camera,实现玩家被攻击后晃动效果

一、方法说明&#xff1a; 来源&#xff1a;siki学院&#xff1a;Unity项目捕鱼达人&#xff0c;功能学习记录&#xff1b; 效果摘要&#xff1a;通过调整相机移动&#xff0c;视觉感觉玩家面板剧烈晃动&#xff0c;实现被boss攻击时的震动效果。 使用场景说明&#xff1a; …

期权开户要多久的时间?能当天开好交易吗?

今天期权懂带你了解期权开户要多久的时间&#xff1f;能当天开好交易吗&#xff1f;期权&#xff0c;作为一种金融衍生品&#xff0c;它赋予了持有人在未来某个时间内购买或出售特定资产的权利&#xff0c;近年来在全球范围内得到了广泛的关注和应用。 期权开户要多久的时间&am…

基于形态学滤波的心电信号ECG处理(MATLAB 2021B)

数学形态学简称形态学&#xff0c;在数学意义上&#xff0c;其基于集合理论、积分几何和网格代数&#xff0c;是一门严格建立在数学基础之上的学科&#xff0c;着重用来研究图像的几何结构和形状&#xff0c;因而称之为形态学。其基本思想是用结构元素对待分析图像进行“探测”…

强悍!轻量级 Viedo Download 项目!!【送源码】

今天给大家分享一个非常轻量实用的命令行视频下载项目&#xff1a;Lux。 项目简介 Lux是一款基于Golang编写的快速、简单的视频下载库和命令行工具&#xff0c;支持众多个流行的视频网站&#xff0c;包括 YouTube、Bilibili、优酷、爱奇艺、腾讯视频、抖音快手等。 界面简洁易…

磐启PAN2013 2.4GHz无线收发SOC

PAN2013是一款集成了8位MCU和2568bits EEPROM的无线收发SoC芯片。该芯片工作2.400~2.483GHz世界通用ISM频段&#xff0c;且集成射频收发机、频率发生器、晶体振荡器、调制解调器和低功耗MCU等功能模块&#xff0c;并且支持一对多组网和带ACK的通信模式。 用户通过MCU的I/O口向…

(ICRA 2024) Diffusion-Based Point Cloud Super-Resolution for mmWave Radar Data

今天介绍一篇使用Diffusion模型来生成超分辨率雷达点云的方法。毫米波雷达传感器在不利的环境条件下可以保持稳定的性能&#xff0c;使其成为室外移动机器人全天候感知任务的一个有希望的解决方案。然而&#xff0c;雷达点云相对稀疏&#xff0c;包含大量鬼点&#xff0c;极大地…

迈向未来:Web3 技术开发的无限可能

在当今的数字时代&#xff0c;互联网技术日新月异&#xff0c;推动着各行各业的变革与发展。从Web1.0的信息发布&#xff0c;到Web2.0的社交互动&#xff0c;互联网的每一次进化都为人们的生活带来了深远的影响。如今&#xff0c;Web3的到来正在开启一个全新的时代&#xff0c;…

ozon物流cel费用,ozon物流cel运费多少

在跨境电商的广阔天地中&#xff0c;OZON作为俄罗斯知名的电商平台&#xff0c;为众多卖家提供了广阔的舞台。而物流作为电商交易的重要环节&#xff0c;其费用一直是卖家和买家关注的焦点。特别是OZON的CEL物流方式&#xff0c;因其高效、安全的特点而备受青睐。那么&#xff…

乘风破浪,创维汽车旗舰店落户安徽

2024年5月19日&#xff0c;创维汽车宣城家奇体验中心盛大开业。宣城市委办公室副主任师典雅、市投资促进局副局长金崇学、经开区管委会副主任汤晓峰、宣城市通信局局长梁登峰、创维汽车战区总经理刘俊、创维汽车大区总监王大明等人出席此次开业盛典&#xff0c;共同见证了创维汽…

北京邮电大学人工智能考数据结构,均分370!北京邮电大学计算机考研考情分析!

北京邮电大学&#xff08;Beijing University of Posts and Telecommunications&#xff09;&#xff0c;简称北邮&#xff0c;是中华人民共和国教育部直属、工业和信息化部共建的全国重点大学&#xff0c;位列国家“211工程”、“985工程优势学科创新平台”、“世界一流学科建…

【Fiddler抓包工具】第五节.安卓、IOS抓包+fildder插件

文章目录 前言一、HTTPS抓包 1.1 HTTPS与HTTP区别 1.2 HTTPS抓包设置过程 1.3 错误解决方法 1.4 验证证书是否安装成功 1.5 Firefox HTTPS请求捕获二、IOS设备APP抓包 2.1 APP抓包Fiddler设置 2.2 APP抓包IOS设备设置 2.3 And…