- 为文件增加执行权 chmod +x 文件名
shell执行的方式
-
Shell脚本的执行通常可以采用以下几种方式
-
bash /path/to/script-name
或/bin/bash /path/to/script-name
(强烈推荐使用) -
/path/to/script-name
或./script-name
(当前路径下执行脚本) -
source script-name
或. script-name
(注意“.“点号)-
列子:
vim pyhello 脚本内容 #!/usr/bin/python3.5 print('hello world') 添加权限 chmod +x pyhello 执行脚本 ./pyhello
-
执行说明:
1、脚本文件本身没有可执行权限或者脚本首行没有命令解释器时使用的方法,我们推荐用bash执行。(使用频率:☆☆☆☆☆)
2、脚本文件具有可执行权限时使用。(使用频率:☆☆☆☆)
3、使用source或者.点号,加载shell脚本文件内容,使shell脚本内容环境和当前用户环境一致。(使用频率:☆☆☆)
使用场景:环境一致性
脚本开发规范
- 1、脚本命名要有意义,文件后缀是.sh
- 2、脚本文件首行是而且必须是脚本解释器
#!/bin/bash
3.[]中括号两端要有空格,书写时即可留出空格[ ],然后再退格书写内容。
本地变量
-
1)本地变量是什么?
本地变量就是:在当前系统的某个环境下才能生效的变量,作用范围小。
本地变量包含两种:普通变量和命令变量 -
2)普通变量:
普通变量的定义方式有如下三种,接下来我们就分别说一下这三种方式:方式一: 变量名=变量值 重点: 变量值必须是一个整体,中间没有特殊字符 方式二: 变量名='变量值' 重点: 我看到的内容,我就输出什么内容 方式三: 变量名="变量值" 重点: 如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B
习惯:
数字不加引号,其他默认加双引号 -
3)命令变量(熟练)
命令变量有两种定义方式,接下来我们就来介绍一下这两种方式定义方式一: 变量名=`命令` 注意: ` 是反引号 定义方式二: 变量名=$(命令) 执行流程: 1、执行``或者$()范围内的命令 2、将命令执行后的结果,赋值给新的变量名A
全局变量
-
shell内置变量
$0 获取当前执行的shell脚本文件名,包括脚本路径
$n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大 括号括起来${10}
$* 这个程式的所有参数,此选项参数可超过9个。
$# 获取当前shell命令行中参数的总个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 获取执行上一个指令的返回值(0为成功,非0为失败)
$- 显示shell使用的当前选项,与set命令功能相同
$@ 跟$*类似,但是可以当作数组用
字符串精确截取
格式:${变量名:起始位置:截取长度}
示例:
${file:0:5} 从第1个字符开始,截取5个字符
${file::5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:5} 从第6个字符开始,截取后面所有的字符
${file:0-5} 从倒数第5个字符开始,截取后面所有的字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
文件表达式
-f 判断输入内容是否是一个文件 -f weizhi.sh
-d 判断输入内容是否是一个目录 -d weizhi.sddh
创建nihao目录: mkdir nihao
-x 判断输入内容是否可执行 -x test.sh
echo $? 返回值为0条件成立 返回值为1条件不成立
数值操作符
判断第一个与第二个数的关系,
n1 -eq n2 相等 equal
n1 -gt n2 大于 greater than
n1 -ge n2 大于等于 great than or equal to
n1 -lt n2 小于 less than
n1 -le n2 小于等于 less than or equal to
n1 -ne n2 不等于 not equal
计算表达式
方式一:
$(()) $(( 计算表达式 )) $((1+1))
方式二:
let let 计算表达式 let a=1+1 (表达式必须是一个整体,中间不能出现空格等特殊字符)
ps aux | grep XXX 进程查看命令 Process Status
& 就是将一个命令从前台转到后台执行
Ctrl+Z 让当前任务转入到后台并停止
jobs 查看后台任务
fg 让后台进程转入到前台执行
bg 让后台停止的任务继续在后台执行
grep命令(文本搜索命)
grep [参数] [关键字] <文件名>
-
参数详解
-c:只输出匹配行的计数。 eg:输出匹配aaa的个数 grep -c aaa find.txt -n:显示匹配行及行号。 eg:输出匹配内容,同时显示行号 grep -n CCC find.txt -v:显示不包含匹配文本的所有行 eg:匹配到的内容不输出,输出不匹配的 grep -v ni find.txt -i:不区分大小写 技巧 精确定位到错误代码 grep -nr [错误关键字] * 匹配 [] ⾥中⼀系列字符中的⼀个;搜寻匹配单词signal、signaL、 Signal、SignaL的⾏; eg:grep -n '[Ss]igna[Ll]' 1.txt (点)匹配⼀个⾮换⾏符的字符;匹配 e 和 e 之间有任意⼀个字符, 可以匹配 eee,eae,eve,但是不匹配 ee,eaae; eg:grep -n 'e.e' 1.txt
sed命令详解(行文件编辑工具)
-
替换操作
行号不加默认改变所有行第一个,列号不加默认第一行第一列sed [替换格式] [文件名]
- 注意:
- 替换每行首个命令的写法 sed ‘s#原内容#替换后内容#’ 文件名
- 替换全部匹配内容: sed -i ‘s#原内容#替换后内容#g’ 文件名
- 指定行号替换首个匹配内容:sed -i ‘行号s#原内容#替换后内容#’ 文件名
- 首行指定列号替换匹配内容:sed -i ‘s#原内容#替换后内容#列号’ 文件名
- 指定行号列号匹配内容:sed -i ‘行号s#原内容#替换后内容#列号’ 文件名
-
增加操作
-
1)在指定行号的下一行增加内容
sed -i '行号a\增加的内容' 文件名 eg:sed -i '2a\zengjia-2' sed.txt sed -i '1,3a\增加内容' 文件名 eg: sed -i '1,3a\tongshi-2' sed.txt
-
2)在指定行号的当行增加内容
sed -i '行号i\增加的内容' 文件名 eg:sed -i '1i\insert-1' sed.txt sed -i '1,3i\增加内容' 文件名
-
`
- `删除操作
-
1)指定行号删除
sed -i '行号d' 文件名 sed -i '4d' sed.txt
-
2)删除多行,
sed -i '1,3d' 文件名 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 指定隔离分隔符,查看内容 awk -F ':' '{print $1,$7}' linshi.txt 设置显示分隔符,显示所有内容 awk 'BEGIN{OFS=":"} {print NR,$0}' awk.txt
find命令详解
-
命令格式:
find [路径] [参数] [关键字]
-
参数详解
-name 按照文件名查找文件。 -perm 按照文件权限来查找文件。 -user 按照文件属主来查找文件。 -group 按照文件所属的组来查找文件。 -type 查找某一类型的文件, 诸如: b - 块设备文件 d - 目录 c - 字符设备文件 p - 管道文件 l - 符号链接文件 f - 普通文件。 -size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。 -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。 -mindepth n:在查找文件时,查找当前目录中的第n层目录的文件,然后再在其子目录中查找。 ! : 表示取反
-
命令演示
在当前系统中查找一个叫awk的文件admin-1@ubuntu:~$ sudo find /home/admin-1/ -name "awk.txt"
在当前系统中查找文件类型为普通文件的文件
``` admin-1@ubuntu:~$ find /tmp -type f ```
-
常⽤⽤法:
find ./ -name test.sh 查找当前⽬录下所有名为test.sh的⽂件 find ./ -name '*.sh' 查找当前⽬录下所有后缀为.sh的⽂件 find ./ -name "[A-Z]*" 查找当前⽬录下所有以⼤写字⺟开头的⽂件 find /tmp -size 2M 查找在/tmp⽬录下等于2M的⽂件 find /tmp -size +2M 查找在/tmp⽬录下⼤于2M的⽂件 find /tmp -size -2M 查找在/tmp⽬录下⼩于2M的⽂件 find ./ -size +4k -size -5M 查找当前⽬录下⼤于4k,⼩于5M的⽂件 find ./ -perm 777 查找当前⽬录下权限为 777 的⽂件或⽬录
第4章 流程控制
流程控制主要分为两种:
- 简单流程控制语句:选择和循环
- 复杂流程控制语句:函数
-
单分支if语句
if [ 条件 ] then 指令 fi
-
双分支if语句
if [ 条件 ] then 指令1 else 指令2 fi
-
多分支if语句
if [ 条件 ] then 指令1 elif [ 条件2 ] then 指令2 else 指令3 fi
-
实例:
#!/bin/bash # 单if语句的使用场景 if [ "$1" == "nan" ] then echo "您的性别是 男" elif [ "$1" == "nv" ] then echo "您的性别是 女" else echo "您的性别,我不知道" fi #!/bin/bash # 多if语句的使用场景 if [ "$1" == "start" ] then echo "服务启动中..." elif [ "$1" == "stop" ] then echo "服务关闭中..." elif [ "$1" == "restart" ] then echo "服务重启中..." else echo "$0 脚本的使用方式: $0 [ start | stop | restart ]" fi
-
cash 语句格式
case 变量名 in 值1) 指令1 ;; 值2) 指令2 ;; 值3) 指令3 ;; esac
-
case 实例
# cat case.sh #!/bin/bash # case语句使用场景 case "$1" in "start") echo "服务启动中..." ;; "stop") echo "服务关闭中..." ;; "restart") echo "服务重启中..." ;; *) echo "$0 脚本的使用方式: $0 [ start | stop | restart ]" ;; esac
-
for循环语句
语法格式for 值 in 列表 do 执行语句 done
实例遍历文件
#!/bin/bash # for语句的使用示例 for i in $(ls /root) do echo "${i}" done while循环语句 while 条件 do 执行语句 done
-
while循环语句
while 条件 do 执行语句 done
while实例
#!/bin/bash # while的示例 a=1 while [ "${a}" -lt 5 ] do echo "${a}" a=$((a+1)) done
-
until循环语句
until 条件 do 执行语句 done
untile实例
#!/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
-
-
传参函数格式:
-
传参数
函数名 参数
-
函数体调用参数:
函数名(){ 函数体 $n }
实例
#!/bin/bash # 函数的使用场景二 dayin(){ echo "wo de mingzi shi $1" } dayin 111
函数调用脚本传参
#!/bin/bash # 函数传参演示 # 定义传参数函数 dayin(){ echo "wode mignzi shi $1" } # 函数传参 dayin $1
-