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 命令

转载于:https://www.imooc.com/article/308449

作者:落花桂
         
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/nthforsth/p/15046008.html