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

news2024/11/26 11:53:58

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 # 输出所有的变量,如同set

export # 显示和设置环境变量的值

# 撤销环境变量
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 $2

echo '----------------------'
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 "$*"
do
	echo "$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.coloradmin.cn/o/1577391.html

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

相关文章

Qt通讯录管理系统

在git上面找的一个操作文件的qt通讯录管理系统,尝试将它复刻了一下. 成果展示 分两个txt文件存储,一个是手机联系人,一个是电话卡联系人,主要功能就是增删改查,主要使用的是OOP的编程思想. 实现过程 界面布局 考虑设计三个界面,主界面,添加联系人界面和修改联系人的界面.于是添…

深入理解nginx realip模块[上]

目录 1. 引言2. Real IP模块的使用2.1 启用Real IP模块2.2 配置Real IP模块2.2.1 配置指令2.2.2 举例 3. 变量的使用 深入理解nginx realip模块[上] 深入理解nginx realip模块[下] 1. 引言 nginx 的 Real IP 模块用于解决代理服务器转发请求到nginx上时可能出现的 IP 地址问题…

ES入门十一:正排索引和倒排索引

索引本质上就是一种加快检索数据的存储结构&#xff0c;就像书本的目录一下。 为了更好的理解正排索引和倒排索引&#xff0c;我们借由一个 **唐诗宋词比赛&#xff0c;**这个比赛一共有两个项目&#xff1a; 给定诗词名称&#xff0c;背诵整首给诗词中几个词语&#xff0c;让…

lua学习笔记6(经典问题输出99乘法表)

print("************for循环的99乘法表*************") for i 1, 9 dolocal line "" -- 创建一个局部变量来累积每行的输出--local 是一个关键字&#xff0c;用于声明一个局部变量。for j 1, i doline line .. j .. "*" .. i .. ""…

mysql查询时大小写,末尾空格容易造成的问题。

问题描述 在使用mysql innodb 默认的配置时&#xff0c;发现mysql查询时是忽略大小写和末尾空格的。 示例 比如下面的查询&#xff1a;查询条件中是大写的字母&#xff0c;末尾也没有空格。但是查询出的结果中&#xff0c;既有小写的&#xff0c;也有末尾带有空格的&#xf…

Windows Edge浏览器的兼容性问题及解决方案

1、Windows Edge&#xff08;了解 Microsoft Edge&#xff09;&#xff1a; 简单介绍&#xff1a; Microsoft Edge是一款由微软开发的网页浏览器&#xff0c;最初于2015年伴随Windows 10推出&#xff0c;作为Internet Explorer的继任者&#xff0c;旨在提供更快、更安全、更现代…

二维相位解包理论算法和软件【全文翻译- 掩码(3.4)】

本节我们将研究从质量图中提取掩码的问题。掩码是一个质量图,其像素只有两个值:0 或 1。零值像素标志着质量最低的相位值,这些相位值将被屏蔽、零权重或忽略。第 5 章中的某些 L/ 正则算法需要使用掩码来定义零权重。掩码还可用于某些路径跟踪算法,如第 4.5 节中将要介绍的…

Linux:安装zabbix-agent被监控端(2)

本章是结合着上一篇文章的续作 Linux&#xff1a;部署搭建zabbix6&#xff08;1&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/137426966?spm1001.2014.3001.5501本章将在两台centos部署agent端&#xff0c;然后使用server进行连接监控 agent1 在1…

PostgreSQL技术内幕(十五):深度解析PG事务管理和分布式事务

PostgreSQL技术内幕&#xff08;十五&#xff09;&#xff1a;深度解析PG事务管理和分布式事务 事务作为保障数据完整性和一致性的关键机制&#xff0c;在数据库操作中扮演着举足轻重的角色。事务通过将一系列逻辑上的操作捆绑在一起&#xff0c;确保它们要么全部成功执行&…

IPD集成项目管理:继电器供应商宏发股份上线奥博思 PowerProject 项目管理系统平台

厦门宏发电声股份有限公司&#xff08;以下简称“宏发股份”&#xff09;签约北京奥博思软件公司&#xff0c;选择PowerProject建设全生命周期数字化项目管理平台。 了解奥博思项目管理软件&#xff1a;http://www.powerproject.com.cn/ 宏发股份项目管理系统启动会顺利召开 …

rsync-远程同步备份

目录 前言 一、rsync远程同步概述 1、rsync远程同步概念 2、rsync功能及特点 3、rsync的备份方式 4、rsync的上下行同步方式 4.1 下行同步 4.2 上行同步 5、rsyncinotify 6、rsync同类服务 7、rsync与cp、scp对比 二、rsync命令 1、rsync格式语法 2、rsync配置同…

Clarity AI:免费开源的AI无损图片放大图像升级器和增强工具

可以作为Magnific AI的平替版本。Magnific AI是一款基于人工智能技术的图像处理工具&#xff0c;主要功能包括图像放大、像素级AI重绘、灵活的设置调整以及多种优化场景。它能够支持最高放大至16倍&#xff0c;甚至可以达到1亿像素的分辨率。此外&#xff0c;Magnific AI还具备…

MySQL中数据库、表的操作

文章目录 一、管理数据库1.1、连接数据库1.2、创建库1.3、选择数据库1.4、修改数据库名称1.5、查看数据库信息1.6、删除库 二、定义数据表字段2.1、数据表字段的数据类型2.2、数据表字段属性2.3、约束讲解2.3.1、约束的定义1&#xff09;为什么需要约束2&#xff09;什么是约束…

敏感信息泄露漏洞

法律声明 参与培训需要遵守国家法律法规&#xff0c;相关知识只做技术研究&#xff0c;请勿用于违法用途&#xff0c;造成任何后果自负与本人无关。 中华人民共和国网络安全法&#xff08;2017年6月1日起施行&#xff09; 第二十二条 任何个人和组织不得从事入侵他人网络、干扰…

CAD Plant3D 2024 下载地址及安装教程

CAD Plant3D是一款专业的三维工厂设计软件&#xff0c;用于在工业设备和管道设计领域进行建模和绘图。它是Autodesk公司旗下的AutoCAD系列产品之一&#xff0c;专门针对工艺、石油、化工、电力等行业的设计和工程项目。 CAD Plant3D提供了一套丰富的工具和功能&#xff0c;帮助…

八次危机笔记

文章目录 前言一、思维导图危机一危机二危机三危机四危机五危机六危机七危机八 前言 重塑三观&#xff0c;致敬温老。一个有良心的学者&#xff01;&#xff01;&#xff01; 一、思维导图 危机一 危机二 危机三 危机四 危机五 危机六 危机七 危机八 ☆

如何实现异地公网环境访问本地部署的支付宝沙箱环境调试支付SDK

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

qt 打印日志

在 Qt Creator 中&#xff0c;将 QDebug、QInfo、QWarning、QCritical 和 QFatal 打印的日志输出到指定文件&#xff0c;需要设置 Qt 的消息处理机制。这通常涉及到安装一个自定义的消息处理器&#xff0c;该处理器将日志消息重定向到文件。以下是一个基本的步骤指南&#xff1…

鸿蒙实现一种仿小红书首页滑动联动效果

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 效果描述&#xff1a;通过手指滑动列表&#xff0c;控制位置显示效果为&#xff1a;不论列表在什么位置下滑时下图粉色位置布局显示&#xff0c;手指上滑时下图粉色位置布局隐藏。 效果&#xff1a; 原理分析&…

【分治算法】大整数乘法Python实现

文章目录 [toc]问题描述基础算法时间复杂性 优化算法时间复杂性 Python实现 个人主页&#xff1a;丷从心. 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 问题描述 设 X X X和 Y Y Y都是 n n n位二进制整数&#xff0c;计算它们的乘积 X Y XY XY 基础…