Shell学习笔记
目录
一、Shell中常见的一些语法
1、 $0、$1、$2
- $0 就是你写的shell脚本本身的名字
- $1 是你给你写的shell脚本传的第一个参数
- $2 是你给你写的shell脚本传的第二个参数
比如你新建了一个shell脚本 Test.sh, 内容如下:
#!/bin/sh
echo "shell脚本本身的名字: $0"
echo "传给shell的第一个参数: $1"
echo "传给shell的第二个参数: $2"
保存退出后,你在Test.sh所在的目录下输入 bash Test.sh 1 2
结果为:
shell脚本本身的名字: Test.sh
传给shell的第一个参数: 1
传给shell的第二个参数: 2
2、if语句的语法
- if-else的基本用法:
if条件+then操作+else操作+fi闭合
- if单条件多分支:
- if [ $? -eq 0 ]; then
shell脚本中$?是指上一次命令执行的成功或者失败的状态。如果成功就是0,失败为1.。语句if [ $? -eq 0 ] 是判断if语句的上一个命令执行如果成功就执行if中的语句,否则就执行else中的内容。
使用时要注意,if后面的中括号[ $? -eq 0 ],括号的两边需要有一个空格。
#判断hdfs上的path路径是否存在
#hadoop fs -test -e 判断路径,存在返回0
hadoop fs -test -e path
if [ $? -eq 0 ]; then
echo "====此路径存在!===="
else
echo "====此路径不存在!===="
exit 1
fi
$0: shell或shell脚本的名字
$*:以一对双引号给出参数列表
$@:将各个参数分别加双引号返回
$#:参数的个数
$_:代表上一个命令的最后一个参数
$$:代表所在命令的PID
$!:代表最后执行的后台命令的PID
$?:代表上一个命令执行后的退出状态
-eq 等于,如:if ["$a" -eq "$b" ]
-ne 不等于,如:if ["$a" -ne "$b" ]
-gt 大于,如:if ["$a" -gt "$b" ]
-ge 大于等于,如:if ["$a" -ge "$b" ]
-lt 小于,如:if ["$a" -lt "$b" ]
-le 小于等于,如:if ["$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
3、for循环的语法
for循环执行流程:定义一个变量和取值,取值可以是一个或多个值,也可以从文件中进行取值,对每一个不同的取值执行相同的命令序列,直到变量值用完退出循环。
- 语法:
for 变量名 in 变量取值列表
do
命令序列
done
- 例1:取单一值
#!/bin/bash
#date:2020-3-1
#描述:for单一取值
for a in hello
do
echo $a
done
#################
#执行效果:
#[root@linus ~]# sh for_test1.sh
#hello
#################
- 例2:取多个值循环
#!/bin/bash
#date:2020-3-1
#描述:for多值循环
for a in one two three
do
echo "这是$a"
done
#################
#执行效果:
#[root@linus ~]# sh for_test2.sh
#这是one
#这是two
#这是three
#################
- 例3:从变量中取值
#!/bin/bash
#date:2020-3-1
#描述:for从变量取值
list="1 2 3"
for b in $list
do
echo "我是$b"
done
#################
#执行效果:
#[root@linus ~]# sh for_test3.sh
#我是1
#我是2
#我是3
#################
4、shell 中| () {} 的用法
- | 运算符
管道符号,是unix一个很强大的功能,符号为一条竖线:"|"。用法:
command 1 | command 2
他的功能是把第一个命令command 1执行的结果作为command2的输入传给command 2
- () 运算符:
如果希望把几个命令合在一起执行,shell提供了两种方法。既可以在当前shell也可以在子shell中执行一组命令。
(command1;command2;command3....) 多个命令之间用;分隔
1)一条命令需要独占一个物理行,如果需要将多条命令放在同一行,命令之间使用命令分隔符(;)分隔。执行的效果等同于多个独立的命令单独执行的效果。
2)() 表示在当前 shell 中将多个命令作为一个整体执行。需要注意的是,使用 () 括起来的命令在执行前面都不会切换当前工作目录,也就是说命令组合都是在当前工作目录下被执行的,尽管命令中有切换目录的命令。
3)命令组合常和命令执行控制结合起来使用。
4)在下示例中,如果目录dir不存在,则执行命令组合。
- {} 运算符:
如果使用{}来代替(),那么相应的命令将在子shell而不是当前shell中作为一个整体被执行,只有在{}中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子shell中执行,否则在当前shell执行。它的一般形式为:
{ command1;command2;command3… } 注意:在使用{}时,{}与命令之间必须使用一个空格
在下示例中,使用{}则在子shell中执行了打印操作
5、shell 里 awk print 的用法详解
-
首先, 你需要先了解awk 的工作原理:
1)AWK读取输入文件一次一行。
2)对于每一行,它匹配在给定的顺序模式,如果匹配,执行相应的动作。
3)如果没有模式匹配,将执行任何行动。
4)在上面的语法,无论是搜索模式,或行动是可选的,但不能同时。
5)如果没有给出搜索模式,然后awk要执行每一行输入给定的行动。
6)如果没有给出动作,打印,这是默认的操作与模式相匹配的所有行。
7)空出的任何行动括号什么都不做。它不会执行默认的打印操作。
8)中的每个行动的声明应该用分号分隔。让我们创建employee.txt文件,其中有 -
数据
$cat employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
- 案例一:默认情况下的awk打印文件的每一行。
1234567
$ awk '{print;}' employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
- 案例二:打印与模式匹配的行。
> /Nisha/' employee.txt
100 Thomas Manager Sales $5,000
400 Nisha Manager Marketing $9,500
- 案例三:只打印特定的字段。
awk有内置的变量。对于每一个记录,即行,分隔空白字符分隔记录默认情况下,它存储在$ n个变量。如果该行有4个词,它会被存储在$1,$2,$3和$4。 $0表示整行。 NF是一个内置变量,它代表这一行有多少个被分隔的域.
12345678910111213$ awk '{print $2,$5;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000
6、Shell中的${}、##和%%使用范例
- 假设定义了一个变量为:
file=/dir1/dir2/dir3/my.file.txt
- 可以用${ }分别替换得到不同的值:
${file#/} : 删掉第一个 / 及其左边的字符串dir1/dir2/dir3/my.file.txt
${file##/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#.}: 删掉第一个 . 及其左边的字符串:file.txt
${file##.}:删掉最后一个 . 及其左边的字符串:txt
${file%/}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/}:删掉第一个 / 及其右边的字符串:(空值)
${file%.}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.}:删掉第一个 . 及其右边的字串:/dir1/dir2/dir3/my
记忆的方法为:
#是去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
7、shell中的=~的简单用法
- 其中 ~ 其实是对后面的正则表达式表示匹配的意思,如果匹配就输出1, 不匹配就输出0
[[ $test =~ ^[0-9]+ ]] && echo 1 || echo 0
二、HDFS 常用 Shell 命令
作者:落花桂
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。