• 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

    作者:落花桂
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    python,生产环境安装
    neo4j 图数据库
    RNN系列
    机器学习关于AUC的理解整理
    fensorflow 安装报错 DEPENDENCY ERROR
    dubbo Failed to check the status of the service com.user.service.UserService. No provider available for the service
    使用hbase遇到的问题
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk
    gradle 安装
    jenkins 安装遇到的坑
  • 原文地址:https://www.cnblogs.com/nthforsth/p/15046008.html
Copyright © 2020-2023  润新知