shellday01
1.什么是shell?
1.普通的文件
2.Linux命令组成
3.编辑语言
2.语法
2.1 入门
1.文件命名 结尾 一般都是以 .sh 结尾
2.文件内容 第一行 #!/bin/bash
1.编写脚本
wordcount 词频统计
helloworld
[root@bigdata02 shell]# cat wc.sh
#!/bin/bash
echo "www.bigdata.com"
2.运行shell脚本
1.sh xxx.sh
[root@bigdata02 shell]# sh ./wc.sh
www.bigdata.com
2.给脚本赋予 执行权限
chmod 744 ./wc.sh
[root@bigdata02 shell]# ./wc.sh
www.bigdata.com
[root@bigdata02 shell]# /root/shell/wc.sh
www.bigdata.com
3.补充:
debug
1.[root@bigdata02 shell]# cat wc.sh
#!/bin/bash -x
echo "www.bigdata.com"
2.[root@bigdata02 shell]# sh -x wc.sh
+ echo www.bigdata.com
www.bigdata.com
2.定义变量 与 引用
1.变量的命名规范:
1.命名只能使用英文字母、数字、和下划线、不能以数字开头
2.中间不能有空格、可以使用下划线
3.不能使用Linux里面的关键字
2.定义变量
key = value
注意:
1.=前后不能有空格
1.静态:
k = v k = “v” k = ‘v’
2.动态
k = v
引用:
$k
${k}
场景 :
zs
zszhenshuai
3.传递参数
版本内获取脚本外的参数 脚本内定一个参数 : 格式 $n
1.n表示数字
2. n = 1 作为脚本的第一个参数 n=2 作为脚本的第2个参数…
3.n = 0 获取脚本的名字
[root@bigdata02 shell]# ./parameter.sh "hello" "zs"
hello
zs
[root@bigdata02 shell]# cat parameter.sh
echo "文件名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "参数的个数:$#"
echo "传递的参数作为一个字符串:$*"
echo "此脚本运行时的pid:$$"
补充:
ps - ef | grep xxx => pid
kill -9 pid
4.数组
语法格式:
1.元素 是 空格 进行分割
2. arr =(value1 value2 value3 …)
[root@bigdata02 shell]#cat arr.sh
arr = (zs lisi ww zl wrm)
echo “所有数组元素:
a
r
r
[
∗
]
"
e
c
h
o
"
第
2
个
元
素
:
{arr[*]}" echo "第2个元素:
arr[∗]"echo"第2个元素:{arr[1]}”
echo “数组元素个数:${#arrr[*]}”
5.流程控制
分支、循环
1.if else 语法
语法结构:
if condition ;then
command
else
comman
fi
2.condition 条件判断
[ 表达式 ]
1.值判断
true false
=等于
==等于
<= >= > < !=
-eq 等于
-ne 不等于
-lt 小于
-gt 大于
-le 小于等于
-ge 大于等于
补充:
1. []前后要有空格
2.关系表达式 前后要有空格
Linux 获取上一个命令是否执行成功:
$?
成功 0 true
不成功 非0 false
2.权限判断
3.文件类型判断
[root@bigdata02 shell]# cat if.sh
a = “zs”
b= “zs”
if [ ${a} == ${b} ];then
echo “==”
else
echo “!=”
fi
课外作业:
1.远程连接工具 xshell
远程编辑连接共具
1.vscode
2.if elseif 语法
语法结构:
if condition;then
elif condition;g;then
command
else
command
fi
&& || 同样适用
[root@bigdata02 shell# cat ifelse.sh
#统计期末成绩 优良差
>= 90 优 >= 60 良 <60 差
score=$1
if [ ${score} -ge 90 ];then
echo “优”
elif [ ${score} -ge 60 ];then
echo"良"
else
echo “差”
fi
循环
for.while
1. for:
语法结构
for x in item1 item2 item3 … itemN
do
command1
done
[root@bigdata11 shell] # cat for.sh
for x in 1 2 3 4
do
echo ${x}
done
2. fori
打印 10 以内的数字
[root@bigdata11 shell]# cat fori.sh
#fori
#打印10以内的数字
for((i=0;i<10;i++))
do
echo "value is $ {i}"
done
3.while
语法结构:
while condition
do
todo...
done
案例: 打印10以内的数字
#while
#打印10以内的数字
while ((i<=10))
do
echo ${i}
let i++
done
[root@bigdata12 shell]# cat while.sh
场景:
有一个字符串"zhangsan,lisi,wangwu,zhaoliu"
如何分割字符串?
java 中 split (“,”) =》 arry =》 for
linux 把 , =》 空格 =》 arry
1.字符串的替换:
str//,/空格
=>zhangsan,lisi,zhaoliu
=>zhangsan lisi zhaoliu
#如何分割字符串?
str="zhangsan,lisi,wangwu,zhaoliu"
arr=(${str//,/ })
for var in ${arr[*]}
do
echo $var
done
[root@bigdata12 shell]# cat split.sh
2.IFS变量进行字符串分割【了解】
6.shell 里面常用的分析工具
1.awk 文本分析
1.获取列数据
[root@bigdata12 shell]# cat test.log
a b c
1 2 3
4 5 6
[root@bigdata12 shell] # cat tset.log | awk ‘{print $1}’
a
1
4
[root@bigdata12 shell] # cat tset.log | awk ‘{print $2}’
b
2
5
[root@bigdata12 shell] # cat test.log | awk ‘{print $1,$2}’
a b
1 2
4 5
[root@bigdata12 shell] # cat test.log | awk ‘NR1{print}’
a b c
[root@bigdata12 shell] #cat test.log | awk 'NR2{print}’
1 2 3
[root@bigdata12 shell]# cat test.log | awk ‘NR1,NR2{print}’
a b c
1 2 3
2.sed
文本替换
1.文本中 a 替换成 d 每一行遇到a 替换成d 【不常用】
sed -i ‘s/a/d/' test.log
2.全文替换
sed -i ‘s/a/d/g' test .log
补充:
[root@bigdata12 ~]# cat path.log
p1=/data/log
p2=/data/spark
需求:
p2 值路径 替换成 /root
sed -i ‘s//data/spark//root/g' path.log 错误的
转义: \
sed -i 's/\/data\/spark/\/root/g' path.log
[root@bigdata99 ~]# cat path.log
p1=/data/log
p2=/root
sed -i 's#/root#/data/spark#g' path.log
1.机器克隆
1.准备模板机
2.网络配置 => ip 静态ip
网卡:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=192.168.41.11
GATEWAY=192.168.41.2
DNS1=192.168.41.2
3.机器自带没用的东西 去除掉
1.jdk卸载掉:
rpm -qa | grep java
xxx
xx
x
卸载:
rpm -e xxx --nodeps
rpm -e xx --nodeps
rpm -e x --nodeps
2.hostname
vim /etc/hostname
bigdata11
3.内网ip 与hostname 映射
vim /etc/hosts
192.168.41.11 bigdata11
192.168.41.12 bigdata12
192.168.41.13 bigdata13
192.168.41.14 bigdata14
192.168.41.15 bigdata15
192.168.41.16 bigdata16
4.防火墙关闭:打开所有端口
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
2.vmware 虚拟网络
1.关闭虚拟机
2.虚拟网络:
编辑=》虚拟网络=》vm8=》
子网ip:192.168.41.0
子网掩码:255.255.255.0
nat设置:192.168.41.2
3.开机:
验证内网ip : ifconfig
192.168.41.11 bigdata11
4.远程登录
xshell :
ip
用户名
密码
port
2.克隆机器
注意:
创建完整克隆
1.修改克隆机器的内网ip
vim /etc/sysconfig/network-scripts/ifcfg-ens33
2.hostname
vim /etc/hostname
3.重启机器