Linux Shell脚本文件

简介: vi的使用• 一般指令模式 : 以vi打开一个文件就是vi一般指令模式• 编辑模式 : 在一般指令模式下按【i o a r】等按钮会进入编辑模式,按Esc退出编辑模式• 命令模式:在一般指令模式中输入【: / ?】按钮有可以进入命令模式,进行保存查找等操作。

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 sum
declare -r sum
sum=aaa
declare +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 # 使用到的内容显示在屏幕上


相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
14天前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
38 5
|
14天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
34 6
|
14天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
45 6
|
11天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
33 1
|
15天前
|
监控 Linux Perl
Linux 命令小技巧:显示文件指定行的内容
在 Linux 系统中,处理文本文件是一项常见任务。本文介绍了如何使用 head、tail、sed 和 awk 等命令快速显示文件中的指定行内容,帮助你高效处理文本文件。通过实际应用场景和案例分析,展示了这些命令在代码审查、日志分析和文本处理中的具体用途。同时,还提供了注意事项和技巧,帮助你更好地掌握这些命令。
32 4
|
16天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
37 2
|
20天前
|
缓存 监控 Linux
|
1月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
85 1
|
25天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
48 2
6种方法打造出色的Shell脚本
下一篇
无影云桌面