Shell

1.什么是Shell

 1.普通的文件
 2.Linux命令组成
 3.编程语言(可以被执行)

2.语法

2.1 入门

1.文件命名:结尾一般都是以.sh结尾
2.文件内容:第一行#!/bin/bash(解析器)(可加可不加)

1.编写脚本

mkdir Shell
cd Shell
vim wc.sh
(编写以下代码)(wordcount 词频统计)

#!/bin/bash
echo "www.bigdata.com"
2.运行shell脚本

1.sh xxx.sh(sh命令)
sh ./wc.sh
(不管有没有权限都可以运行)
www.bigdata.com

2.给脚本赋予执行权限

ll
chmod 744 ./wc.sh
ll(发现wc.sh变绿了)
./wc.sh
/root/Shell/wc.sh

3.补充:debug的方式:

1.vim wc.sh(加 -x)
#!/bin/bash -x
echo “ww.baigdata.com”
./wc.sh

+ echo www.bigdata.com(有加号就代表使用debug运行方式)
www.bigdata.com

2.sh -x wc.sh(sh -x xxx.sh查看执行可看到哪行有错,就是debug模式)

 + echo www.bigdata.com
 www.bigdata.com

2.2 定义变量与引用

1.变量的命名规范

1.命名只能使用英文字母、数字、和下划线、不能以数字开头
2.中间不能有空格、可以使用下划线
3.不能使用linux里面的关键字

2.定义变量

key=value(key是变量,value是值)
注意:
1.=前后不能有空格
2.chmod u+x ./variable.sh(给当前用户加一个执行权限)**

1.静态:k=v k=“v” k=‘v’
2.动态:k=v

引用:

$变量名:变量的引用
$k
${k}(这个后面可拼接字符:${k}zhensuai)
echo "$k"
echo "${k}"
echo "${k}zhenshuai"

2.3 传递参数

脚本内获取脚本外的参数,脚本内定一个参数:格式:$n
1.n表示数字
2.n=1 作为脚本的第一个参数 n=2作为脚本的第2个参数…
3.n=0 获取脚本的名字

[root@bigdata10 Shell]# vim parameter.sh
[root@bigdata10 Shell]# chmod u+x ./parameter.sh
[root@bigdata10 Shell]# vim parameter.sh(编写以下代码)
在这里插入图片描述

[root@bigdata10 Shell]# ./parameter.sh “hello” “zhangsan”(传进去两个参数,传参数时,如果一个参数里有空格最好用{}括起来)
zhangsan
stu
20nianqing
Wed Nov 2 10:34:43 CST 2022
文件名:./parameter.sh
第一个参数:hello
第二个参数:zhangsan
参数的个数:2
传递的参数作为一个字符串:hello zhangsan
此脚本运行时的pid:3341

补充:
把进程的pid > /xx.pid(放到xx.pid文件里)查看进程是否运行
杀死进程的方法:ps -ef | grep xxx => pid,kill -9 pid
怕进程名字相同导致误杀,给进程设置脚本查看进程:echo “pid:$$”

vim格式下:使用./xx可以搜索xx

2.4 数组

语法格式:arr=(value1 value2 value3 …)(元素通过空格进行分割)
[root@bigdata10 shell]# vim arr.sh(编写以下代码)
arr=(zs lisi ww zl wrm)
echo “所有数组元素:${arr[]}"
(${arr[@S]}也可)
echo “第2个元素:${arr[1]}”
echo "数组元素个数:${#arr[]}”
(数组里面的所有元素的个数)
[root@bigdata10 Shell]# chmod u+x ./arr.sh
[root@bigdata10 Shell]# ./arr.sh
所有数组元素:zs lisi ww zl wem
第2个元素:lisi
数组元素个数:5

2.5 流程控制:分支、循环

1.if else 语法
语法结构:
if condition;then
command
else
command
fi
(关闭)

2.condition 条件判断:[ 表达式 ]
1.值判断:true false

符号:= 等于,==等于,!=不等于,<=小于等于,>=大于等于,>大于,<小于
英文:-eq 等于,-ne 不等于,-lt 小于,-gt 大于,-le 小于等于,-ge 大于等于

[root@bigdata10 Shell]# vim if.sh(编写以下代码)
a=“zs”
b=“zs”
if [ ${a} == ${b} ];then
echo “==”
else
echo “!=”
fi

[root@bigdata10 Shell]# chmod u+x ./if.sh(给权限)
[root@bigdata10 Shell]# ./if.sh

==

2.权限判断:
读写执行 -r -w -x

3.文件类型判断
判断是否是文件(夹):-d文件夹,-f文件
判断文件(夹)是否存在:-e

补充:
 1.[]前后要有空格
 2.关系表达式前后要有空格

linux 获取上一个命令是否执行成功:$? 成功:0–true,不成功:非0 --alse

3.if elseif 语法
语法结构:
if condition;then
command
elif condition;then
command
else
command
fi

补充: && ||

[root@bigdata10 Shell]# vim ifelse.sh(编写以下代码)
#统计期末成绩,优良差
#>=90优, >=60良,<60差
score=$1
if [ ${score} -ge 90 ];then
echo “优”
elif [ ${score} -ge 60 ];then
echo “良”
else
echo “差”
fi

[root@bigdata10 Shell]# chmod u+x ./ifelse.sh
[root@bigdata10 Shell]# ./ifelse.sh 99

4.for循环
语法结构
for x in item1 item2 item3 … itemN(循环x变量在item1 item2 …itemN中)
do
command1

done

[root@bigdata10 Shell]# vim for.sh(编写以下代码)
for x in 1 2 3 4
do
echo ${x}
done

[root@bigdata10 Shell]# chmod u+x ./for.sh
[root@bigdata10 Shell]# ./for.sh

1
2
3
4

5. fori循环
打印 10以内的数字
[root@bigdata10 Shell]# vim fori.sh(编写以下代码)
for((i=0;i<10;i++))
do
echo “value is ${i}”
done

[root@bigdata10 Shell]# chmod u+x ./fori.sh
[root@bigdata10 Shell]# ./fori.sh

value is 0
value is 1
value is 2
value is 3
value is 4
value is 5
value is 6
value is 7
value is 8
value is 9

6.while循环
语法结构:
while condition
do
todo…
done

[root@bigdata99 shell]# vim while.sh(编写以下代码)
# 打印 10以内的数字
i=1
while ((i<=10))
do
echo ${i}
let i++
done

[root@bigdata10 Shell]# chmod u+x ./while.sh
[root@bigdata10 Shell]# ./while.sh

1
2
3
4
5
6
7
8
9
10

场景:
有一个字符串"zhangsan,lisi,zhaoliu"
如何分割字符串?
java split(“,”) → array →for
linux 把,替换为 空格 变成数组array
1.字符串替换:
str//,/(变量名两个符号 ,符号 空格:表示为把,替换成空格)
=>zhangsan,lisi,zhaoliu
=>zhangsan lisi zhaoliu
[root@bigdata10 Shell]# cat split.sh
str=“zhangsan,lisi,zhaoliu”
arr=(${str//,/ }) (需要花括号括起来)
for var in ${arr[*]}
do
echo $var
done

2.IFS变量进行字符串分割【了解】
自定义IFS变量,改变分隔符,对字符串进行切分
Shell 脚本中有个变量叫IFS,内部域分隔符

查看变量 IFS 的值。
$ echo $IFS
$ echo “$IFS” | od -b
0000000 040 011 012 012
0000004
直接输出IFS是看不到的,把它转化为二进制就可以看到了,"040"是空格,“011"是Tab,“012"是换行符”\n” 。最后一个 012 是因为 echo 默认是会换行的。

示例
#!/bin/bash
string=“hello,shell,split,test”
#对IFS变量 进行替换处理
OLD_IFS=“ I F S " I F S = " , " a r r a y = ( IFS" IFS="," array=( IFS"IFS=","array=(string)
IFS=”$OLD_IFS"
for var in ${array[@]}
do
echo $var
done

shell里面常用的分析工具
1.awk:文本分析工具
 1.获取文本的列数据:(竖着为列)
  cat test.log | awk ‘{print $1}’(第一列)
  cat test.log | awk ‘{print $1,$2}’(第一列和第二列)
 2.获取文本的行数据:(横着着为行)
  cat test.log | awk ‘NR==1{print}’(第一行)
  cat test.log | awk ‘NR>1{print}’(除了第一行其他的)
2.sed:文本替换:
sed [OPTION]… {script-only-if-no-other-script} [input-file]…
只替换每一行第一次遇见的(不常用):sed -i ‘s/d/a/’ test.log
在这里插入图片描述全文替换:sed -i ‘s/a/d/g’ test.log
在这里插入图片描述补充:
[root@bigdata99 ~]# 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值