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.hqwc.cn/news/599441.html

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

相关文章

【问题处理】银河麒麟操作系统实例分享,银河麒麟高级服务器操作系统mellanox 网卡驱动编译

1.Mellanox 网卡源码驱动下载链接&#xff1a; https://www.mellanox.com/downloads/ofed/MLNX_EN-5.7-1.0.2.0/MLNX_EN_SRC-5.7-1.0.2.0.tgz 2.系统及内核版本如下截图&#xff1a; 3.未升级前 mellanox 网卡驱动版本如下&#xff1a; 4.解压 “MLNX_EN_SRC-5.7-1.0.2.0.tg…

汇编——SSE打包整数

SSE也可以进行整数向量的加法&#xff0c;示例如下&#xff1a; ;sse_integer.asm extern printfsection .datadummy db 13 align 16pdivector1 dd 1dd 2dd 3dd 4pdivector2 dd 5dd 6dd 7dd 8fmt1 db "Packed Integer Vector 1: %d, %d, %d, %d",…

蓝桥杯练习系统(算法训练)ALGO-957 P0703反置数

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 一个整数的反置数指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数的末尾是以0结尾&#xff0c;那么在它的…

探索7个MAMP本地开发环境的高效替代软件

什么是本地开发环境 本地开发环境是Web开发环境中的一种类型&#xff0c;它是指开发者自己的计算机上配置的一套用于开发和测试网站或应用程序的软件集合。这套环境使得开发者可以在本地计算机上构建和测试网站&#xff0c;而无需实时部署到服务器。 创建本地开发环境有两种方…

论文阅读AI工具链

文献检索 可以利用智谱清言来生成合适的文献检索式&#xff0c;并根据需要不断调整。 谷歌学术 在Google Scholar中进行检索时&#xff0c;您可以使用类似的逻辑来构建您的搜索式&#xff0c;但是语法会有所不同。Google Scholar的搜索框接受普通的文本搜索&#xff0c;但是…

读所罗门的密码笔记13_群雄逐鹿(下)

1. 中国 1.1. 数字巨龙开始腾飞 1.1.1. 基于技术发展所创造的繁荣&#xff0c;虽然受到各方的干扰&#xff0c;但是使得大众更加支持数字政策 1.1.1.1. 数字服务广泛易得&#xff0c;并不意味着人们信任技术 1.1.2. 争取人工智能领导权的竞赛彰显了中国的雄心壮志 1.1.2.1…

[挖坟]如何安装Shizuku和LSPatch并安装模块(不需要Root,非Magisk)

2023年12月13日&#xff0c;LSPatch 停止维护 2024年1月8日&#xff0c;LSPosed 停止维护 2024年1月8日&#xff0c;ZygiskNext 停止维护 2024年1月9日&#xff0c;KernelSU 停止维护 这里使用 ColorOS 14 演示&#xff0c;其他品牌手机类似 安装 Shizuku 官网: https://shiz…

页面转word的那些事

背景 有些时候需要将页面内容或者是页面的数据通过word进行下载&#xff0c;以方便客户进行二次编辑&#xff0c;而不是直接导出图片或者是pdf。 想在页面端点击下载成word&#xff0c;那必然需要服务端来进行读写文件&#xff0c;无论是你后端编辑好的内容流&#xff0c;还是…

BMP280芯片I2C驱动开发指南

这颗芯片不太容易焊接&#xff0c;不能长时间风枪吹&#xff0c;否则容易掉壳。 第一部分 硬件连接 电路很简单&#xff0c;没什么需要注意的。 第二部分 软件驱动 本来打算使用SPL06的&#xff0c;结果焊接掉壳了&#xff0c;更换成bmp280了。函数名没有变过来。。。 void …

2.网络编程-HTTP和HTTPS

目录 HTTP介绍 HTTP协议主要组成部分 GET 和 POST有什么区别 常见的 HTTP 状态码有哪些 http状态码100 HTTP1.1 和 HTTP1.0 的区别有哪些 HTTPS 和 HTTP 的区别是什么 HTTP2 和 HTTP1.1 的区别是什么 HTTP3 和 HTTP2 的区别是什么 HTTPS的请求过程 对称加密和非对称…

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;什么是约束…

Linux——线程互斥与互斥锁的使用

目录 前言 一、进程线程间的互斥相关背景概念 二、互斥量&#xff08;互斥锁&#xff09; 三、互斥锁的使用 1.互斥锁的初始化 2.加锁与解锁 3.锁的使用 4.锁的封装 四、线程饥饿 五、互斥锁的原理 六、死锁 前言 我们学习过线程概念与线程控制&#xff0c;知道了线…