Linux Shell脚本文件

文章目录

  • Linux Shell脚本文件
    • vim编辑器
      • vi的使用
    • 认识Bash
      • 变量
      • 环境变量
        • 用户操作变量
          • delcare与typeset
      • 命令的别名与历史命名
    • 正则表达式
    • Shell Scripts
      • Shell Scripts良好习惯
      • 第一个shell
      • 其他shell例子 - 来自鸟哥linux私房菜
      • 语法介绍
      • shell 的调试

Linux Shell脚本文件

vim编辑器

vi的使用

  • 一般指令模式 : 以vi打开一个文件就是vi一般指令模式
  • 编辑模式 : 在一般指令模式下按【i o a r】等按钮会进入编辑模式,按Esc退出编辑模式
  • 命令模式:在一般指令模式中输入【: / ?】按钮有可以进入命令模式,进行保存查找等操作。
vi aa.txt
# 输入I之后随便写入,然后点Esc退出输入:然后加wq保存退出
  • 编辑模式按键说明:

光标移动

按键说明
h 或者左箭头光标向左移动一个字符
j 或者下箭头光标向下移动一个字符
k 或者上箭头光标向上移动一个字符
l 或者右箭头光标向右移动一个字符

你还可以输入数字之后按对应的移动按键以达到一次移动多行的命令

按键说明
ctrl + f屏幕向下移动一页 , 相当于page down 按键
ctrl + b屏幕向上移动一页 , 相当于page up 按键
ctrl + d屏幕向下移动半页
ctrl + u屏幕向上移动半页
+向下一行,且移动到行头
-向上移动一行,且移动到行头
n + space向后移动n个字符
0 或者 Home移动到行头
$ 或者end移动到行尾
H M L G当前也最上第一个字符,中间行第一个字符,最后行第一个字符 ,移动到最后一行
n + G移动到n行
gg移动到第一行
n + Enter向下移动n行

查找与替换

按键说明
/word向光标之下查询第一个名称为word的字符串, 回车之后光标在该单次第一个字符
?word向光标之上查询第一个名称为word的字符串, 回车之后光标在该单次第一个字符
:n1,n2s/word1/word2/g在n1 n2行中查询 word1 并且用word2替换
:1,$s/word1/word2/g在 全文中查询 word1 并且用word2替换
:1,$s/word1/word2/gc在 全文中查询 word1 并且用word2替换,替换前询问是否替换

删除,复制和粘贴

按键说明
x或者X删除一行这种的光标所在字符
[n]x删除一行中的n个字符
dd删除一行
[n]dd向下删除n行
d[n]G删除光标所在行到到n行的数据
dG删除光标到最后的数据(包括光标行)
d$删除该行光标到最后的字符
d0删除改行光标之前的字符(不包含光标)
yy复制一行
p或者P向下粘贴复制的内容
[n]yy复制n行
y[n]G复制光标到n行的数据
yG复制光标到最后的数据
y0复制光标到开头的内容
y$复制光标到结尾的内容
J将光标所在列与下一列合并,中间使用空格
c删除行
u向后退一步, 相当于windows中的ctrl Z
ctrl+r向前一步,相当于windows中的ctrl Y
.重复执行上一个命令
  • 一般模式切换到编辑模式说明
按键说明
i 或者 I进入插入模式
i从当前光标出插入
a 或者 A进入插入模式
a为从当前光标所在的下一个字符插入
o 或者 O进入插入模式
从当前光标的下一列开始插入
r 或者 R进入插入模式
替换当前字符并且插入,R的时候会一直替换到按下ESC为止
Esc终止编辑模式,进入一般指令模式
  • 一般模式切换到命令模式说明
按键说明
:w写入
:w!强制写入(跟权限有关)
:q退出
:q!强制退出
:wq保存退出
ZZ文件无变化则直接退出,有变化则保存退出
:w [filename]写道文件filename
:r [filename]读取另外一个文件数据
:n1,n2 w [filename]将n1到n2行写入filename文件
:!command暂时离开vi 执行command,按enter回到vi
:set nu显示行号
:set nonu取消行号

认识Bash

尝试执行一下命令吧:

type ls
type -t ls
type -a ls
type cd

在控制台输入随机字符,之后尝试下面按键组合

按键说明
ctrl+u /ctrl +k删除光标之前的字符串/删除光标之后的字符串
ctrl+a /ctrl +e移动光标到最前面/最后面

变量

执行一下命令吧:

echo $variable
echo $PATH
echo ${PATH}echo ${myname}
myname="aaa"   # 不能有空格
echo ${myname}
unset myname
echo ${myname}

变量规则:

  • 变量与内容用=连接

  • 等号的两边不能有空格

  • 变量名称只能是英文字母与数字但是开头不能是数字

  • 变量内容若有空格符可以使用双引号"或者单引号’将变量的内容结合起来,但是

    • 双引号内的特殊字符可以保持原有特性
    • 单引号内的字符则会变成字符串
  • 可以使用\将特殊字符变成一般字符

  • 在一串指令的执行中,还需要时候用其它指令信息时候,可以使用`或者$符号将指令包起来

  • 若变量为扩增变量内容时候,使用${变量} 加:来累加

  • 若该变量需要用在其他程序执行,则使用export来使变量编程环境变量

  • 通常大写字符是系统变量,小写字符是自定变量

  • 取消变量的方法为unset + 变量名称

环境变量

执行以下命令吧:

env
set
PS1='[\u@\h \w \A #\#]$ '
PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
echo $?
12name=asd
echo $?
echo $?
  • HOME:代表用户的家目录

  • SHELL:告诉我们这个shell使用的是那个程序

  • HISTSIZE:这个是历史命令有关,这个是记录的命令条数

  • MAIL:使用mail收信的时候使用的是这个邮箱

  • PATH:执行文件的搜索路径或者是库的路径 使用 : 分割

  • LANG:语系数据

  • RANDOM:随机数的变量

PS1 是shell前面显示的内容

$?是接收的回传的信息

用户操作变量

read atest # 执行之后 随便输入一些内容
echo ${atest}read -p "mmm:" -t 10 aaa # 10秒内输入变量aaa  提示信息为mmm
echo ${aaa}
delcare与typeset

delcare是将参数作为某种类型定义

  • a :array
  • i :integer
  • x :与export一样,将后面的参数设置成环境变量
  • r :read only 不能改变内容也不能unset
sum=100+300+50
echo ${sum}
delcare -i sum=100+300+50
echo ${sum}declare -x sum
export | grep sumdeclare -r sum
sum=aaadeclare +x sum
declare -p sum

命令的别名与历史命名

执行以下命令吧

ls -al | more 
alias lm='ls -al | more'
lm

历史命名

history
!615 # 615换成你们执行的lm的行号或者是其他的行号
!!
!al

好多命令啊,就不介绍了,反正也记不住,用到了再查吧

正则表达式

  • 兼容POSIX的特殊符号:
符号含义
[:alnum:]代表英文大小写和数字,0-9 A-Z a-z
[:alpha:]代表英文大小写A-Z a-z
[:blank:]代表空格键与Tab键两者
[:cntrl:]代表键盘上的控制按键 CR LF Tab Del等
[:digit:]代表数字0-9
[:graph:]代表除了空格符号(空格键与Tab键)以外的其他字符
[:lower:]代表小写字符 a-z
[:print:]代表可以被打印出来的字符
[:punct:]代表标点符号
[:upper:]代表大写字符 A-Z
[:space:]代表空格字符,空格键 Tab CR等
[:xdigit:]代表16进制数字类型, 包括 0-9 ,A-F ,a-f的数字与字符
  • 正则表达式字符整理
RE字符意义与范例
^word意义:查找开头是word行
grep -n ‘^#’ aa.txt
word$意义:查找行位是word的行
grep -n ‘!$’ aa.txt
.意义:代表一定有一个任意字符的字符
grep -n ‘e.e’ aa.txt
\转义字符
*意义:代表任意多个字符
grep -n ‘ess*’ aa.txt
[list]意义:代表符合字符集RE的字符,里面列出想要的字符
grep -n ‘g[ld]’ aa.txt
[n1-n2]意义:代表符合RE的字符,里面列出想要的字符范围
grep -n ‘[A-Z]’ aa.txt
[^list]意义:字符集符合RE字符,且不要列出的字符
grep -n ‘oo[^t]’ aa.txt
\{n, m\}意义:连续n到m个的字符
意义:若为{n}则是联系n个的前一个字符
意义:若为{n, }则是连续n个以上的前一个RE字符
grep -n ‘go\{2,3\}g’ aa.txt
  • 正则表达式的延伸
RE字符意义与范例
+意义:重复一个或者以上的前一个RE字符
grep -n ‘go+d’ aa.txt
意义:另个或者一个的前一个RE字符
grep -n ‘go?d’ aa.txt
|意义:用或的方式找出字符串
grep -n ‘gd|good’ aa.txt
()意义:找出群组字符串
grep -n ‘g(la|oo)d’ aa.txt
()+意义:多个重复群组字符串判断
echo AxyzxyzxyzxyzC | grep ‘A(xyz)+C’

Shell Scripts

shell script 的用处

  • 自动化管理
  • 追踪与管理系统的重要工作
  • 简单的入侵检测
  • 连续指令单一化
  • 简单的数据处理
  • 跨平台支持

Shell Scripts良好习惯

  • 功能
  • 版本信息
  • 作者与联系方式
  • 版权宣告方式
  • 历史记录
  • 特殊指定使用绝对路径方式下达
  • 需要的环境变量需要提前告知

第一个shell

# !/bin/bash
# Program:
# 		User input ...
# History
# 
read -p "Please Input your first name: " firstname
read -p "Please Input your last name: " lastname
echo -e "your name is ${firstname} ${lastname}"

其他shell例子 - 来自鸟哥linux私房菜

利用日期建立文件

# !/bin/bash
# Program:
# 		User input ...
# History
# 
echo -e "i will use touch command to create 3 files."
read -p "please input your filename : " fileuser
filename=${fileuser:-"filename"}
date1=$(date --date='2 days ago' +%Y%m%d)
date2=$(date --date='1 days ago' +%Y%m%d)
date3=$(date +%Y%m%d)
file1=${filename}${date1}
file2=${filename}${date2}
file3=${filename}${date3}
touch ${file1}
touch ${file2}
touch ${file3}

数值计算

# !/bin/bash
# Program:
# 		User input ...
# History
# 
echo -e "you should input 2nums i will multiplying them\n"
read -p "first number" firstnu
read -p "first number" secnu
total=$((${firstnu}*${secnu}))
echo -e "\n the result of ${firstnu}*${secnu} is ==> ${total}"
# !/bin/bash
# Program:
# 		User input ...
# History
# 
echo -e "this program will calculate pi value\n"
echo -e "you should inpyt a float number to calculate pi value.\n"
read -p "value " checking
num=${checking:-"10"}
echo -e "start calculate pi value,wait"
time echo "scale=${num}; 4*a(1)" | bc -lq

以上的脚本都可已正常执行。

语法介绍

  • 入参使用
$#  # 入参个数
$@  # 入参全拼
${1} # 第一个入参,以此类推
  • 条件表达式
if [ 条件 ]; then# 条件成立执行内容
fi
if [ 条件 ]; then
elif[ 条件 ]; then
else
fi
case $变量名称 in"第1个变量")# 程序;;"第2个变量")# 程序;;*)# 不包含第一个变量的其他变量;;
esac
  • function
function fname() {# 程序段
}
  • 循环
while [ condition ]
do# 程序
done
until [ condition ]
do# 程序
done
for var in con1 con2 con3 ...
do# 程序
done
for (( 初始值; 限制值; 执行步阶 ))
do# 程序
done

shell 的调试

sh -n aa.sh # 检查语法是否错误,不执行
sh -n aa.sh # 列出执行过程
sh -x aa.sh # 使用到的内容显示在屏幕上

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

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

相关文章

Centos 7 安装 Oracle 11G

Oracle 11G 安装教程 准备环境 p13390677_112040_Linux-x86-64_1of7.zipp13390677_112040_Linux-x86-64_2of7.zipCentos 7- rhel7-英文版的系统–不想换语言的执行(LANGen_US)– 传输 文件到服务器上 创建用户和组 [rootlocalhost ~]# groupadd oracle [rootlocalhost ~]…

20230715----重返学习-vue3新API-Vue3和Vue2对比-vue3语法-Vue3编码

day-113-one-hundred-and-thirteen-20230715-vue3新API-Vue3和Vue2对比-vue3语法-Vue3编码 vue3新API Vue 3 迁移指南 虚拟DOM 说明:看01视频。虚拟DOM是用于让vue核心代码脱离浏览器的限制,在微信小程序、手机端、canvas之类也有能使用vue语法的可能&#xff0…

Windows11 C盘瘦身

1.符号链接 将大文件夹移动到其他盘,创建成符号链接 2.修改Android Studio路径设置 1.SDK路径 2.Gradle路径 3.模拟器路径 设置环境变量 ANDROID_SDK_HOME

FLutter 开发中 fijkplayer设置屏幕常亮

FLutter 视频播放: 目前在做FLutter种的视频播放功能,遇到了视频播放的时候,屏幕突然黑屏了。网上找了很多,无论是设置在原生的Activity界面,添加如下代码, getWindow().addFlags(WindowManager.LayoutPara…

基于单片机的盲人导航智能拐杖老人防丢防摔倒发短息定位

功能介绍 以STM32单片机作为主控系统; OLED液晶当前实时距离,安全距离,当前经纬度信息;超声波检测小于设置的安全距离,蜂鸣器报警提示:低于安全距离!超声波检测当前障碍物距离,GPS进…

虚幻引擎复习笔记

虚幻引擎 宏观了解 工具链:纹理,材质,模型,动画,粒子,地形,声音,光照,毛发,破碎逻辑编写:蓝图可视化脚本,虚幻CGamePlay框架 初次接…

python发送邮件yagmail库

yagmail库发送邮件简洁,代码量少 import yagmaildef send_yagmail(sender, send_password, addressee, hostsmtp.qq.com, port465):yag yagmail.SMTP(sender, send_password, host, port)img_url https://img2.baidu.com/it/u483398814,2966849709&fm253&…

基于单片机的智能空调系统的设计与实现

功能介绍 以51单片机作为主控系统;LCD1602液晶显示当前水温,定时提醒,水量变化DS18B20检测当前水体温度;水位传感器检测当前水位;继电器驱动加热片进行水温加热;定时提醒喝水,蜂鸣器报警&#x…

学习注解的使用模拟RequestMapping解析path

文章目录 前言一、代码部分总结 前言 注解在后端开发过程中提供了许多的便利,提高了代码简洁性和可读性,在应用程序中占据越来越重要的作用,很有学习的必要,接下来会通过代码来完成对类、方法、属性注解的解析。 一、代码部分 p…

LeetCode面试题02.07.链表相交

面试题02.07.链表相交 两种解题思路 面试题02.07.链表相交一、双指针二、哈希集合 一、双指针 这道题简单来说,就是求两个链表交点节点的指针 这里注意:交点不是数值相等,而是指针相等 为了方便举例,假设节点元素数值相等&…

用Python采用Modbus-Tcp的方式读取485电子水尺数据

README.TXT 2023/6/15 V1.0 实现了单个点位数据通信、数据解析、数据存储 2023/6/17 V2.0 实现了多个点位数据通信、数据解析、数据存储 2023/6/19 V2.1 完善log存储,仅保留近3天的log记录,避免不必要的存储;限制log大小,2MB。架…

数字原生时代,奥哲如何让企业都成为“原住民”?

22年前,美国教育学家马克‧普伦斯基(Marc Prensky)出版了《数字原生与数字移民》(Digital Natives, Digital Immigrants)一书,首次提出了“数字原住民”和“数字移民”两大概念,用来定义跨时代的…

法规发展与算法备案:预测未来的重要议题

随着科技的快速发展,算法逐渐成为各行各业的核心驱动力,尤其在互联网领域,算法更是被赋予了生命力,为人们提供了便利的同时,也引发了一系列问题。因此,未来法规发展对于算法备案的关注将变得尤为重要。本文…

05-Vue基础之Class 与 Style 绑定

个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。 🎅**学习目标: 坚持每一次的学习打卡 文章…

OpenCV如何实现图像截取

import cv2img cv2.imread("image/2.png", 1) roi cv2.selectROI(img,showCrosshairTrue,fromCenterFalse) xmin,ymin,w,h roi imgROI img[ymin:yminh,xmin:xminw].copy()cv2.imshow("demo",imgROI) cv2.waitKey(0) 代码的核心就是用到了OpenCV中的函数…

leetcode_54 螺旋矩阵

1. 题目 螺旋矩阵 2. 题意 给定一个二维数组,顺时针螺旋输出其中的元素。 3. 题解 3.1 自己想的 一层一层的,关键点在于如何进入下一循环。和确定停止的位置,找停止的位置写了个函数。 用控制比特位的方式来进行控制一次顺时针循环, 还…

序列化的意义以及常见的的序列化方式

一,为什么序列化? 对象保存到文件或数据库网络编程时对象跨平台跨语言传输,也即从windows上序列化的对象可到linux上反序列化,用c#序列化的对象可以被java反序列化。RPC远程接口调用 二,常见得序列化方式…

【数据结构】_1.集合与复杂度

目录 1. 集合框架 2. 时间复杂度 2.1 时间复杂度和空间复杂度 2.2 时间复杂度的概念 2.3 大O的渐进表示法 2.3.1 精确的时间复杂度表达式 2.3.2 大O渐进表示法的三条规则 2.3.3 时间复杂度的最好、平均与最坏情况 2.4 时间复杂度计算示例 3.空间复杂度 1. 集合框架 …

字节跳动后端面试,笔试部分

var code "7022f444-ded0-477c-9afe-26812ca8e7cb" 背景 笔者在刷B站的时候,看到了一个关于面试的实录,前半段是八股文,后半段是笔试部分,感觉笔试部分的题目还是挺有意思的,特此记录一下。 笔试部分 问…

【多线程例题】顺序打印abc线程

顺序打印-进阶版 方法一:三个线程竞争同一个锁,通过count判断是否打印 方法二:三个线程同时start,分别上锁,从a开始,打印后唤醒b 三个线程分别打印A,B,C 方法一:通过co…