文章目录
shell 简介
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
语言入门仪式:Hello World
[root@hadoop614 ~]# mkdir shell
[root@hadoop614 ~]# cd shell/
[root@hadoop614 shell]# vi helloworld.sh
#!/bin/bash
echo Hello World
shell脚本的三种执行方法
1. 绝对路径执行
需要先给脚本一个执行权限
[root@hadoop614 shell]# ll
total 4
-rw-r--r-- 1 root root 31 Apr 12 02:13 helloworld.sh
[root@hadoop614 shell]# /root/shell/helloworld.sh
-bash: /root/shell/helloworld.sh: Permission denied # 没有权限
[root@hadoop614 shell]# chmod +x helloworld.sh
[root@hadoop614 shell]# ll
total 4
-rwxr-xr-x 1 root root 31 Apr 12 02:13 helloworld.sh
[root@hadoop614 shell]# /root/shell/helloworld.sh
Hello World
2.相对路径执行
需要先给脚本一个执行权限
[root@hadoop614 shell]# ll
total 4
-rwxr-xr-x 1 root root 31 Apr 12 02:13 helloworld.sh
[root@hadoop614 shell]# ./helloworld.sh
Hello World
3. sh 命令方式执行
脚本文件有没有执行权限都可以执行
sh 命令后可以跟相对路径,也可以是绝对路径
[root@hadoop614 shell]# chmod -x helloworld.sh
[root@hadoop614 shell]# ll
total 4
-rw-r--r-- 1 root root 31 Apr 12 02:13 helloworld.sh
[root@hadoop614 shell]# sh helloworld.sh
Hello World
[root@hadoop614 shell]# sh /root/shell/helloworld.sh
Hello World
1. 在Linux系统中,文件只有文本格式,因此在写shell脚本时,约定俗成的一个规定是以
.sh
为脚本文件的后缀名
2. 在shell脚本中的第一行指定脚本的shell解释器
但是如果脚本是以sh xxxx 方式执行的话,可以不赋予执行权限,脚本第一行也可以不指定解释器
变量的定义
[root@hadoop614 shell]# vi variable.sh
#! /bin/bash
DOMAIN=www.itoceanblog.com
DATE=`date`
echo ${DOMAIN}
echo ${DATE}
[root@hadoop614 shell]# sh variable.sh
www.itoceanblog.com
Fri Apr 12 02:30:54 CST 2019
简单介绍下
变量分为静态变量:DOMAIN=www.itoceanblog.com
动态变量:DATE=`date`
变量赋值时=
号两边不能有空格
约定变量名为大写
给脚本传递参数
[root@hadoop614 shell]# vi parameter.sh
#! /bin/bash
echo $0 # 脚本本身的名字
echo $1 # 第一个参数
echo $2 # 第二个参数 # 参数间以空格区分
echo "参数个数:$#" # 获取参数个数
echo "所有参数作为一个长字符串:$*" # 讲所有参数作为一个长字符串
echo "执行脚本时的PID:$$" #执行脚本时的PID
[root@hadoop614 shell]# sh parameter.sh
parameter.sh
参数个数:0
所有参数作为一个长字符串:
执行脚本时的PID:18705
[root@hadoop614 shell]# sh parameter.sh hello world
parameter.sh
hello
world
参数个数:2
所有参数作为一个长字符串:hello world
执行脚本时的PID:18706
数组
shell的数组只支持一维数组
[root@hadoop614 shell]# vi array.sh
#! /bin/bash
arr=(ruoze jepson xingxing dashu xiaoshiqi xiaohai)
echo ${arr[@]} # 数组内的每一个元素
echo ${arr[*]} # 数组内的所有元素看作是一个字符串
echo ${arr[4]} # 获取数组内下标是4的元素,下标从0开始
echo ${#arr[@]} # 获取数组内元素的个数
[root@hadoop614 shell]# sh array.sh
ruoze jepson xingxing dashu xiaoshiqi xiaohai
ruoze jepson xingxing dashu xiaoshiqi xiaohai
xiaoshiqi
6
if判断
[root@hadoop614 shell]# vi if.sh
#! /bin/bash
A=abc # 定义一个变量A
B=bcd # 定义一个变量B
if [ $A == $B ];then # 在 [ 两边和 == 两边必须有空格,] 左边必须有空格,右边接;then
echo ==
else
echo !=
fi # 结束 if 判断体
[root@hadoop614 shell]# sh if.sh
!=
循环
for循环
[root@hadoop614 shell]# vi for.sh
#! /bin/bash
J=1
for i in 1 2 3 4 5
do
echo "i=$i"
let J++
done
echo J=$J
[root@hadoop614 shell]# sh for.sh
i=1
i=2
i=3
i=4
i=5
J=6
[root@hadoop614 shell]# vi for.sh
#! /bin/bash
J=1
for i in 1 2 3 4 5
do
echo "i=$i"
let J++
done
echo J=$J
echo "=================================="
for ((i=0;i<100;i++))
do
echo $i
done
[root@hadoop614 shell]# sh for.sh
i=1
i=2
i=3
i=4
i=5
J=6
==================================
0
1
2
...
99
while循环
[root@hadoop614 shell]# vi while.sh
#! /bin/bash
a=0
b=0
while((a<10))
do
echo "a:$a"
let a++
let b++
done
echo "b:$b"
[root@hadoop614 shell]# sh while.sh
a:0
a:1
a:2
a:3
a:4
a:5
a:6
a:7
a:8
a:9
b:10
分割
[root@hadoop614 shell]# vi split.sh
#!/bin/bash
S="ruoze,jepson,xingxing,dashu,xiaoshiqi,xiaohai"
OLD_IFS="$IFS" #
IFS="," # 指定分割字符
arr=($S) # 指定要分割的数组
IFS="OLD_IFS" # 这四行代码是固定格式
for x in ${arr[*]}
do
echo $x
done
[root@hadoop614 shell]# sh split.sh
ruoze
jepson
xingxing
dashu
xiaoshiqi
xiaohai
awk
awk作为Linux三剑客之一,我称他为万能的awk,因为它拥有强大的文本格式化的能力,这里只做简单的用法介绍。
[root@hadoop614 shell]# cat awk.log # 准备一个日志文件,以,分割
a,b,c
1,2,3
4,5,6
[root@hadoop614 shell]# cat awk2.log # 以空格分割
a b c
1 2 3
4 5 6
[root@hadoop614 shell]# cat awk2.log | awk '{print $1}' # 默认以空格分割 $1 就是获取第一列
a
1
4
[root@hadoop614 shell]# cat awk2.log | awk '{print $2}'
b
2
5
[root@hadoop614 shell]# cat awk2.log | awk '{print $3}'
c
3
6
[root@hadoop614 shell]# cat awk2.log | awk '{print $0}' # $0 获取所有列
a b c
1 2 3
4 5 6
[root@hadoop614 shell]# cat awk.log | awk -F "," '{print $1}' # -F指定分隔符
a
1
4
[root@hadoop614 shell]# cat awk.log | awk 'NR==1' # NR -> number row,回去第几行
a,b,c
[root@hadoop614 shell]# cat awk.log | awk 'NR==2'
1,2,3
[root@hadoop614 shell]# cat awk.log | awk 'NR==3'
4,5,6
[root@hadoop614 shell]# cat awk.log |awk -F "," 'NR>1{ print $3 }' # 获取第三列,行数大于1的数据
3
6
sed
Linux三剑客之二
[root@hadoop614 shell]# cat sed.log # 准备了一份数据
a a b c
1 2 3
4 5 6
[root@hadoop614 shell]# sed -i 's/a/aa/' sed.log && cat sed.log # 将sed.log 中找到的第一个a替换成aa
aa a b c
1 2 3
4 5 6
[root@hadoop614 shell]# sed -i "s?a?bbb?" sed.log && cat sed.log # 将sed.log 中找到的第一个a替换成bbb
bbba a b c
1 2 3
4 5 6
[root@hadoop614 shell]# sed -i "s/b/w/g" sed.log && cat sed.log # 将sed.log 中找到的所有b替换成w
wwwa a w c
1 2 3
4 5 6
[root@hadoop614 shell]# sed -i "s/^/uuu&/g" sed.log && cat sed.log # 在所有行开头加uuu
uuuwwwa a w c
uuu1 2 3
uuu4 5 6
[root@hadoop614 shell]# sed -i "s/$/&uuu/g" sed.log && cat sed.log # 在所有行结尾加uuu
uuuwwwa a w cuuu
uuu1 2 3uuu
uuu4 5 6uuu