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 # 使用到的内容显示在屏幕上


目录
相关文章
|
1天前
|
弹性计算 运维 Shell
使用shell 脚本打印图形3
【4月更文挑战第29天】
4 0
|
1天前
|
存储 弹性计算 运维
使用shell 脚本打印图形2
【4月更文挑战第29天】
5 0
|
1天前
|
弹性计算 运维 Shell
使用shell 脚本打印图形1
【4月更文挑战第29天】
5 0
|
1天前
|
存储 弹性计算 运维
调整虚拟机内存参数的shell 脚本
【4月更文挑战第29天】
6 0
|
1天前
|
弹性计算 运维 Shell
从shell脚本发送邮件
【4月更文挑战第29天】
9 0
|
1天前
|
弹性计算 运维 Shell
使用 shell 脚本打印图形
【4月更文挑战第29天】
7 1
|
1天前
|
存储 弹性计算 运维
调整虚拟机内存参数的 shell 脚本
【4月更文挑战第29天】
10 2
|
2天前
|
关系型数据库 MySQL Shell
备份 MySQL 的 shell 脚本(mysqldump版本)
【4月更文挑战第28天】
7 0
|
2天前
|
Linux Python
【专栏】Linux 中某个目录中的文件数如何查看?这篇教程分分钟教会你!
【4月更文挑战第28天】在Linux中查看目录文件数的方法包括:使用`ls`结合`wc -l`,如`ls <directory_path> | wc -l`;使用`find`命令,如`find <directory_path> -type f | wc -l`;使用`tree`命令,如`tree <directory_path>`(可能需额外安装);以及通过编程方式,例如Python代码实现。注意权限、效率和选择适用方法以提升操作效率。本文提供了详细步骤和示例,助你轻松掌握!
|
2天前
|
存储 数据挖掘 Linux
【专栏】教你如何快速在 Linux 中找到某个目录中最大的文件
【4月更文挑战第28天】在 Linux 中查找目录中最大文件的方法包括:使用 `du` 结合 `sort`,`find` 结合 `xargs` 和 `sort`,以及编写 Python 脚本。这些技巧适用于服务器管理、数据分析和文件清理等场景,能帮助用户快速定位大文件进行分析、清理或优化。注意文件权限、目录深度和文件系统类型可能影响结果,可结合其他命令增强功能。

热门文章

最新文章