shell入门

基础入门
在大数据工作环境中,包括所有的组件中,一般我们说的shell脚本,后缀都是 .sh或没有后缀

1、创建一个shell脚本(标准写法)

[root@ruozedata001 learn_shell]# vi wc.sh
#!/bin/bash     使用bash的命令的解释器进行解析
echo "www.ruozedata.com"

2、执行

[root@ruozedata001 learn_shell]# ./wc.sh
-bash: ./wc.sh: Permission denied

权限错误,赋予一个+x的权限

[root@ruozedata001 learn_shell]# chmod +x wc.sh
[root@ruozedata001 learn_shell]# ll
total 4
-rwxr-xr-x 1 root root 39 Aug 25 22:46 wc.sh

只想对自己的用户赋予x权限

[root@ruozedata001 learn_shell]# chmod u+x wc.sh
[root@ruozedata001 learn_shell]# ll
total 4
-rwxr-xr-x 1 root root 39 Aug 25 22:46 wc.sh

1)全路径执行

[root@ruozedata001 learn_shell]# pwd
/root/learn_shell
[root@ruozedata001 learn_shell]# /root/learn_shell/wc.sh
www.ruozedata.com

2)相对路径执行

[root@ruozedata001 learn_shell]# ./wc.sh
www.ruozedata.com

3、shell脚本的不标准写法

[root@ruozedata001 learn_shell]# vi wc.sh
echo "www.ruozedata.com"
[root@ruozedata001 learn_shell]# which sh
/usr/bin/sh
[root@ruozedata001 learn_shell]# echo $PATH
/usr/java/jdk1.8.0_45/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@ruozedata001 learn_shell]# sh wc.sh
www.ruozedata.com

此时不论是绝对路径还是相对路径执行,都没有关系

4、shell脚本的debug

[root@ruozedata001 learn_shell]# sh -x wc.sh
+ echo www.ruozedata.com
www.ruozedata.com

这里有+ 的表示执行的命令行
无+ 的表示命令执行的结果

[root@ruozedata001 learn_shell]# vi wc.sh
echo "www.ruozedata.com"
echo "abcd"
[root@ruozedata001 learn_shell]# sh -x wc.sh
+ echo www.ruozedata.com
www.ruozedata.com
+ echo abcd
abcd

作用:
当执行一个超复杂的shell时,有可能出现这种情况:在本地写好,一切都很完美,扔到服务器之后发现跑不起来,有了-x之后,可以一行行去看输出的结果

5、标准写法的debug

[root@ruozedata001 learn_shell]# vi wc.sh
#!/bin/bash -x

echo "www.ruozedata.com"
echo "abcd"
[root@ruozedata001 learn_shell]# ./wc.sh
 + echo www.ruozedata.com
www.ruozedata.com
 + echo abcd
abcd

变量的定义与引用(结构:k=v)

  • 静态:
    k=“v” ‘v’ v 尽量用 “v”
  • 动态
    k=v
[root@ruozedata001 learn_shell]# vi variable.sh
#!/bin/bash

rz="ruozedata" 
date1='date'
date2=`date`     反斜杠:指data命令的动态结果

echo $rz
echo ${date1}
echo ${date2}

[root@ruozedata001 learn_shell]# chmod u+x variable.sh
[root@ruozedata001 learn_shell]# ./variable.sh
ruozedata
date
Sun Aug 25 23:05:15 CST 2019

坑:

  • 等号= 前后不能有空格
  • 变量名称一般来说都是大写
  • 使用变量要习惯使用{ }
[root@ruozedata001 learn_shell]# vi variable.sh
#!/bin/bash

rz="ruozedata"
date1="date"
date2=`date`

P='ruozedata'

echo $rz
echo ${date1}
echo ${date2}

echo $PA
echo ${P}A

[root@ruozedata001 learn_shell]# ./variable.sh
ruozedata
date
Sun Aug 25 23:10:39 CST 2019

ruozedataA

此时P未加{ }时,PA是看做一个整体,是找不到的,故打印为空

传递参数

[root@ruozedata001 learn_shell]# vi parameter.sh
#!/bin/bash

echo $1     第一个变量
echo $2     第二个变量
echo "$#"   传递个数
echo "$*"   打印传递的参数的列表,作一个字符串去显示
echo "PID: $$"   shell脚本执行的那一刹那,pid是2194

[root@ruozedata001 learn_shell]# chmod u+x parameter.sh
[root@ruozedata001 learn_shell]# ./parameter.sh


0

PID: 2193

[root@ruozedata001 learn_shell]# ./parameter.sh a b
a
b
2
a b
PID: 2194

# 将a b作为一个整体
[root@ruozedata001 learn_shell]# ./parameter.sh "a b"   
a b

1
a b
PID: 2195

数组

[root@ruozedata001 learn_shell]# vi array.sh

#!/bin/bash -x

arr=(rz jepson xingxing huhu)
echo ${arr[@]}
echo ${arr[3]}
echo ${#arr[@]}

[root@ruozedata001 learn_shell]# chmod u+x array.sh
[root@ruozedata001 learn_shell]# ./array.sh
+ arr=(rz jepson xingxing huhu)
+ echo rz jepson xingxing huhu
rz jepson xingxing huhu
+ echo huhu
huhu
+ echo 4
4
[root@ruozedata001 learn_shell]# ./array.sh
rz jepson xingxing huhu
huhu
4

if语句

[root@ruozedata001 learn_shell]# vi if.sh
#!/bin/bash

a="abc"
b="chaofan"

if [ $a == $b ];then
   echo "=="
else
   echo "!="
fi
[root@ruozedata001 learn_shell]# chmod u+x if.sh
[root@ruozedata001 learn_shell]# ./if.sh
!=

小结:

  • 中括号前后[ ]前后与空格
  • == 前后空格
[root@ruozedata001 learn_shell]# vi if.sh

#!/bin/bash

a="abc"
b="chaofan"

if [ "${a}" == "${b}" ];then
   echo "=="
else
   echo "!="
fi

[root@ruozedata001 learn_shell]# ./if.sh
!=

多层判断

[root@ruozedata001 learn_shell]# vi if.sh
#!/bin/bash

a="abc"
b="chaofan"

if [ "${a}" == "${b}" ];then
        echo "=="
elif [ "${a}" == "abc" ];then
        echo "=="
else
        echo "!="
fi
[root@ruozedata001 learn_shell]# ./if.sh
==

forwhile

[root@ruozedata001 learn_shell]# vi forwhile.sh
#!/bin/bash 

for x in 1 2 3 4 5
do
	echo $x
done
[root@ruozedata001 learn_shell]# chmod u+x forwhile.sh
[root@ruozedata001 learn_shell]# ./forwhile.sh
1
2
3
4
5

[root@ruozedata001 learn_shell]# vi forwhile.sh
#!/bin/bash

for x in 1 2 3 4 5
do
        echo $x
done 

echo "------------"

for ((i=1;i<10;i++))
do
        echo $i
done
[root@ruozedata001 learn_shell]# ./forwhile.sh
1
2
3
4
5
------------
1
2
3
4
5
6
7
8
9


[root@ruozedata001 learn_shell]# vi forwhile.sh  
#!/bin/bash 

for x in 1 2 3 4 5
do
	echo $x
done

echo "------------------"

for ((i=1;i<10;i++))
do
	echo $i
done

echo "------------------"

j=1
while(($j<10))
do
	echo $j
	let "j++"
done

 [root@ruozedata001 learn_shell]# ./forwhile.sh
1
2
3
4
5
------------
1
2
3
4
5
6
7
8
9
------------------
1
2
3
4
5
6
7
8
9

分割

[root@ruozedata001 learn_shell]# vi spilt.sh
#!/bin/bash

s="rz,j,xx,huhu,yt,co"

OLD_IFS="$IFS"
IFS=","
arr=($s)
IFS="$OLD_IFS"

for x in ${arr[*]}
do

	echo $x
done
[root@ruozedata001 learn_shell]# chmod u+x spilt.sh
[root@ruozedata001 learn_shell]# ./spilt.sh
rz
j
xx
huhu
yt
co

awk

[root@ruozedata001 learn_shell]# vi test.log
a b c
1 2 3
# 打印第一列
[root@ruozedata001 learn_shell]# cat test.log | awk '{print $1}'
a
1
# 打印第一列和第二列
[root@ruozedata001 learn_shell]# cat test.log | awk '{print $1,$2}'
a b
1 2
# 打印没有空格的第一列和第二列
[root@ruozedata001 learn_shell]# cat test.log | awk '{print $1$2}'
ab
12
# 打印第一行
[root@ruozedata001 learn_shell]# cat test.log | awk 'NR==1{print}'
a b c
# 打印第一行的第一列
[root@ruozedata001 learn_shell]# cat test.log | awk 'NR==1{print $1}'
a
# 打印第一行以外的
[root@ruozedata001 learn_shell]# cat test.log | awk 'NR>1{print}'
1 2 3

[root@ruozedata001 learn_shell]# vi test.log
a,b,c
1,2,3
[root@ruozedata001 learn_shell]# cat test.log | awk -F "," '{print $1}'
a
1

sed 替换
1、a替换为aa

[root@ruozedata001 learn_shell]# cat test.log
a,b,c
1,2,3
[root@ruozedata001 learn_shell]# sed -i 's/a/aa/' test.log
[root@ruozedata001 learn_shell]# cat test.log
aa,b,c
1,2,3

2、aa替换为aa’

[root@ruozedata001 learn_shell]# sed -i 's/aa/aa'/' test.log
> ^C
[root@ruozedata001 learn_shell]# sed -i "s/aa/aa'/" test.log
[root@ruozedata001 learn_shell]# cat test.log
aa',b,c
1,2,3

3、aa替换为bbb

[root@ruozedata001 learn_shell]# sed -i "s/aa/bbb/" test.log
[root@ruozedata001 learn_shell]# cat test.log
bbb',b,c
1,2,3

4、全局替换——b都替换成j

[root@ruozedata001 learn_shell]# sed -i "s/b/j/g" test.log
[root@ruozedata001 learn_shell]# cat test.log
jjj',j,c
1,2,3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值