Linux Shell脚本文件

文章目录

Linux Shell脚本文件

vim编辑器

vi的使用

  • 一般指令模式 : 以vi打开一个文件就是vi一般指令模式
  • 编辑模式 : 在一般指令模式下按【i o a r】等按钮会进入编辑模式,按Esc退出编辑模式
  • 命令模式:在一般指令模式中输入【: / ?】按钮有可以进入命令模式,进行保存查找等操作。
shell 复制代码
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

尝试执行一下命令吧:

shell 复制代码
type ls
type -t ls
type -a ls
type cd

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

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

变量

执行一下命令吧:

shell 复制代码
echo $variable
echo $PATH
echo ${PATH}

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

变量规则:

  • 变量与内容用=连接

  • 等号的两边不能有空格

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

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

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

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

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

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

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

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

环境变量

执行以下命令吧:

shell 复制代码
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前面显示的内容

$?是接收的回传的信息

用户操作变量

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
shell 复制代码
sum=100+300+50
echo ${sum}
delcare -i sum=100+300+50
echo ${sum}

declare -x sum
export | grep sum

declare -r sum
sum=aaa

declare +x sum
declare -p sum

命令的别名与历史命名

执行以下命令吧

shell 复制代码
ls -al | more 
alias lm='ls -al | more'
lm

历史命名

shell 复制代码
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

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私房菜

利用日期建立文件

shell 复制代码
# !/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}

数值计算

shell 复制代码
# !/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}"
shell 复制代码
# !/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

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

语法介绍

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

shell 的调试

shell 复制代码
sh -n aa.sh # 检查语法是否错误,不执行
sh -n aa.sh # 列出执行过程
sh -x aa.sh # 使用到的内容显示在屏幕上
相关推荐
Mr. Cao code18 分钟前
Docker:颠覆传统虚拟化的轻量级革命
linux·运维·ubuntu·docker·容器
抓饼先生39 分钟前
Linux control group笔记
linux·笔记·bash
挺6的还1 小时前
25.线程概念和控制(二)
linux
您的通讯录好友1 小时前
conda环境导出
linux·windows·conda
代码AC不AC2 小时前
【Linux】vim工具篇
linux·vim·工具详解
码农hbk3 小时前
Linux signal 图文详解(三)信号处理
linux·信号处理
bug攻城狮3 小时前
Skopeo 工具介绍与 CentOS 7 安装指南
linux·运维·centos
宇宙第一小趴菜3 小时前
08 修改自己的Centos的软件源
linux·运维·centos
bug攻城狮3 小时前
彻底禁用 CentOS 7.9 中 vi/vim 的滴滴声
linux·运维·服务器·centos·vim
XMYX-03 小时前
Linux 物理机如何区分 SSD 与 HDD ——以 DELL PERC H730 Mini 为例
linux·运维