1. bash和source
- bash命令执行.sh文件会新开启子进程运行
- 用source执行.sh文件是在当前进程中运行
- source 命令执行.sh文件后加载了.sh文件的环境或者变量,可以直接在当前环境下使用
2. 脚本开发规范
-
#! /bin/bash
必须在首行 -
#!
称为shebang - 注释
单行注释: 只要首个字符是#,那么就表示该行是注释(除首行)
多行注释(两种):
:<<! ...(中间是内容) !
和
:<<任意字符 ...(中间是内容) 对应任意字符 - 尽量不用中文注释
- 脚本执行方式
bash /path/to/script-name 或 /bin/bash /path/to/script-name (强烈推荐使用)
/path/to/script-name 或 ./script-name (当前路径下执行脚本)
source script-name 或 . script-name (注意“.“点号后面有空格)
3. 声明临时全局变量
- 通过如下方式声明与使用
export name
env | grep name
4. shell与shell脚本的定义
shell的定义
- 在计算机科学中,Shell就是一个命令解释器。
- shell是位于操作系统和应用程序之间,是他们二者最主要的接口,shell负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。
shell脚本的定义 - 当可执行的Linux命令或语句不在命令行状态下执行,而是通过一个文件执行时,我们将这个文件为shell脚本。
5. 查看当前系统的shell类型
echo $SHELL
6. 创建临时脚本
创建linshi.sh
#!/bin/bash
# 这是临时shell脚本
echo 'nihao'
echo 'itcast'
执行(终端输入bash linshi.sh)结果如下
nihao
itcast
7. shell中的变量
本地变量
- 在当前系统的某个环境下才能生效的变量,作用范围小; 包括普通变量和命令变量
- 普通变量:
常用数字不加引号,其他默认加双引号
变量名="变量值"
如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,
重新赋值给变量B - 命令变量
变量名=()范围内的命令
2、将命令执行后的结果,赋值给新的变量名A
全局变量 - 在当前系统的所有环境下都能生效的变量
- 环境是:每打开一个终端是一个shell环境,使用非source执行方式时,会开启子进程,也是一个shell环境,称为子shell环境。
- 查看全局变量
env # 只显示全局变量,主要是加载了~/.bashrc和/etc/profile文件
- 定义全局变量
方法一:
变量名=值
export 变量
方法二:(最常用)
export 变量名=值
-
总结:在终端中定义全局变量时,只对当前shell环境及子shell环境有效,对新开的终端无效,当前终端关闭后,它定义的全局变量消失。
-
查看变量
方式一:
$变量名
方式二:
"$变量名"
方式三:
${变量名}
方式四:标准使用方式
"${变量名}"
- 取消变量
unset 变量名
shell内置变量
~! 和脚本有关的
- $0 获取当前执行的shell脚本文件名
- $$ 获取执行shell脚本的进程号
- {10}
- $# 获取当前shell命令行中参数的总个数
- $? 获取执行上一个指令的返回值(0为成功,非0为失败)
$$$ - 字符串精确截取
格式:${变量名:起始位置:截取长度}
${file:0:5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
- 默认值相关
情况一
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容
格式:
${变量名:-默认值}
情况二
无论变量a是否有内容,都输出默认值
格式:
${变量名+默认值}
8. 测试语句
条件表达式两种形式
a test 条件表达式
b [ 条件表达式 ]
[ ]与内部的条件表达式之间需要有空格;
test跟 [ ] 都是用于测试条件表达式是否成立,条件成立,状态返回值是0,条件不成立,状态返回值是1
条件表达式
-
逻辑表达式
命令1 && 命令2
a 如果命令1执行成功,那么执行命令2
b 如果命令1执行失败,那么不执行命令2
[ 1 = 1 ] && echo "条件成立"
命令1 || 命令2
a 如果命令1执行成功,那么不执行命令2
b 如果命令1执行失败,那么执行命令2
[ 1 = 2 ] || echo "条件不成立"
-
文件表达式
-f 判断输入内容是否是一个文件
[ -f weizhi.sh ] && echo "是一个文件"
-d 判断输入内容是否是一个目录
[ -d weizhi.sddh ] || echo "不是一个目录"
-x 判断输入内容是否可执行
[ -x age.sh ] || echo "文件没有执行权限"
-
数值操作
n1 -eq n2 相等
n1 -gt n2 大于
n1 -ge n2 大于等于
n1 -lt n2 小于
n1 -lte n2 小于
n1 -ne n2 不等于 字符串比较
计算表达式
- $(( 计算表达式 ))
$(())中只能用+-*/和()运算符,并且只能做整数运算
- let 计算表达式
9. linux常见符号
-
|
使用格式: 命令1|
命令2
管道符左侧命令1执行后的结果作为输入传递给右侧的命令2使用
env | grep SHELL
-
>
>>
在shell脚本中有两种常见的重定向符号 > 和 >>
echo "file1.txt" > file.txt
将file1.txt字符串覆盖写入file.txt文件
echo "file1.txt" >> file.txt
将file1.txt字符串追加写入到file.txt文件 -
&
后台展示符号 &(跟在一条命令之后,将一个命令从前台转到后台执行)
在命令之后添加 &开启一个新的进程执行,不影响当前进程的操作
sleep 10 &
-
2>&1
全部信息符号 2>&1 符号详解: 1 表示标准输出的信息 2 表示标准错误的信息 2>&1 代表所有输出的信息
标准正确输出示例cat nihao.txt 1>> zhengque
标准错误输出示例(不存在itcast命令,会报错)itcast 2>> errfile
将1重定向到ceshi-ok,将2重定向到ceshi-errbash ceshi.sh 1>> ceshi-ok 2>> ceshi-err
-
linux系统垃圾桶
/dev/null是linux下的一个设备文件,这个文件类似于一个垃圾桶,很多不重要的信息可以指向向其重定向
特点是:容量无限大 -
grep文本搜索命令
格式grep [参数] [关键字] <文件名>
参数详解:
-c:只输出匹配行的计数。grep -c aaa find.txt
-n:显示匹配行及行号。grep -n CCC find.txt
-v:显示不包含匹配文本的所有行。grep -v ni find.txt
sed 行文件编辑工具
命令格式: sed [参数] '<匹配条件> [动作]' [文件名]
-
-i
表示对文件进行编辑(不添加-i参数,修改操作结果直接往屏幕输出,不修改原文件)
动作详解
-a 在匹配到的内容下一行增加内容
-i 在匹配到的内容上一行增加内容
-d 删除匹配到的内容
-s 替换匹配到的内容
注意:上面的动作应该在参数为-i的时候使用,不然的话不会修改原文件
- 替换操作
命令格式:sed -i [替换格式] [文件名]
替换格式:'s#原内容#替换后内容#'
替换首每行的第1个sed为SEDsed -i 's#sed#SED#' sed.txt
替换全部sed为dessed -i 's#sed#SED#g' sed.txt
替换第2行的首个SED为sedsed -i '2s#SED#sed#' sed.txt
替换每行的第2个SED为sedsed -i 's#SED#sed#2' sed.txt
替换第3行的第2个SED为sedsed -i '3s#SED#sed#2' sed.txt
- 追加操作
格式:sed -i '行号a\增加的内容' 文件名
注意:如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开
指定行号增加内容sed -i '2a\zengjia-2' sed.txt
指定1~3每行都增加内容sed -i '1,3a\tongshi-2' sed.txt
- 插入操作
在指定行号的当行增加内容
格式:sed -i '行号i\增加的内容' 文件名
注意:如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开
指定行号增加内容sed -i '1i\insert-1' sed.txt
- 删除操作
作用:指定行号删除
格式:sed -i '行号d' 文件名
注意:如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开
删除第4行内容sed -i '4d' sed.txt
删除多行(3-5行)内容sed -i '3,5d' sed.txt
awk命令详解
命令格式: awk [参数] '[ 动作]' [文件名]
- 常见参数:
-F
指定行的分隔符 - 常见动作:
print 显示内容
$0
显示当前行所有内容
$n
显示当前行的第n列内容,如果存在多个$n,它们之间使用逗号(,)隔开 - 常见内置变量
FILENAME
当前输入文件的文件名,该变量是只读的
NR
指定显示行的行号
NF
输出 最后一列的内容
OFS 输出格式的列分隔符,缺省是空格
FS 输入文件的列分融符,缺省是连续的空格和Tab 模板文件内容
示例:
打印第1列的内容awk '{print $1}' awk.txt
打印第一行第1和第3列内容awk 'NR==1 {print $1,$3}' awk.txt
指定隔离分隔符,查看内容cat linshi.txt
设置显示分隔符,显示内容awk 'BEGIN{OFS=":"} {print NR,$0}' awk.txt
find命令详解
命令格式: find [路径] [参数] [关键字] 参数详解
-name
按照文件名查找文件。
-perm
按照文件权限来查找文件。
-user
按照文件属主来查找文件。
-group
按照文件所属的组来查找文件。
-type
查找某一类型的文件
-size n
:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth
:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-mindepth n
:在查找文件时,查找当前目录中的第n层目录的文件,然后再在其子目录中查找。
!
: 表示取反 命令演示: 在当前系统中查找一个叫awk的文件
10. 流程控制
简单流程控制语句
*** 简单流程控制语句***
- 单分支if语句
语法格式
if [ 条件 ]
then
指令
fi
示例(bash xxx.sh 参数):
#!/bin/bash
# 单if语句的使用场景
if [ "$1" == "nan" ]
then
echo "您的性别是 男"
fi
- 多分支if语句
if [ 条件 ]
then
指令1
elif [ 条件2 ]
then
指令2
else
指令3
fi
示例
多分支if语句示例(bash xxx.sh 参数)
#!/bin/bash
# 单if语句的使用场景
if [ "$1" == "nan" ]
then
echo "您的性别是 男"
elif [ "$1" == "nv" ]
then
echo "您的性别是 女"
else
echo "您的性别,我不知道"
fi
应用
admin-1@ubuntu:/data/scripts/python-n# cat if.sh
#!/bin/bash
# 多if语句的使用场景
if [ "$1" == "start" ]
then
echo "服务启动中..."
elif [ "$1" == "stop" ]
then
echo "服务关闭中..."
elif [ "$1" == "restart" ]
then
echo "服务重启中..."
else
echo "$0 脚本的使用方式: bash $0 [ start | stop | restart ]"
fi
- case语句
case语句格式
case 变量名 in
值1)
指令1
;;
...
值n)
指令n
;;
esac
示例
# cat case.sh
#!/bin/bash
# case语句使用场景
case "$1" in
"start")
echo "服务启动中..."
;;
"stop")
echo "服务关闭中..."
;;
"restart")
echo "服务重启中..."
;;
*)
echo "$0 脚本的使用方式:bash $0 [ start | stop | restart ]"
;;
esac
- for循环语句
示例:遍历文件
#!/bin/bash
# for语句的使用示例
for i in $(ls /root)
do
echo "${i}"
done
- while循环语句
while语句示例
#!/bin/bash
# while的示例
a=1
while [ "${a}" -lt 5 ]
do
echo "${a}"
a=$((a+1))
done
- until循环语句
until语句示例
#!/bin/bash
# until的示例
a=1
until [ "${a}" -eq 5 ]
do
echo "${a}"
a=$((a+1))
done
函数基础知识
- 简单函数定义和调用示例
#!/bin/bash
# 函数使用场景一:执行频繁的命令
dayin(){
echo "wo de mingzi shi 111"
}
# 调用
dayin
- 函数传参和函数体内调用参数示例
#!/bin/bash
dayin(){
echo "wo de mingzi shi $1"
}
# 调用函数传参
dayin 111
- 脚本传参, 函数调用
#!/bin/bash
# 定义传参数函数
dayin(){
echo "wode mignzi shi $1"
}
# 调用函数传参
dayin $1
- 脚本传参,函数调用(生产用)
#!/bin/bash
# 函数的使用场景二
canshu = "$1"
dayin(){
echo "wo de mingzi shi $1"
}
# 调用函数传参
dayin "${canshu}"
11. 代码发布
12. 环境部署
基础环境
创建基本目录
mkdir /data/{server,logs,backup,softs,virtual,scripts,codes} -p
-
- 修改root用户权限,使其可以远程被访问
- 切换到root用户
cd /etc/ssh
vi sshd_config
- 将注释掉的...
-
- 做主机间免密码认证需要做三个动作
- 本机生成密钥对
- 对端机器使用公钥文件认证
- 验证
网友评论