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