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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

科研学习|研究方法——扎根理论三阶段编码如何做?

一、背景介绍 “主题标引”意指对文献内容进行分析, 然后对文献所表达的中心思想、所讨论的基本问题以及研究的对象等进行提取, 以形成主题概念, 然后在此基础上把可检索的主题词表示出来, 再将这些主题词按一定顺序 (如字顺) 排列, 对论述相同主题内容的文献加以集中, 从而提高…

vmware和ubuntu的问题与解决

1.问题与对策 最近使用vmware安装ubuntu16和ubuntu20&#xff0c;遇到了挺多的问题&#xff0c;如下 ubuntu在用过多次后&#xff0c;重启后登录用户名后会出现花屏的现象。 解决方案如下 在键盘上同时按键&#xff1a;Ctrl Alt F4&#xff0c;进入命令行模式&#xff0c;…

Hive3.0.0建库表命令测试

Hive创建表格格式如下&#xff1a; create [external] table [if not exists] table_name [(col_name data_type [comment col_comment],)] [comment table_comment] [partitioned by(col_name data_type [comment col_comment],)] [clustered by (col_name,col_name,...)…

三防平板定制服务:亿道信息与个性化生产的紧密结合

在当今数字化时代&#xff0c;个性化定制已经成为了市场的一大趋势&#xff0c;而三防平板定制服务作为其中的一部分&#xff0c;展现了数字化技术与个性化需求之间的紧密结合。这种服务是通过亿道信息所提供的技术支持&#xff0c;为用户提供了满足特定需求的定制化三防平板&a…

leetcode代码记录(下一个更大元素 I

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#x…

Severt和tomcat的使用(补充)

打包程序 在pom.xml中添加上述代码之后打包时会生成war包并且包的名称是test 默认情况打的是jar包.jar里量但是tomcat要求的是war包. war包Tomcat专属的压缩包. war里面不光有.class还有一些tomcat要求的配置文件(web.xml等)还有前端的一些代码(html, css, js) 点击其右边的m…

【大数据】安装hive-3.1.2

1、上传HIVE包到/opt/software目录并解压到/opt/modules/ tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/modules/ 2、修改路径 mv /opt/modules/apache-hive-3.1.2-bin/ /opt/modules/hive 3、将hIVE下的bin目录加入到/etc/profile中 export HIVE_HOME/opt/module…

机器学习(30)

文章目录 摘要一、文献阅读1. 题目2. abstract3. 网络架构3.1 Sequence Generative Adversarial Nets3.2 SeqGAN via Policy Gradient3.3 The Generative Model for Sequences3.4 The Discriminative Model for Sequences(CNN) 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过…

Svg Flow Editor 原生svg流程图编辑器(五)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;三&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;四&#xf…

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

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

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

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

Java: LinkedList的模拟实现

一、双向链表简介 上一篇文章我介绍了单向链表的实现&#xff0c;单向链表的特点是&#xff1a;可以根据上一个节点访问下一个节点&#xff01;但是&#xff0c;它有个缺点&#xff0c;无法通过下一个节点访问上一个节点&#xff01;这也是它称为单向链表的原因。 那么&#x…

Codigger Desktop:用户体验与获得收益双赢的革新之作(一)

上周&#xff0c;我们介绍了Codigger Desktop凭借其强大的功能、稳定的性能以及人性化的设计&#xff0c;成为了广大开发者的得力助手。Codigger Desktop除了是开发者的利器外&#xff0c;它以其出色的用户体验和创新的收益模式&#xff0c;为用户提供了一个全新的选择。Codigg…

leetcode代码记录(下一个更大元素 II

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素…

微信小程序真机无法下载文件

问题&#xff1a; 1、真机无法展示加了防盗链的图片 2、真机无法下载pdf等文件 文件服务器供应商&#xff1a;腾讯 解决&#xff1a; 1、在文件服务器控制台加上微信小程序的域名白名单&#xff1a;servicewechat.com 具体可查看&#xff1a;对象存储 设置防盗链-控制台指…

mysql结构与sql执行流程

Mysql的大体结构 客户端&#xff1a;用于链接mysql的软件 连接池&#xff1a; sql接口&#xff1a; 查询解析器&#xff1a; MySQL连接层 连接层&#xff1a; 应用程序通过接口&#xff08;如odbc,jdbc&#xff09;来连接mysql&#xff0c;最先连接处理的是连接层。 连接层…

STM32CubeMX+MDK通过I2S接口进行音频输入输出(全双工读写一个DMA回调)

一、前言 目前有一个关于通过STM32F411CEUx的I2S总线接口控制SSS1700芯片进行音频输入输出的研究。 SSS1700 是具有片上振荡器的 3S 高度集成的USB音频控制器芯片 。 SSS1700 功能支持96 KHz 24 位采样率&#xff0c;带外部音频编解码器&#xff08;24 位/96KHz I2S 输入和输出…

Java常用API_正则表达式_检验字符串是否满足规则——基础使用方法及综合练习

正则表达式可以校验字符串是否满足一定的规则&#xff0c;并用来校验数据格式的合法性。 简单举例&#xff1a; 校验一个qq号是否符合要求 要求&#xff1a;6位到20位之内&#xff0c;不能以0开头&#xff0c;必须全是数字 代码演示&#xff1a; public class Test1 {public…

【CicadaPlayer】视频切换/音视频同时切换

G:\CDN\all_players\CicadaPlayer-github-0.44\mediaPlayer\SuperMediaPlayer.hCicadaPlayer https://github.com/alibaba/CicadaPlayer可以clone 整个仓库的历史 git clone --bare https://github.com/username/project.git整体架构 :根据这个更容易理解:切换就是judgeFunc…

ElasticSearch的相关概念

文章目录 1、整体介绍1.1、elasticsearch的作用1.2、ELK技术栈1.3、elasticsearch和lucene1.4、为什么不是其他搜索技术&#xff1f;1.5、总结 2、倒排索引2.1、正向索引2.2、倒排索引2.3、总结 3、ES的一些概念3.1、文档和字段3.2、索引和映射3.3、mysql与elasticsearch3.4、安…