文章目录
Shell 简介
Shell:命令行解释器
作用:接收用户 & 系统指令,调用操作系统的内核
Shell 解释器
查看Centos7提供的Shell解释器
# 查看Linux提供的Shell解释器
cat /etc/shells
sh : bash
cd /bin
ll | grep bash
Centos 默认bash
echo $bash
1 Shell 脚本入门
脚本格式
首先指定解释器
#!/bin/bash
悄悄地说:开头写#!/bin/sh 也可以执行,软连接 用的还是 bash
1.1 脚本常用执行方式
1.1.1 sh & bash + 脚本
- sh + 相对路径
- sh + 绝对路径
- bash + 相对路径
- bash + 绝对路径
1.1.2 直接输入脚本
需要执行权限
chmod 777 helloworld.sh
./helloworld.sh
/bin/helloworld.sh
Debug
1 sh -x test.sh
#!/bin/bash -x
1.3 多命令处理
[root@localhost bin]# vi batch.sh
[root@localhost bin]# ls
batch.sh
[root@localhost bin]# cat batch.sh
#!/bin/bash
mkdir /home/bin/test
cd /home/bin/test
touch test.txt
echo "Hello World" >> test.txt
[root@localhost bin]# sh batch.sh
[root@localhost bin]# cat /home/bin/test/test.txt
Hello World
[root@localhost bin]#
2 变量
2.1 常用的系统变量
$HOME
$PWD
$SHELL
$USER
查看系统中的全部变量
set
2.2 自定义变量
1 基本语法
- 定义变量
变量=值
A=5
- 撤销变量
unset 变量
unset A
- 申明静态变量(不可修改撤销)
readonly 变量=值
readonly A=5
2 变量定义规则
- 变量名
字母 & 数字 & 下划线 组成
数字不能开头,建议字母全部大写
- 等号两侧不能有空格
- 在bash中,变量默认字符串,无法数值计算
- 变量有空格需要加 ’ ’ 或 " "
2.3 特殊变量
$n
n:数字
$0:代表该脚本的名称
$1~$9:第一个到第九个的参数
${10}~:十以上的参数
#!/bin/bash
echo $0
echo "$0"
echo $0 $1 $2 $3 $4
$#
获取所输入的参数的个数
常用于循环当中
#!/bin/bash
echo $0
echo "$0"
echo $0 $1 $2 $3 $4
echo $#
$* $@
$*
代表命令行中的所有的参数
$*: 把所有的参数都看成一个整体
$@
也是代表全部的参数
不过$@把所有的参数都区别对待
#!/bin/bash
echo $0
echo "$0"
echo $0 $1 $2 $3 $4
echo $*
echo $@
比较两者区别
当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1
2
…
2 …
2…n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “
2
”
…
”
2”…”
2”…”n”的形式输出所有参数
#!/bin/bash
for i in "$*"
do
echo "echo $i"
done
#!/bin/bash
for i in "$@"
do
echo "echo $i"
done
$?
最后一次执行的命令的返回状态。
返回 0 ,证明上一个命令正确执行
返回非0 :上一个命令不正确(具体返回数字由名字决定)
3 运算符
3.1 基本语法
$((运算式))
$[运算式]
expr + , - , \*, / . % (加 减 乘 除 取余)
action: expr 运算符间要有空格
4 条件判断
[ condition ]
action : 条件非空即为true ,[atguigu] 返回true , [] 返回false
4.1 判断条件
4.1.1 两个整数之间比较
= 字符串比较
-lt (less than) -le (less equal)
-eq (equal) -gt(greater than)
-ge(greater equal) -ne(not equal)
4.1.2 是否具有写权限
2)helloworld.sh是否具有写权限
[atguigu@hadoop101 datas]$ [ -w helloworld.sh ]
[atguigu@hadoop101 datas]$ echo $?
0
4.1.2 是否存在文件
3)/home/atguigu/cls.txt目录中的文件是否存在
[atguigu@hadoop101 datas]$ [ -e /home/atguigu/cls.txt ]
[atguigu@hadoop101 datas]$ echo $?
1
5 流程控制
5.1 if判断
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件 ]
then
程序
fi
action:[ 条件 ] 中括号和条件之间必须有空格
if后面要有空格
#!/bin/sh
if [ $1 -eq 1 ]
then
echo one
elif [ $1 -eq 2 ]
then
echo two
else
echo "other"
fi
5.2 case语句
case $变量名 in
“值 1”)
如果变量名的值等于1,则执行程序1
;;
“值 2”)
如果变量名的值等于2,则执行程序2
;;
*)
如果以上值都不相等,执行此程序
;;
esac
case行尾必须为单词in ,每一个模式匹配必须以) 结束
双分号;;表示命令序列结束,相当于java中的break
最后的 * )表示静默模式,相当于java中的default
#!/bin/bash
case $1 in
"1")
echo "one"
;;
"2")
echo "two"
;;
*)
echo "other"
;;
esac
~
5.3 for循环
语法1
for(( 初始值;循环控制条件;变量变化 ))
do
程序
done
[root@localhost soft]# vi for.sh
#!/bin/bash
s=0
for((i=0;i<10;i++))
do
echo $i
done
语法2
for 变量 in 值1 值2 值3...
do
...
done
#!/bin/bash
for i in $*
do
echo "ceho $i "
done
5.4 while
while [ 条件 ]
do
...
done
#!/bin/bash
s=0
i=1
while [ $i -le 10 ]
do
s=$[ $s + $i ]
i=$[ $i + 1 ]
done
echo $s
6 read读取控制台输入
read(选项)(参数)
选项:
-p: 指定读取时的提示符;
-t:指定读取值等待的时间(秒)
参数
变量:指定读取值的变量名
案例:提示7秒内 读取控制台输入的名称
#!/bin/bash
read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME
7 函数
7.1 系统函数
basename基本语法
basename[ string / pathname] [ suffix ]
删掉所有的前缀包括最后一个('/')字符,让后将字符串显示出来
suffix为后缀,如果suffix被指定了,basename会将pathname或stringzhongdesuffix去掉
dirname基本语法
dirname文件绝对路径
去除文件名(非目录部分 然后返回剩下绝对路径)
7.2 自定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
funname
函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,
将以最后一条命令的运行结果作为返回值
return后跟数值n(0-255)
#!/bin/bash
function sum()
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
read -p "Please input the number1:" n1;
read -p "Please input the number2:" n2;
sum $n1 $n2;
8 Shell工具
8.1 cut
cut的工作就是“剪” ,具体的说就是在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节、字符和字段 并输出
cut [ 选项参数 ] filename
默认分隔符是制表符
-f : 列好 读取第几列
-d : 分隔符,按照指示分隔符分割
8.2 sed
sed是一种流编辑器,一次处理一行内容
处理时,处理内容存储在临时缓冲区 称为“模式空间” 文件内容没有改变
sed [ 选项参数 ] ‘command’ filename
选项参数:
-e:直接在指令列模式上进行sed的动作编辑
命令功能:
a:新增,a的后面可以接字串,在下一行出现
d:删除
s:查找替换
不改变源文件插入一行
删除包含C的行
替换C为Swift
8.3 awk
一个强大的文本分析工具,将文本逐行读入,以空格为默认分隔符将每行切片 切开的部分再进行分许处理
awk [ 选项参数 ] ‘pattern1{action} pattern2{action}...’ filename
pattern : 表示awk再数据中查找的内容 ,就是匹配模式
action : 在找到的匹配内容中进行一系列的命令
-F : 指定分隔符
-v : 复制一个用户 定义变量
awk -F: '/^root/{print $7}' passwd
查找root 并打印第七行
awk -v i=1 -F: '{print $3+i}' passwd
将passwd文件中的用户id增加数量1并输出
awk内置变量
FILENAME : 文件名
NR : 已读的记录数
NF : 浏览记录的域的个数(切割后 , 列的个数)
查询Python所在的行数
只显示/etc/passwd 的第一列和第七列,以逗号分隔,且在所有行前添加列明user,最后一行添加“END”
Action:BEGIN在所有数据读取之前执行,END在所有数据读取之后进行
8.4 sort
将文件进行排序 并将排序结果标准输出
sort(选项)(参数)
-n:依照数值大小进行排序
-r:依照相反的顺序进行排序
-t:设置排序时所用的分隔符
-k:指定排序的列
倒叙排列第三行
面试题总结
使用Linux命令查询file中空行所在的行号
awk '/^S/{print NR}' filename
shell 计算第二列的和并输出
cat cut.txt | awk -F " " '{sum+=$2} END{print sum}'
shell检查一个文件存不存在
if [ -f hello.txt ]
then
echo "文件存在"
else
echo "文件不存在"
fi
shell对文本第一列数字排序并求和
sort -n cut.txt | awk ‘{a+=$0;print$0}END{print "SUM="a}’
查找当前文件夹(/home)下所有的文本文件内容中包含有"hello"的文件名称
gerp -r "hello" | cut -d ":" -f 1
Shell编写规范
开头写脚本介绍
#!/bin/bash
# sh standard.sh db table where
#---------------------------------------------
#FileName: standard.sh
#Version: 1.0
#Date: 2020-03-15
#Author: ruozedata-J
#Description: example of shell script
#Notes: project ....
# 2020-07-01 脚本开发
# 2020-07-10 脚本bug修复,具体bug为.....
#---------------------------------------------
遇到没有命名的参数,直接退出,防止出现误操作
set -u
退出
exit 0 # 正常退出
exit 1 # 异常退出