zoukankan      html  css  js  c++  java
  • Shell入门

    应用程序通过Shell操作Linux内核
    Shell编程语言,命令行解析器中

    Centos提供六种Shell解析器,常用的是:sh,bash,默认的解析器是bash

    echo:显示文字,输入、输出
    Shell脚本
    脚本格式以:#!/bin/bash开头(指定解析器)
    执行脚本:sh或bash hellworld.sh;
    使不依赖sh或bash,配置执行权限 chmod 777 hellworld.sh

    Shell脚本:多命令处理
    touch banzhang.sh

    !#/bin/bash
    cd /home/
    touch aa.txt
    echo "HelloWorld" >> aa.txt

    bash banzhang.sh

    Shell变量 (变量都是字符串类型,不能直接进行数值运算)
    系统变量 (写脚本时方便的获取)
    echo $HOME
    echo $PWD
    echo $SHELL
    echo $USER
    自定义变量
    定义变量:变量=值 A=1 A="wang zhang liu" echo $A
    撤销变量:unset A
    静态变量:readonly B=2
    把变量提升为全局变量:export A (日后应用场景:$Hadoop_HOME/$kafka_HOME/$Spack_HOME)
    特殊变量
    $n: echo "$0 $1 $2" (0是脚本本身,1 2是参数)
    $#: echo $# (获取脚本传参的个数,一般用循环)
    $*、$@ (变量代表命令行所有参数)
    $? (最后一次执行的命令的返回状态,命令正确执行变量为0,否则命令执行不正确)

    运算符
    $[运算式] A=$[(2+2)*4]
    expr +,-,*,/,% (加,减,乘,除,取于) 注:expr运算符间要有空格

    条件判断
    [ condition ] 注:condition前后要有空格,条件非空就是true,是空就是false
    字符串比较: -lt小于 -le小于等于
    -eq等于 -ne不等于
    -gt大于 -ge大于等于
    文件权限判断:
    -r有读权限 -w有写权限
    -x有执行权限
    文件类型判断:
    -f文件存在并是一个常规的文件
    -e文件存在
    -d文件存在并是一个目录

    流程控制
    if判断
    语法:
    if [ $1 -eq "1" ];then
    echo "banzhang zhenshuai"
    elif [ $1 -eq "2" ]
    then
    echo "cls zhen mei"
    fi
    注意事项:中括号和条件判断式之间必须有空格
    if后要有空格

    case语法
    case $1 in
    "1")
    echo "banzhang"
    ;;
    "2")
    echo "cls"
    ;;
    *)
    echo "shuaige"
    ;;
    esac
    2)双分号“;;”表示命令序列结束,相当于java中的break。
    3)最后的“*)”表示默认模式,相当于java中的default。

    for循环
    语法1
    for((初始值;循环控制条件;变量变化))
    do
    程序
    done
    案例实操
    s=0
    for((i=0;i<=100;i++))
    do
    s=$[$s+$i]
    done
    echo $s
    语法2
    for 变量 in 值1 值2 值3
    do
    程序
    done
    案例实操
    for i in $*
    do
    echo "banzhang love $i"
    done
    for i in "$*"
    do
    echo "banzhang love $i"
    done
    比较$*和$@区别:
    当它们被双引号“”包含时,
    “$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;
    “$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数。

    while循环
    while[ 条件判断式 ]
    do
    程序
    done


    read读取控制台输入
    语法
    read(选项)(参数)
    选项
    -p:指定读取值时的提示符
    -t:指定读取值等待的事件(秒)
    参数
    变量:指定读取值的变量名
    案例实操
    read -t 7 -p "Enter your name in 7 seconds" NAME
    echo $NAME

    函数
    系统函数语法
    basename[string/pathname][suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
    选项:
    如果suffix被指定了,basename会将pathname或string中的suffix去掉。
    案例实操
    截取该/home/atguigu/banzhang.txt路径的文件名称
    basename /home/atguigu/banzhang.txt
    basename /home/atguigu/banzhang.txt .txt


    dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
    案例实操
    截取该/home/atguigu/banzhang.txt文件名称的整个路径
    dirname /home/atguigu/banzhang.txt
    自定义函数语法
    [function] funname[()]
    {
    Action;
    [return int;]
    }
    funname
    2.经验技巧
    (1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
    (2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
    案例实操
    function sum()
    {
    s=0
    s=$[$1 + $2]
    echo "$s"
    }
    read -p "Please input the number1:" n1;
    read -p "Please input the number2:" n2;
    sum $n1 $n2;

    Shell工具(重点)
    cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
    语法:
    cut[选项参数] filename 说明:默认分隔符是制表符
    选项参数
    -f:列号,提取第几列
    -d: 分隔符, 按照指定分隔符分割列
    案例实操
    cut -d " " -f 2,3 cut.txt (切割cut.txt第二、三列)
    cat cut.txt | grep "guan" | cut -d " " -f 1 (在cut.txt文件中切割出guan)
    过滤

    sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
    语法:
    sed[选项参数] 'command' filename
    选项参数
    -e: 直接在指令列模式上进行sed的动作编辑
    命令功能
    -a:新增,a的后面可以接字串,在下一行出现
    -d: 删除
    -s: 查找并替换
    案例实操
    sed '2a mei nv' sed.txt (将“mei nv”这个单词插入到sed.txt第二行下)
    注意:文件并没有改变
    sed '/wo/d' sed.txt (删除sed.txt文件所有包含wo的行)
    sed 's/wo/in/g' sed.txt (将sed.txt文件中wo替换为ni)
    注意:‘g’表示global,全部替换

    awk一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
    语法:
    awk[选项参数] 'pattern1{action1} pattern2{action2}' filename 注意:只有匹配了pattern的行才会执行action
    pattern:表示awk在文件的数据中查找的内容,匹配模式
    action: 所执行的一系列命令
    选项参数
    -F 指定输入文件拆分隔符
    -v 赋值一个用户定义变量
    案例实操
    awk -F: '/^root/{print $7}' passwd (搜索passwd文件以root关键字开头的所有行,并输出该行的第7列)
    awk -F: '/^root/{print $1","$7}' password (搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割。)
    awk -F: 'BEGIN{print "user,shell"}{print $1","$7} END{print "kaige,/bin/zuishuai"}' passwd
    注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
    awk -v i=1 -F: '{print $3+i}' passwd (将passwd文件中的用户id增加数值1并输出)
    awk的内置变量
    FILENAME:文件名
    NR:已读的记录数
    NF:浏览记录的域的个数 (切割后,列的个数)
    案例实操
    awk -F: '{print"filename:" FILENAME",linenumber:" NR",columns:" NF}' passwd (统计passwd文件名,每行的行号,每行的列数)
    ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}' (切割IP)
    awk '/^$/{print NR}' sed.txt (查询sed.txt中空行所在的行号)

    sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
    sort(选项)(参数)
    选项:
    -n 从小到大
    -r 从大到小
    -t 排序时所用的分割字符
    -k 指定需要排序的列
    参数:
    指定待排序的文件列表
    案例实操
    sort -t : -nrk 3 sort.sh

    企业真实面试题
    京东
    问题1:使用Linux命令查询file1中空行所在的行号
    awk '/^$/{print NR}' sed.txt
    有文件chengji.txt内容如下:
    张三 40
    李四 50
    王五 60
    问题2:使用Linux命令计算第二列的和并输出
    cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}'
    搜狐和讯网
    问题1:Shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?
    if [ -f file.txt ]; then
    echo "文件存在!"
    else
    echo "文件不存在!"
    fi
    新浪
    问题1:用shell写一个脚本,对文本中无序的一列数字排序
    sort -n test.txt|awk '{a+=$0;print $0}END{print "SUM="a}
    金和网络
    问题1:请用shell脚本写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符”shen”的文件名称
    grep -r "shen" /home | cut -d ":" -f 1

  • 相关阅读:
    Linux入门(四)linux运行环境mysql详细操作及安装phpmyadmin
    Linux入门(五)linux服务器文件远程管理
    Linux入门(六)ubuntu下vim编辑器安装与使用
    windows下9款一键快速搭建PHP本地运行环境的好工具(含php7.0环境)
    Linux入门(三)搭建服务器linux运行环境LAMP/LNMP
    Linux入门(二)Linux基本命令及基本操作
    discuz使用总结
    ThinkPHP3.1快速入门(3)查询语言
    LeetCode 611. 有效三角形的个数(Valid Triangle Number)
    LeetCode 566. 重塑矩阵(Reshape the Matrix)
  • 原文地址:https://www.cnblogs.com/Bkxk/p/10131778.html
Copyright © 2011-2022 走看看