Linux中shell脚本的学习第一天,编写脚本的规范,脚本注释、变量,特殊变量的使用等,包含面试题

4月7日没参加体侧的我自学shell的第一天

Shebang

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

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

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

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

# 输出变量的值
echo $SHELL

写一个简单的Python编译器的shell脚本

#! /usr/bin/python
# coding:utf-8
print("你好!")# 如果解释器坏了,或者不能正确运行,就手动指定解释器,这里我的shell脚本的名称为hello.py
/usr/bin/python hello.py

脚本注释,脚本开发规范

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

2)注释可以单独写,也可以跟在命令后面

3)保持爱写注释的习惯,以便于以后回顾代码的含义,尽量使用英文

执行shell脚本的方式

1)bash script.sh 或 sh script.sh, 文件本身没有执行权限或没有写shebang,则使用的方法

2)使用 绝对/相对 路径执行脚本, 需要文件含有x权限(chmod +x 文件名)

3) source script.sh 或 . script.sh , 代表 执行的含义, source 等于点

4)少见的用法, sh < script.sh

在这里插入图片描述

什么是bash

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

2)bash还能从文件中读取Linux命令,称之为脚本

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

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

# history命令
-c 清空历史
-r 恢复历史# 调用历史记录命令
# 感叹号+历史命令行ID
!! # 执行上一行命令,以及上下左右寻找

变量

特殊的变量,用于检测上一行的代码是否成功运行。

echo $?
0 # 表示运行成功
1-255 # 表示运行失败

注意:

单引号变量,不识别特殊语法

双引号变量,能识别特殊符号

eg.演示单引号,双引号的区别

name=“奥利给”
echo ${name}
>> 奥利给
name2='${name}'
>> ${name}
name3="${name}"
>> 奥利给

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

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

反引号的用法

name=`ls`
# 先会执行ls命令然后再把结果赋值给name

环境变量

1)每个用户都有自己的环境变量配置文件

~/.bash_profile ~/.bashrc

且以个人配置文件,优先加载变量,读取,以个人的优先生效

2)当你需要给所有用户都使用某个变量,写入全局即可/etc/profile

set # 输出所有变量,包括全局变量,局部变量(sh中定义的变量)
set |grep ^name # 用于查询指定的变量,此处是查询以name开头的变量。
set |wc -l # 用于统计全局变量的个数env # 只显示系统的全局变量declare # 输出所有的变量,如同setexport # 显示和设置环境变量的值# 撤销环境变量
unset 变量名 # 用于删除变量或函数。# 设置只读变量
readonly name='hello'
name='hi~'
>> -bash: name: 只读变量
系统保留环境变量关键字

bash内嵌套了诸多环境变量,用于定义bash的工作环境

export |awk -F '[ :=]' '{print $3}'
# 用于只显示系统环境变量的名称

bash支持多命令执行

ls /data/; cd/tmp/; cd /home; cd / data

特殊变量

参数传递:

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

案例演示:我先新建了一个名为 special_var.sh的shell脚本

#!/bin/bash
echo '特殊变量 $0 $1 $2 ..的实践' # 单引号就是远洋输出
echo  '结果:' $0 $1 $2echo '----------------------'
echo '特殊变量获取$# 获取参数总个数'
echo '结果:'	$#echo '----------------------'
echo '特殊变量$* 实践'
echo '结果:'  $*echo '----------------------'
echo '特殊变量$@ 实践'
echo '结果:' $@

效果如下:

bash special_var.sh li hao 2021 2022 2023 2024
>>
特殊变量 $0 $1 $2 ..的实践 
结果:special_var.sh li hao
-----------------------
特殊变量获取$# 获取参数总个数
结果:6
-----------------------
特殊变量$* 实践
结果:li hao 2021 2022 2023 2024
-----------------------
特殊变量$@ 实践
结果:li hao 2021 2022 2023 2024

面试题分析

$*$@的区别?
$*$@ 都表示传递给函数或脚本的所有参数
当$*$@ 不被双引号包裹时,效果都是一样,都是将所有的参数当成一个整体输出,彼此之间空格隔开
但当他们被双眼号包“”裹的时候,就有区别了:
"$*" 会把所有的参数从整体上来看当成一份数据,而不是把每一个参数都看做一份数据
"$@" 会把每一个参数单独对待,当成一个个不同的数据
在for循环中证明了"$*""$@"的区别
"$*"--》li hao 2024 2025 (只循环一次)
"$@" 	(把所有的数据都循环一遍,一共循环了4次)
--》
li
hao
2024
2025

案例体验:

​ 我创建了一个名为different.sh 的shell脚本

#!/bin/bash
echo "print each param from \"\$*\""
for var in "$*"
doecho "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do echo "$var"
done

效果如下:

bash different.sh li hao 2024 2025
>>
print each param from "$*"
li hao 2024 2025
print each param from "$@"
li
hao
2024
2025

特殊状态变量

$? # 上一次命令执行状态返回值,0正确,非0失败
$$ # 当前shell脚本的进程号
$! # 上一次后台进程的PID
$_ # 查看之前执行的命令,最后一个参数

脚本返回值,在学习shell函数编程之后,才能彻底理解,这个脚本在执行完毕后会返回一个数字ID,称之为返回值

案例:

​ 首先我创建了一个名为t1.sh的shell脚本

cat t1.sh
#!/bin/bash
# $#获取参数个数 -ne 不等于的情况 && 并且的意思[ $# -ne 2 ] && {echo "must be two args"exit 119# 终止程序运行,且返回119状态码,提供给当前shell的$?变量,若是在函数里 可以return 119的用法
}
echo "没毛病,就是2个参数"

效果如下:

bash t1.sh li hao 2024
>>must be two args
echo $?
119
bash t1.sh li hao 
没毛病,就是2个参数
echo $?
>>0

面试题

怎样让程序在后台执行?

nohup xxx & 1> /dev/null

获取上次后台运行的PID,$!

nohup ping baidu.com & 1> /dev/null
>>[1] 21973
ps -ef|grep ping # 在所有正在运行的进程中查看包含ping的进程
>> root 21973 20999 0 16:34 pts/0 00:00:00 ping baidu.com
echo $!
>> 21973

获取当前的脚本ID

cat t1.sh
#!/bin/bash
# $#获取参数个数 -ne 不等于的情况 && 并且的意思[ $# -ne 2 ] && {echo "must be two args"exit 119# 终止程序运行,且返回119状态码,提供给当前shell的$?变量,若是在函数里 可以return 119的用法
}
echo "没毛病,就是2个参数"
echo "当前的脚本ID是:$$"

运行效果如下:

bash t1.sh li hao
>> 没毛病,就是2个参数
>> 当前的脚本ID是:20001 # 每次运行完成后的脚本ID都不一样

$_获取上一次命令传入的最后一个参数

bash t1.sh li hao
...
echo $_
>> hao

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

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

相关文章

uniapp极光推送、java服务端集成

一、准备工作 1、进入【服务中心】-【开发者平台】 2、【创建应用】&#xff0c;填写应用名称和图标&#xff08;填写项目名称&#xff0c;项目logo就行&#xff0c;也可填写其他的&#xff09; 3、选择【消息推送】服务&#xff0c;点击下一步 ​ ​ Demo测试 参照文档&…

uni-app + vue3实现input输入框保留2位小数的逻辑

首先说明输入框中的格式限制如下&#xff1a; &#xff08;1&#xff09;当第一位为0时&#xff0c;第二位只能输入小数点&#xff0c;且不能输入其他数字&#xff08;如00&#xff09; &#xff08;2&#xff09;当第一位不为0时&#xff0c;后边不限制 &#xff08;3&…

Kaldi sherpa-ncnn 端侧语音识别

本文介绍一款基于新一代 Kaldi 的、超级容易安装的、实时语音识别 Python 包:sherpa-ncnn。 小编注: 它有可能是目前为止,最容易 安装的实时语音识 别 Python 包(谁试谁知道)。 它的使用方法也是极简单的。 安装 pip install sherpa-ncnn对的,就是这一句,所有的依赖都从…

论文阅读《Semantic Prompt for Few-Shot Image Recognition》

论文地址&#xff1a;https://arxiv.org/pdf/2303.14123.pdf 论文代码&#xff1a;https://github.com/WentaoChen0813/SemanticPrompt 目录 1、存在的问题2、算法简介3、算法细节3.1、预训练阶段3.2、微调阶段3.3、空间交互机制3.4、通道交互机制 4、实验4.1、对比实验4.2、组…

【C++】哈希思想的应用(位图、布隆过滤器)及海量数据处理方法

文章目录 前言位图什么是位图简单实现一个自己的位图位图的应用场景 布隆过滤器位图的缺陷及布隆过滤器的提出布隆过滤器的概念简单实现一个自己的布隆过滤器布隆过滤器的优缺点布隆过滤器的应用场景 海量数据处理 前言 哈希思想的在实际中的应用除了哈希表这个数据结构之外还…

【Redis 知识储备】读写分离/主从分离架构 -- 分布系统的演进(4)

读写分离/主从分离架构 简介出现原因架构工作原理技术案例架构优缺点 简介 将数据库读写操作分散到不同的节点上, 数据库服务器搭建主从集群, 一主一从, 一主多从都可以, 数据库主机负责写操作, 从机只负责读操作 出现原因 数据库成为瓶颈, 而互联网应用一般读多写少, 数据库…

【Pytorch学习笔记(三)】张量的运算(2)

一、引言 在《张量的运算(1)》中我们已经学习了几种张量中常用的非算数运算如张量的索引与切片&#xff0c;张量的拼接等。本节我们继续学习张量的算术运算。 二、张量的算术运算 &#xff08;一&#xff09;对应元素的加减乘除 在 PyTorch 中&#xff0c;张量的对应元素的…

C++的List类(一):List类的基本概念

目录 前言 List类的基本概念 List的构造函数 List类迭代器的使用 List的功能 List的元素访问 List与vector比较 前言 vector的insert和erase都会导致迭代器失效list的insert不会导致迭代器失效&#xff0c;erase会导致迭代器失效 insert导致失效的原因是开辟了新空间后…

massif-visualizer qpa.plugin: Could not load the Qt platform plugin “xcb“ in

massif-visualizer qpa.plugin: Could not load the Qt platform plugin "xcb" in 报这个错误&#xff0c;是因为&#xff0c;必现在 界面窗口 执行 $ massif-visualizer massif.log 如果是ssh远程链接执行&#xff0c;就会报错. #windows上查看 需要 安装远程桌…

全球化业务的网络安全挑战

随着企业业务的全球化&#xff0c;跨国数据传输和用户跨地域访问成为常态。这不仅带来了巨大的商业机会&#xff0c;也带来了以下网络安全挑战&#xff1a; 数据泄露风险&#xff1a;跨国数据传输增加了数据被截获和泄露的风险。访问限制&#xff1a;某些地区可能对互联网内容…

Failed to start docker.service: Unit docker.service is masked.

Failed to start docker.service: Unit docker.service is masked. 未知原因&#xff1a;docker 被mask 解决方式&#xff1a; systemctl unmask docker.service systemctl unmask docker.socket systemctl start docker.service Docker是一种相对使用较简单的容器&#xff0…

Visual Studio 2022-C语言如何防止头文件多次引入

头文件的包含 本地⽂件包含 #include "filename" 查找策略&#xff1a;先在源⽂件所在⽬录下查找&#xff0c;如果该头⽂件未找到&#xff0c;编译器就像查找库函数头⽂件⼀样在 标准位置查找头⽂件。 如果找不到就提⽰编译错误。 Linux环境的标准头⽂件的路径&…

如何自定义项目启动时的图案

说明&#xff1a;有的项目启动时&#xff0c;会在控制台输出下面的图案。本文介绍Spring Boot项目如何自定义项目启动时的图案&#xff1b; 生成字符图案 首先&#xff0c;找到一张需要设置的图片&#xff0c;使用下面的代码&#xff0c;将图片转为字符文件&#xff1b; impo…

【Unity每日一记】鼠标相关API

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

【WPF应用38】WPF 控件打开文件选择-OpenFileDialog的详解与示例

在 WPF 应用程序中&#xff0c;经常需要让用户选择文件&#xff0c;例如打开图片、文本文件等。OpenFileDialog 是一个用于实现这个功能的控件。本文将详细介绍 OpenFileDialog 的使用流程&#xff0c;并提供一个完整的示例代码。 一、WPF 控件打开文件选择的必要性 在 WPF 应…

Linux初学(十七)redis

一、简介 redis就是一个内存数据库 redis中的数据&#xff0c;都是保存在内存中 端口&#xff1a;6379 二、安装redis 方法一&#xff1a;编译安装 方法二&#xff1a;yum安装-epel 第一步&#xff1a;配置epel源 详见&#xff1a;http://t.csdnimg.cn/AFl1K第二步&#xff1a…

GaN肖特基势垒二极管(SBD)的多阴极应用建模与参数提取

GaN Schottky Barrier Diode (SBD) Modeling and Parameter Extraction for Multicathode Application&#xff08;TED 24年&#xff09; 摘要 本文提出了一种适用于多阴极应用的紧凑型可扩展GaN肖特基二极管大信号模型。详细给出了外在和内在模型参数的可扩展规则。实验和理…

kamailio mysql数据表解析

kamctl db exec "show tables;" 查询mysql数据表 acc&#xff1a;存储呼叫详单&#xff08;Call Detail Records, CDRs&#xff09;的信息&#xff0c;包括呼叫持续时间、呼叫状态、被叫号码等。这些记录有助于统计和分析呼叫的数据。 acc_cdrs&#xff1a;存储呼叫…

HTTP的强制缓存和协商缓存

HTTP的强制缓存和协商缓存 HTTP的缓存技术强制缓存ExpiresCache-Control 协商缓存If-Modified-Since和Last-ModifiedIf-None-Match和ETag优先级 可被缓存的请求方法总结 HTTP的缓存技术 当我们进行HTTP请求时&#xff0c;需要将请求报文发送给对端&#xff0c;当服务端收到请求…

Stm32 HAL库 访问内部flash空间

Stm32 HAL库 访问内部flash空间 代码的部分串口配置申明文件main函数 在一些时候&#xff0c;需要存储一些数据&#xff0c;但是又不想接外部的flash&#xff0c;那我们可以知道&#xff0c;其实还有内部的flash可以使用&#xff0c; 需要注意的是内部flash&#xff0c;读写次数…