zoukankan      html  css  js  c++  java
  • 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

    作者:落花桂
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Scrapy入门教程
    清华申请退学博士作品:完全用Linux工作
    Linux 计划任务 Crontab 笔记与总结(5)crontab 常见错误与案例
    《一个民企CEO的职场阳谋》–读书总结(下)
    《一个民企CEO的职场阳谋》–读书总结(上)
    《一个民企CEO的职场阳谋》–读书总结(上)
    CSDN开博一周年--总结、感想和未来规划
    《程序员,你伤不起》–读书笔记-序
    《程序员,你伤不起》–读书笔记-序
    3位同学简历中的14个问题
  • 原文地址:https://www.cnblogs.com/nthforsth/p/15046008.html
Copyright © 2011-2022 走看看