shell_shellcode - CSDN
shell 订阅
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。 展开全文
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
信息
性    质
命令解析器
外文名
shell
用    途
接收用户命令
中文名
shell术语
同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。在排序算法中,Shell是希尔排序的名称。基本上shell分两大类:一:图形界面shell(Graphical User Interface shell 即 GUI shell)例如:应用最为广泛的 Windows Explorer (微软的windows系列操作系统),还有也包括广为人知的 Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、 XFCE。二:命令行式shell(Command Line Interface shell ,即CLI shell)例如:bash / sh / ksh / csh / zsh(Unix/linux 系统)(MS-DOS系统)cmd.exe/ 命令提示字符(Windows NT 系统)Windows PowerShell(支持 .NET Framework 技术的 Windows NT 系统)传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。Shell基本上是一个命令解释器,类似于DOS下的command。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。交互式shell和非交互式shell交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。shell的类型在UNIX中主要有:Bourne shell (包括 sh,ksh,and bash)Bourne shell ( sh)Korn shell ( ksh)Bourne Again shell ( bash)POSIX shell ( sh)C shell (包括 csh and tcsh)C shell ( csh)TENEX/TOPS C shell ( tcsh)Bourne Shell  首个重要的标准Unix Shell是1979年底在V7 Unix(AT&T第7版)中引入的,并且以它的创始科技部基础条件平台“国家气象网络计算应用节点建设”(2004DKA50730)资助者Stephen Bourne的名字命名。Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell 可以运行为login shell或者login shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login shell。此时,shell先读取/etc/profile文件和$HOME/.profile文件。/etc/profile文件为所有的用户定制环境,$HOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。C Shell Bill Joy于20世纪80年代早期,在伯克利的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能。Korn Shell 有很长一段时间,只有两类shell供人们选择,Bourne shell用来编程,C shell用来交互。为了改变这种状况,AT&T的bell实验室David Korn开发了Korn shell。ksh结合了所有的C shell的交互式特性,并融入了Bourne shell的语法。因此,Korn shell广受用户的欢迎。它还新增了数学计算,进程协作(coprocess)、行内编辑(inline editing)等功能。Korn Shell 是一个交互式的命令解释器和命令编程语言.它符合POSIX——一个操作系统的国际标准.POSIX不是一个操作系统,而是一个目标在于应用程序的移植性的标准——在源程序一级跨越多种平台。Bourne Again Shell (bash) bash是GNU计划的一部分,用来替代Bourne shell。它用于基于GNU的系统如Linux.大多数的Linux(Red Hat,Slackware,Caldera)都以bash作为缺省的shell,并且运行sh时,其实调用的是bash。POSIX Shell POSIX shell 是Korn shell的一个变种. 当前提供POSIX shell的最大卖主是Hewlett-Packard。在HP-UX 11.0,POSIX shell 就是/bin/sh,而bsh是/usr/old/bin/sh.各主要操作系统下缺省的shell:AIX下是Korn Shell.Solaris缺省的是Bourne shell.FreeBSD缺省的是C shellHP-UX缺省的是POSIX shell.Linux是Bourne Again shell.Windows PowerShell是一种新的交互式的命令行和基于任务脚本编写技术,它使信息技术(IT) 管理员能够全面地自动操作和控制系统管理任务,从而提高了管理员的生产力。Windows PowerShell 包括多个系统管理实用工具、一致的语法和命名惯例、及对普通管理数据更好地导航,如登记、证书存储 或 Windows Management Instrumentation (WMI)。Windows PowerShell 还专门针对 IT 管理,提供直观的脚本编写语言。Shell也是一个VB函数,它的作用是运行程序,语法是Shell(命令字符串[,窗口类型])
收起全文
精华内容
参与话题
  • Shell是一个功能相当强大的编程语言,易编写、易调试、灵活性强。Shell可以帮助我们来管理大数据集群,提高开发效率。 本课程详细讲解:Shell解析器、变量、运算符、条件判断、流程控制、函数、cut、sed、awk...
  • 收藏!一篇教会你写90%的shell脚本!

    万次阅读 多人点赞 2020-08-21 17:25:45
    还不会写shell脚本?这篇文章教会你写90%的shell脚本!

    在公司项目的开发过程中,需要编写shell脚本去处理一个业务,在编写过程中发现自身对shell脚本的知识不够完善,顾整理一下,本文章主要内容来自菜鸟教程 , 也添加了一些知识点

    看完这边文章应该就可以独立完成大部分脚本得编写

    shell脚本?

    在说什么是shell脚本之前,先说说什么是shell。

    shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。

    shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。

    shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序。

    那么什么是shell脚本呢?

    shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

    shell脚本中最重要的就是对shell命令的使用与组合,再使用shell脚本支持的一些语言特性,完成想要的功能。

    博主所有文章首发在CSDN 和 公众号:【匠心Java

    【匠心Java】公众号分享工作中涉及到的技术知识,主要分享数据库相关和Java技术干货(JVM+并发+全链路优化);涉及计算机网络、数据结构与算法、linux等编程知识;

    微信扫描下述二维码关注;或微信搜索“匠心Java*”关注,期待与大家的交流

    匠心Java*

    注释

    “# ”开头的就是注释,被编译器忽略

    • 单行注释: #
    • 多行注释: :<<EOF … EOF 或者 :<<! … ! (:<< 标识多行注释开始,并指定一个标识符作为开始结束的标志)

    变量

    变量类型
    运行shell时,会同时存在三种变量:

    1. 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
    2. 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
    3. shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

    变量操作

    • 创建普通变量: name=“test” (=两边不可有空格)
    • 创建只可函数体中使用的局部变量: local name=“test” (使用local修饰的变量在函数体外无法访问,并且local只能在函数体内使用)
    • 使用变量: echo $name 或者 echo ${name} (推荐使用大括号版)
    • 变量重新赋值: name=“new_test” (将原值覆盖)
    • 只读变量: name=“only_read” -> readonly name (使用readonly标识后的变量,不可被修改)
    • 删除变量: unset name; (删除之后不可访问,删除不掉只读变量)

    字符串变量
    1)单引号

    • 单引号变量var='test' ,只能原样输出,变量无效
    • 单引号中不能出现一个单独的单引号,转义也不可以

    2)双引号

    • 双引号变量var="my name is ${name}",变量有效
    • 可出现转义符

    3)拼接字符串

    • 中间无任何+,之类的字符
    • name=“this is”" my name"; name=“this is my name”; name=“this” is “my name” 等效
    • name=‘this is’’ my nam’; name=‘this is my name’; name=‘this’ is ‘my name’ 等效

    4)获取字符串长度

    • 在${}中使用“#”获取长度
    • name=“test”;
    • echo ${#name}; # 输出为4

    5)提取子字符串

    • 1:4 从第2个开始 往后截取4个字符
    • ::4 从第一个字符开始 往后截取4个字符
    • name=“this is my name”;
    • echo ${name:1:4} #输出 his
    • echo ${name::4} #输出 this

    数组

    bash只支持一维数组,不支持多维数组

    • 定义数组:array_name=(li wang xiang zhang) (小括号做边界、使用空格分离)
    • 单独定义数组的元素: array_para[0]=“w”; array_para[3]=“s” (定义时下标不连续也可以)
    • 赋值数组元素:array_name[0]=“zhao”;
    • 获取数组元素:
      • array_name[0]=“li”
      • array_name[3]=“zhang”
      • echo ${array_name[0]} # 输出"li"
      • echo ${array_name[1]} # 输出" "
      • echo ${array_name[3]} # 输出"zhang"
      • echo ${array_name[@]} # 输出"li zhang" 输出数组所有元素,没有元素的下标省略
    • 取得元素个数:${#array_name[@]} 或者 ${#array_name[*]}
    • 取得单个元素长度:${#array_name[1]}

    参数传递

    • 获取参数值:
      • $0 : 固定,代表执行的文件名
      • $1 : 代表传入的第1个参数
      • $n : 代表传入的第n个参数
    • $#:参数个数
    • $*: 以一个单字符串显示所有向脚本传递的参数。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数
    • $@:与$*相同,但是使用时加引号,并在引号中返回每个参数。
    • $$:脚本运行的当前进程号
    • $!:后台运行的最后一个进程的ID
    • $?: 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
    • $* 与 $@ 区别
      • 相同点:都是引用所有参数。
      • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。

    运算符

    算数运算

    • + 、-、*、\ : 乘号前必须加\进行转义才可以进行乘法运算
    • 加法运算
      • val=`expr 2 + 2` (使用linux命令expr进行辅助运算)
      • val=$[2+2] (4个空格不是必要的,不同于条件判断)
      • val=$((2+2))

    数字关系运算符
    关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
    下面假定变量 a 为 10,变量 b 为 20

    • -eq :检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
    • -ne: 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
    • -gt: 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
    • -lt : 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
    • -ge: 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
    • -le : 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

    字符串运算符
    下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

    • = :检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
    • != :检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
    • -z :检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
    • -n :检测字符串长度是否为0,不为0返回 true。 [ -n “$a” ] 返回 true。
    • $ :检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

    布尔运算符
    下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

    • ! :非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
    • -o :或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
    • -a :与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

    逻辑运算符
    以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

    • && :逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
    • || :逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

    文件运算符

    • -b file :检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
    • -c file :检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
    • -d file :检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
    • -f file :检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
    • -g file :检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
    • -k file :检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
    • -p file :检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
    • -u file :检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
    • -r file :检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
    • -w file :检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
    • -x file :检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
    • -s file :检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
    • -e file :检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

    执行相关

    命令替换
    命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。
    执行命令:

    1. `ls /etc` : 反引号 (所有的unix系统都支持)
    2. $(ls /etc) : $+() (部分unix系统不支持)
      多个嵌套使用时,从内向外执行

    for file in \s /etc\ 或 for file in $(ls /etc) 循环中使用
    `dirname $0` 获取脚本文件所在的目录
    path=$(cd `dirname $0`;pwd) : 获取脚本当前所在目录,并且执行cd命令到达该目录,使用pwd获取路径并赋值到path变量

    算术运算

    1. $[ ] : 加减乘除,不必添加空格
    2. $(( )) :加减乘除等,不必添加空格

    逻辑判断

    1. [ ] : 中括号旁边和运算符两边必须添加空格 (可以使用,不推荐)
    2. [[ ]]:中括号旁边和运算符两边必须添加空格 (字符串验证时,推荐使用)
    3. (()) : 中括号旁边和运算符两边必须添加空格 (数字验证时,推荐使用)
    4. [[]] 和 (()) 分别是[ ]的针对数学比较表达式和字符串表达式的加强版。
    5. 使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。
      [[ ]]中增加模式匹配特效;
      (( ))不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了以下符号
      在这里插入图片描述

    输出

    echo
    仅用于字符串的输出,没有使用printf作为输出的移植性好,建议使用printf

    printf

    printf 不会像 echo 自动添加换行符,我们可以手动添加 \n
    无大括号,直接以空格分隔

    • 格式:printf format-string [arguments...] 其中(format-string: 格式控制字符串、arguments: 参数列表)
    • 案例:printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
    • %s %c %d %f 都是格式替代符
      • d:Decimal 十进制整数 对应位置参数必须是十进制整数,否则报错!
      • s:String 字符串 对应位置参数必须是字符串或者字符型 否则报错
      • c:Char 字符 对应位置参数必须是字符串或者字符型 否则报错
      • f:Float 浮点 对应位置参数必须是数字型 否则报错
    • %-10s : 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
    • %-4.2f :指格式化为小数,宽度为4个字符,其中.2指保留2位小数。
    • 转义符:
      • \a :警告字符,通常为ASCII的BEL字符
      • \b :后退
      • \c :抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
      • \f :换页(formfeed)
      • \n :换行
      • \r :回车(Carriage return)
      • \t :水平制表符
      • \v :垂直制表符
      • \ :一个字面上的反斜杠字符
      • \ddd :表示1到3位数八进制值的字符。仅在格式字符串中有效
      • \0ddd :表示1到3位的八进制值字符

    流程控制

    和Java、PHP等语言不一样,sh的流程控制不可为空,即if或者else的大括号中无任何语句
    if else

    • if
    if condition
    then
        command1 
        command2
        ...
        commandN 
    fi
    
    • if else
    if condition
    then
        command1 
        command2
        ...
        commandN
    else
        command
    fi
    
    • if else-if else
    if condition1
    then
        command1
    elif condition2 
    then 
        command2
    else
        commandN
    fi
    

    for

    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
        commandN
    done
    

    while

    • while condition
    while condition
    do
        command
    done
    
    • while 无限循环
    while :
    do
        command
    done
    

    until
    until 循环执行一系列命令直至条件为 true 时停止。
    until 循环与 while 循环在处理方式上刚好相反。

    until condition
    do
        command
    done
    

    case
    Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
    case需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break,其中“;;”不是跳出循环,是不在去匹配下面的模式
    case语句格式如下:

    casein
      模式1)
        command1
        command2
        ...
        commandN
        ;;
      模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac
    

    跳出循环

    1. break :跳出总循环
    2. continue:跳出当前循环,继续下一次循环

    定义函数

    可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

    • 函数定义
    [ function ] funname()
    {
        action;
        [return int;]
    }
    
    • 参数传递
      • 调用函数: fun_name 2 3 4
      • 函数中使用:和shell取用函数相同 $n $# $* $? 或者加上{}
    funWithParam(){
        echo "第一个参数为 $1 !"
        echo "第二个参数为 $2 !"
        echo "第十个参数为 $10 !"
        echo "第十个参数为 ${10} !"
        echo "第十一个参数为 ${11} !"
        echo "参数总数有 $# 个!"
        echo "作为一个字符串输出所有参数 $* !"}
    funWithParam 1 2 3 4 5 6 7 8 9 34 73
    echo $?  \# 判断执行是否成功
    
    • 函数返回值
      • return字样可存在也可不存在
      • return 只能为 return [0-255],此处的返回可作为函数执行的状态,通过$?获取的便是这个返回值
      • 如果不加return , 则默认最后一条语句的执行状态所为函数执行状态的返回值,如果最后一条语句执行成功,则$?为0,否则不为0
    • 使用函数返回值(Janusgraph图数据库官方启动服务脚本片段)
      • return返回的数字,只是作为函数执行状态的返回值,也就是接下来$?获取的值
      • 对于类似于下面的BIN=\abs_path``语句,获取的是函数体内所有的echo、printf输出组合成的一个字符串
    abs_path() {
        SOURCE="${BASH_SOURCE[0]}"
        while [ -h "$SOURCE" ]; do
            DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
            SOURCE="$(readlink "$SOURCE")"
            [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
        done
        echo "test"  
        echo "$( cd -P "$( dirname "$SOURCE" )" && pwd )"  
        # 此函数的两个echo输出会组合成一个字符串作为下述BIN的值
    }
    
    BIN=`abs_path` # BIN赋值函数返回值,如果没有return,则函数中所有的echo、printf输出组合成一个字符串传入BIN
    path=${BIN}/nodetool # 可直接使用
    

    输入输出重定向

    一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

    • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
    • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
    • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

    默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
    如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

    输入重定向

    1. bash.sh < file : 将脚本的输入重定向到file,由file提供参数

    输出重定向

    1. bash.sh > file : 将脚本的输出数据重定向到file中,覆盖数据
    2. bash.sh >> file : 将脚本的输出数据重定向到file中,追加数据
    3. command >> file 2>&1 : 将 stdout 和 stderr 合并后重定向到 file

    读取外部输入

    命令:read arg (脚本读取外部输入并赋值到变量上)
    在shell脚本执行到上述命令时,停止脚本执行并等待外部输入,将外部输入赋值到arg变量上,继续执行脚本

    文件引用

    引用其他的文件之后,可以使用其变量、函数等等,相当于将引用的文件包含进了当前文件
    两种方式:

    1. . file_path\file_name
    2. source file_path\file_name

    颜色标识

    printf  "\033[32m SUCCESS: yay \033[0m\n";
    printf  "\033[33m WARNING: hmm \033[0m\n";
    printf  "\033[31m ERROR: fubar \033[0m\n";
    

    输出结果:
    在这里插入图片描述

    长句换行

    在shell中为避免一个语句过长,可以使用“\”进行换行
    使用“\”换行,在脚本执行过程中还是当做一行一个语句执行,不同于enter直接换行

    注意:\ 前添加一个空格 。 \ 后无空格直接换行。

     /mysql/bin/mysql \
      -h test_host  -P 000 \
      -u test_user -ptest_password ;
    

    shell操作mysql

    下面案例为登录mysql,并选择操作数据库,之后进行导入数据

     /mysql/mysql/bin/mysql \
      -h test_host  -P 000 \
      -u test_user -ptest_password \
      -e"use test_database; source data_faile; " # -e 代表执行sql语句
    

    -u 用户名
    -p 用户密码
    -h 服务器ip地址
    -D 连接的数据库
    -N 不输出列信息
    -B 使用tab键 代替 分隔符
    -e 执行的SQL语句

    退出脚本

    命令:exit

    在退出脚本时使用不同的错误码,这样可以根据错误码来判断发生了什么错误。

    在绝大多数 shell 脚本中,exit 0 表示执行成功,exit 1 表示发生错误。
    对错误与错误码进行一对一的映射,这样有助于脚本调试。

    命令:set -e 或者 set +e
    set -e表示从当前位置开始,如果出现任何错误都将触发exit。相反,set +e表示不管出现任何错误继续执行脚本。

    如果脚本是有状态的(每个后续步骤都依赖前一个步骤),那么请使用set -e,在脚本出现错误时立即退出脚本。
    如果要求所有命令都要执行完(很少会这样),那么就使用set +e。

    shell脚本调试

    检查是否有语法错误-n
    bash -n script_name.sh
    使用下面的命令来执行并调试 Shell 脚本-x
    bash -x script_name.sh
    调试count_odd_number.sh 程序案例:

    #!/usr/bin.env bash
    
    # 用于计算数组中奇数的和
    # @author liyangyang
    # @time 2019/09/17
    
    sum=0
    for num in 1 2 3 4;do
        re=${num}%2
        if (( ${re} == 1 ));then
            sum=$[${sum}+${num}]
        fi
    done
    echo ${sum}
    
    1. 首先检查有无语法错误:
      bash -n count_odd_number.sh
    2. 没有输出,说明没有错误,开始实际调试:
      bash -x count_odd_number.sh
    3. 调试结果如下:
    + sum=0
    + for num in 1 2 3 4
    + re=1%2
    + ((  1%2 == 1  ))
    + sum=1
    + for num in 1 2 3 4
    + re=2%2
    + ((  2%2 == 1  ))
    + for num in 1 2 3 4
    + re=3%2
    + ((  3%2 == 1  ))
    + sum=4
    + for num in 1 2 3 4
    + re=4%2
    + ((  4%2 == 1  ))
    + echo 4
    4
    

    其中的输出显示了程序执行的每一步,通过观察程序执行的步骤是否满足预期从而达到调试的效果
    带有 + 表示的是 Shell 调试器的输出,不带 + 表示程序的输出。

    案例:

    这是es(ElasticSearch)官方启动服务的脚本,看可不可以理解吧~

    #!/usr/bin/env bash
    
    # CONTROLLING STARTUP:
    #
    # This script relies on a few environment variables to determine startup
    # behavior, those variables are:
    #
    #   ES_PATH_CONF -- Path to config directory
    #   ES_JAVA_OPTS -- External Java Opts on top of the defaults set
    #
    # Optionally, exact memory values can be set using the `ES_JAVA_OPTS`. Note that
    # the Xms and Xmx lines in the JVM options file must be commented out. Example
    # values are "512m", and "10g".
    #
    #   ES_JAVA_OPTS="-Xms8g -Xmx8g" ./bin/elasticsearch
    
    source "`dirname "$0"`"/elasticsearch-env
    
    parse_jvm_options() {
      if [ -f "$1" ]; then
        echo "`grep "^-" "$1" | tr '\n' ' '`"
      fi
    }
    
    ES_JVM_OPTIONS="$ES_PATH_CONF"/jvm.options
    
    ES_JAVA_OPTS="`parse_jvm_options "$ES_JVM_OPTIONS"` $ES_JAVA_OPTS"
    
    # manual parsing to find out, if process should be detached
    if ! echo $* | grep -E '(^-d |-d$| -d |--daemonize$|--daemonize )' > /dev/null; then
      exec \
        "$JAVA" \
        $ES_JAVA_OPTS \
        -Des.path.home="$ES_HOME" \
        -Des.path.conf="$ES_PATH_CONF" \
        -cp "$ES_CLASSPATH" \
        org.elasticsearch.bootstrap.Elasticsearch \
        "$@"
    else
      exec \
        "$JAVA" \
        $ES_JAVA_OPTS \
        -Des.path.home="$ES_HOME" \
        -Des.path.conf="$ES_PATH_CONF" \
        -cp "$ES_CLASSPATH" \
        org.elasticsearch.bootstrap.Elasticsearch \
        "$@" \
        <&- &
      retval=$?
      pid=$!
      [ $retval -eq 0 ] || exit $retval
      if [ ! -z "$ES_STARTUP_SLEEP_TIME" ]; then
        sleep $ES_STARTUP_SLEEP_TIME
      fi
      if ! ps -p $pid > /dev/null ; then
        exit 1
      fi
      exit 0
    fi
    
    exit $?
    

    推荐阅读:
    Git-【技术干货】工作中Git的使用实践
    Git - 使用git不知道内部实现机制怎么行

    如果转载此博文,请附上本文链接,谢谢合作~ :https://blog.csdn.net/CSDN___LYY/article/details/100584638

    如果感觉这篇文章对您有所帮助,请点击一下“喜欢”或者“关注”博主,您的喜欢和关注将是我前进的最大动力!谢谢大家~

    在这里插入图片描述

    展开全文
  • Shell——你只需要了解这么多

    万次阅读 多人点赞 2020-08-09 10:16:22
    一.Shell简介 Shell是一个用C语言编写的程序,通过Shell用户可以访问操作系统内核服务,类似于DOS下的command和后来的cmd.exe。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行...

    原文地址: Shell——你只需要了解这么多

    一.Shell简介

    Shell是一个用C语言编写的程序,通过Shell用户可以访问操作系统内核服务,类似于DOS下的command和后来的cmd.exe。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量、参数、函数、流程控制等等。它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。

    二.两类程序设计语言

    我经常说道shell脚本,其实是因为Shell是一种脚本语言,也就是解释性语言。程序设计语言可以分为两类:编译型语言和解释型语言。

    语言 区别
    编译型语言 需要预先将我们写好的源代码转换成目标代码,这个过程被称作“编译”。运行程序时,直接读取目标代码。由于编译后的目标代码非常接近计算机底层,因此执行效率很高,这是编译型语言的优点
    解释型语言 也叫做脚本语言。执行这类程序时,解释器需要读取我们编写的源代码,并将其转换成目标代码,再由计算机运行。因为每次执行程序都多了编译的过程,因此效率有所下降

    三.Shell脚本解释器

    Linux的Shell脚本解释器种类众多,一个系统可以存在多个shell脚本解释器,可以通过cat /etc/shells 命令查看系统中安装的shell脚本解释器。

    [root@centos6-1 ~]# cat /etc/shells 
    /bin/sh
    /bin/bash
    /sbin/nologin
    /bin/dash
    /bin/tcsh
    /bin/csh
    [root@centos6-1 ~]# 
    

    bash由于易用和免费,在日常工作中被广泛使用。同时,Bash也是大多数Linux系统默认的Shell脚本解释器。

    四.Hello World

    新建helloworld.sh

    [root@centos6-1 ~]# touch helloworld.sh
    

    编辑helloworld.sh文件,添入一下内容

    #!/bin/bash
    echo "helloworld"
    
    • #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell,这里指定bash
    • echo 是Shell的一个内部指令,用于在屏幕上打印出指定的字符串

    赋予当前用户helloworld.sh的执行权限(刚创建的文件没有执行权限)

    [root@centos6-1 ~]# chmod u+x helloworld.sh
    

    执行hellowo.sh脚本方式一

    [root@centos6-1 ~]# ./helloworld.sh 
    helloworld
    [root@centos6-1 ~]# 
    

    注意,一定要写成./helloworld.sh,而不是helloworld.sh,linux系统会去PATH里寻找有没有叫helloworld.sh的,而helloworld.sh不在PATH里,所以写成helloworld.sh是会找不到命令的,要用./helloworld.sh告诉系统说,就在当前目录找。

    执行hellowo.sh脚本方式二

    [root@centos6-1 ~]# /bin/sh helloworld.sh 
    helloworld
    [root@centos6-1 ~]# 
    

    这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,当使用这种方式时,脚本中的#!/bin/bash指定的解释器是不生效的,当前使用什么解释器就是什么解释器

    五.变量

    • 语法格式:变量名=变量值

    shell变量定义的严格语法限制:

    1. 变量名和等号之间不能有空格
    2. 变量名首个字符必须为英文字母
    3. 不能包含标点符号但能够使用下划线(_)
    4. 不能使用空格
    5. 不能使用 bash 里的关键字
    

    1.变量类型

    类型 解释
    局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
    环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程 序需要环境变量来保证其正常运行。可以用过set命令查看当前环境变量
    shell变量 由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell 的正常运行

    2.定义变量

    name="zaomianbao"
    

    3.引用变量

    name="zaomianbao"
    echo ${name}
    echo $name
    

    引用一个定义过的变量,只要在变量名前面加$即可,变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。

    4.重新定义变量

    已定义的变量,可以被重新定义

    name="zaomianbao"
    echo ${name}
    name="tiechui"
    echo ${name}
    

    5.只读变量

    使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变

    name="zaomianbao"
    readonly name
    name="tiechui"
    

    6.删除变量

    name="zaomianbao"
    unset name
    echo $name
    

    使用unset命令可以删除变量,变量被删除后不能再次使用,同时unset命令不能删除只读变量。

    六.参数传递

    在执行Shell脚本时,可以向脚本传递参数。脚本内获取参数的格式为:$n。n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推…
    $0 表示当前脚本名称。

    1.修改helloworld.sh为

    #!/bin/bash
    echo $1
    echo $2
    echo $3
    

    2.执行携带参数

    [root@centos6-1 ~]# ./helloworld.sh haha wowow nini
    haha
    wowow
    nini
    [root@centos6-1 ~]#
    

    七.特殊字符

    字符 意义
    $# 传递到脚本的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

    $*和$@区别:

    • 相同点:都表示传递给脚本的所有参数。
    • 不同点:不被" “包含时,$和$@都以$1 $2… $n 的形式组成参数列表。
      被" “包含时,”$
      ” 会将所有的参数作为一个整体,以"$1 $2 … $n" 的形式组成一个整串;"$@" 会将各个参数分开,以"$1" “$2” … “$n” 的 形式组成一个参数列表。

    八.Shell字符串

    shell字符串可以用单引号,也可以用双引号,也可以不用引号

    单引号

    name='my name is zaomianbao'
    
    • 单引号字符串中不支持引用变量,任何字符都会原样输出
    • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)

    双引号

    name='my name is zaomianbao'
    name_again="\"${name}\""
    
    • 双引号里可以引有变量
    • 双引号里支持转义字符

    字符串长度

    name='my name is zaomianbao'
    echo ${#name}   //执行输出为21
    

    截取字符串

    name='my name is zaomianbao'
    echo ${name:11:20}   //执行输出zaomianbao
    

    九.shell数组

    • bash支持一维数组(不支持多维数组),并且没有限定数组的大小。在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
        array_name=(value1 … valuen)

    下面的例子将展示shell数组常见的所有操作

    //第一数组
    [root@centos6-1 ~]# usernames=(1 2 33 44 adsd1)
    //默认读取第一个
    [root@centos6-1 ~]# echo ${usernames}
    1
    //读取下标为0的
    [root@centos6-1 ~]# echo ${usernames[0]}
    1
    //读取下标为1的
    [root@centos6-1 ~]# echo ${usernames[1]}
    2
    //读取所有
    [root@centos6-1 ~]# echo ${usernames[*]}
    1 2 33 44 adsd1
    //同样是读取所有
    [root@centos6-1 ~]# echo ${usernames[@]}
    1 2 33 44 adsd1
    //获取数组长度
    [root@centos6-1 ~]# echo ${#usernames[@]}
    5
    //同样可以获取数组长度
    [root@centos6-1 ~]# echo ${#usernames[*]}
    5
    [root@centos6-1 ~]# 
    

    十.shell运算符

    • Shell和其他编程语音一样,支持包括:算术、关系、布尔、字符串等运算符。
    • 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

    1.算术运算符

    运算符 意义
    + 加法
    - 减法
    * 乘法
    / 除法
    % 模,即取余

    下面是详细例子

    #!/bin/bash
    
    a=10
    b=20
    
    val=`expr $a + $b`
    echo "a + b : $val"
    
    val=`expr $a - $b`
    echo "a - b : $val"
    
    val=`expr $a \* $b`
    echo "a * b : $val"
    
    val=`expr $b / $a`
    echo "b / a : $val"
    
    val=`expr $b % $a`
    echo "b % a : $val"
    
    if [ $a == $b ]
    then
       echo "a 等于 b"
    fi
    if [ $a != $b ]
    then
       echo "a 不等于 b"
    fi
    

    执行

    [root@centos6-1 ~]# ./helloworld.sh 
    a + b : 30
    a - b : -10
    a * b : 200
    b / a : 2
    b % a : 0
    a 不等于 b
    [root@centos6-1 ~]# 
    

    注意:

    -  1.乘号(*)前边必须加反斜杠(\)
    -  2.条件表达式要放在方括号之间,并且要有空格
    

    2.关系运算符

    关系运算符只支持数字,不支持字符串,除非字符串的值是数字

    运算符 意义
    -eq EQUAL等于
    -ne NOT EQUAL不等于
    -gt GREATER THAN大于
    -lt LESS THAN小于
    -ge GREATER THAN OR EQUAL 大于等于
    -le LESS THAN OR EQUAL 小于等

    下面是详细例子

    #!/bin/bash
    
    a=10
    b=20
    
    if [ $a -eq $b ]
    then
       echo "$a -eq $b : a 等于 b"
    else
       echo "$a -eq $b: a 不等于 b"
    fi
    if [ $a -ne $b ]
    then
       echo "$a -ne $b: a 不等于 b"
    else
       echo "$a -ne $b : a 等于 b"
    fi
    if [ $a -gt $b ]
    then
       echo "$a -gt $b: a 大于 b"
    else
       echo "$a -gt $b: a 不大于 b"
    fi
    if [ $a -lt $b ]
    then
       echo "$a -lt $b: a 小于 b"
    else
       echo "$a -lt $b: a 不小于 b"
    fi
    if [ $a -ge $b ]
    then
       echo "$a -ge $b: a 大于或等于 b"
    else
       echo "$a -ge $b: a 小于 b"
    fi
    if [ $a -le $b ]
    then
       echo "$a -le $b: a 小于或等于 b"
    else
       echo "$a -le $b: a 大于 b"
    fi
    

    执行

    [root@centos6-1 ~]# ./helloworld.sh  
    10 -eq 20: a 不等于 b
    10 -ne 20: a 不等于 b
    10 -gt 20: a 不大于 b
    10 -lt 20: a 小于 b
    10 -ge 20: a 小于 b
    10 -le 20: a 小于或等于 b
    [root@centos6-1 ~]# 
    

    3.布尔运算符

    运算符 意义
    &&
    ||

    下面是详细例子

    #!/bin/bash
    
    a=10
    b=20
    
    if [[ $a -lt 100 && $b -gt 100 ]]
    then
       echo "返回 true"
    else
       echo "返回 false"
    fi
    
    if [[ $a -lt 100 || $b -gt 100 ]]
    then
       echo "返回 true"
    else
       echo "返回 false"
    fi
    

    执行

    [root@centos6-1 ~]# ./helloworld.sh 
    返回 false
    返回 true
    [root@centos6-1 ~]# 
    

    4.字符串运算符

    操作符 意义
    -z 字符串长度是否为0,为0返回 true
    -n 字符串长度是否为0,不为0返回 true
    str 字符串是否为空,不为空返回 true

    下面是详细例子

    #!/bin/bash
    
    a="abc"
    b="efg"
    
    if [ $a = $b ]
    then
       echo "$a = $b : a 等于 b"
    else
       echo "$a = $b: a 不等于 b"
    fi
    if [ $a != $b ]
    then
       echo "$a != $b : a 不等于 b"
    else
       echo "$a != $b: a 等于 b"
    fi
    if [ -z $a ]
    then
       echo "-z $a : 字符串长度为 0"
    else
       echo "-z $a : 字符串长度不为 0"
    fi
    if [ -n $a ]
    then
       echo "-n $a : 字符串长度不为 0"
    else
       echo "-n $a : 字符串长度为 0"
    fi
    if [ $a ]
    then
       echo "$a : 字符串不为空"
    else
       echo "$a : 字符串为空"
    fi
    

    执行

    [root@centos6-1 ~]# ./helloworld.sh 
    abc = efg: a 不等于 b
    abc != efg : a 不等于 b
    -z abc : 字符串长度不为 0
    -n abc : 字符串长度不为 0
    abc : 字符串不为空
    [root@centos6-1 ~]# 
    

    5.文件测试运算符

    操作符 意义
    -b file 文件是否是块设备文件,如果是,则返回 true
    -c file 文件是否是字符设备文件,如果是,则返回 true
    -d file 是否是目录,如果是,则返回 true
    -f file 文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
    -g file 文件是否设置了 SGID 位,如果是,则返回 true
    -k file 文件是否设置了粘着位(Sticky Bit),如果是,则返回 true
    -p file 文件是否是具名管道,如果是,则返回 true
    -u file 文件是否设置了 SUID 位,如果是,则返回 true
    -r file 文件是否可读,如果是,则返回 true
    -w file 文件是否可写,如果是,则返回 true
    -x file 文件是否可执行,如果是,则返回 true
    -s file 文件是否为空(文件大小是否大于0),不为空返回 true
    -e file 文件(包括目录)是否存在,如果是,则返回 true

    下面是详细例子

    #!/bin/bash
    
    file="/com/zaomianbao"
    if [ -r $file ]
    then
       echo "文件可读"
    else
       echo "文件不可读"
    fi
    if [ -w $file ]
    then
       echo "文件可写"
    else
       echo "文件不可写"
    fi
    if [ -x $file ]
    then
       echo "文件可执行"
    else
       echo "文件不可执行"
    fi
    if [ -f $file ]
    then
       echo "文件为普通文件"
    else
       echo "文件为特殊文件"
    fi
    if [ -d $file ]
    then
       echo "文件是个目录"
    else
       echo "文件不是个目录"
    fi
    if [ -s $file ]
    then
       echo "文件不为空"
    else
       echo "文件为空"
    fi
    if [ -e $file ]
    then
       echo "文件存在"
    else
       echo "文件不存在"
    fi
    

    执行

    [root@centos6-1 ~]# ./helloworld.sh 
    文件不可读
    文件不可写
    文件不可执行
    文件为特殊文件
    文件不是个目录
    文件为空
    文件不存在
    [root@centos6-1 ~]# 
    

    十一.流程控制

    1.if-else

    
    if condition
    then
        //做你想做的事
    else
        //做你想做的事
    fi
    
    
    if condition1
    then
        //做你想做的事
    elif condition2 
    then 
        //做你想做的事
    else
        //做你想做的事
    fi
    

    2.case

    case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令

    case 值 in
    模式1)
        //做你想做的事
        ;;
    模式2)
        //做你想做的事
        ;;
    *)
        //做你想做的事
        ;;
    esac
    

    取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

    3.for

    for 变量 in 列表
    do
        //做你想做的事
    done
    

    4.while

    while command
    do
       //做你想做的是
    done
    

    5.until

    until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。

    until command
    do
       //做你想做的事
    done
    

    command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

    十二.函数

    函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,Shell 也支持函数。Shell 函数必须先定义后使用。

    #!/bin/bash
    
    demoFun(){
        echo "这是我的第一个 shell 函数!"
    }
    echo "-----函数开始执行-----"
    demoFun 
    echo "-----函数执行完毕-----"
    

    执行

    [root@centos6-1 ~]# ./helloworld.sh 
    -----函数开始执行-----
    这是我的第一个 shell 函数!
    -----函数执行完毕-----
    [root@centos6-1 ~]# 
    

    如果函数有返回值,则函数返回值可以在调用该函数后通过 $? 来获得。

    参考资料:
    https://baike.baidu.com/item/shell/99702?fr=aladdin
    http://www.runoob.com/linux/linux-shell.html
    https://www.cnblogs.com/maybe2030/p/5022595.html
    https://baike.baidu.com/item/POSIX/3792413?fr=aladdin

    展开全文
  • 10小时全掌握Linux下shell编程

    千人学习 2020-02-06 14:14:51
    从没上过课的学渣 学了还不会的学弱 想学懂的学霸 10小时全掌握Linux下shell编程 工作、面试全没问题。
  • shell脚本精简教程

    万人学习 2018-10-22 21:38:06
    详细的介绍shell脚本的使用。
  • Shell

    2020-08-14 14:50:20
    1. echo 输出命令 语法:echo [选项] [输出内容] 选项:-e 支持反斜线控制的字符转换 控制字符 作用 \\ 输出\本身 \a ... 取消输出行末的换行符,和“-n”选项一样 ... 按照八进制A...

    echo 输出命令

        语法:echo [选项] [输出内容]

        选项:-e  支持反斜线控制的字符转换

    控制字符 作用
    \\ 输出\本身
    \a 输出警告音
    \b 退格键,也就是向左删除键
    \c 取消输出行末的换行符,和“-n”选项一样
    \e ESCAPE键
    \f 换页符
    \n 换行符
    \r 回车键
    \t 制表符,也就是tab键
    \v 垂直制表符
    \0nnn 按照八进制ASCII码表输出字符,其中0为数字零,nnn是三位八进制数
    \xhh 按照十六进制ASCII码表输出字符,其中hh是两位十六进制数

     

     

     

     

    [root@zyf ~]# echo -e "ab\bc"
    #删除左侧字符
    ac
    [root@zyf ~]# echo -e "a\tb\tc\nd\te\tf"
    #制表符与换行符
    a    b    c
    d    e    f
    [root@zyf ~]# echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"
    #按照十六进制ASCII码也同样可以输出
    a    b    c
    d    e    f
    [root@zyf ~]# echo -e "\e[1;30m abcd \e[0m"
    #输出颜色 
    # 30m = 黑色,31m = 红色,32m = 绿色,33m = 黄色
    # 34m = 蓝色,35m = 洋红,36m = 青色,37m = 白色
    abcd 

    2.简单脚本:

    [root@zyf sh]# vi hello.sh

    #!/bin/sh
    #The first program
    #Auther:Sirian
    echo -e "I'm a superhero"
    

    3.脚本执行:

    • 赋予文件执行权限,直接运行
    1.  chmod 775 hello.sh
    2.  ./hello.sh
    • 通过sh调用直接执行脚本(这样就可以不必赋予文件执行权限)
    1. sh hello.sh

    插件:dos2unix  [脚本文件]  :将Windows的sh脚本文件转换为Linux的脚本文件

               unix2dos  [脚本文件]  :将Linux的脚本文件转换为Windows的脚本文件

    Bash的基本功能:

    1.  历史命令    语法: history 【选项】【历史命令保存文件】

         选项: 

                -c :     清空历史命令

                -w:      八缓存中的历史命令写入历史命令保存文件:~/bash_history

         历史命令默认会保存1000条,可以再环境变量配置文件/etc/profile中修改

     

          历史命令的调用

    1.  使用上,下箭头调用以前的历史命令
    2.  使用 "!n" 重复执行第n条历史命令
    3.  使用 "!!"  重复执行上一条命令
    4.  使用 "!字串"  重复执行最后一条以该字串开头的命令

    2. 命令与文件补全

        再bash中,命令与文件补全是非常方便与常用的功能,我们只要再输入命令或者文件时,按“tab”键就会自动补全

    3. 命令别名与常用快捷键

      1. 命令别名: alias 别名=‘原命令’

          查询命令别名: alisa

          命令执行时顺序:

    1.  第一顺位执行用绝对路径或相对路径执行的命令
    2.  第二顺位执行别名
    3.  第三顺位执行Bash的内部命令
    4. 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令

          让别名永久生效: vi /root/.bashrc

          删除别名: unalias

    Bash 常用快捷键

    快捷键 作用
    CTRL+A 把光标移动到命令行开头,如果我们输入的命令过长,想要把光标移动到命令行开头时使用
    CTRL+E 把光标移动到命令行末尾
    CTRL+C 强制终止当前的命令
    CTRL+L 清屏,相当于clear命令
    CTRL+U 删除或剪切光标之前的命令,我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便
    CTRL+K 删除或剪切光标之后的内容
    CTRL+Y 粘贴CTRL+U或者CTRL+K 剪切的内容
    CTRL+Y 在历史命令中搜索,按下CTRL+R之后,就会出现搜索界面,只要输入搜索内容就会从历史命令中搜索
    CTRL+D 退出当前终端
    CTRL+Z 暂停,并放入后台,这个快捷键牵扯工作管理的内容
    CTRL+S 暂停屏幕输出
    CTRL+Q 恢复屏幕输出

     

     

     

     

     

     

     

     

     

     

     

     

     

    标准输入输出

    设备 设备文件名 文件描述符 类型
    键盘 /dev/stdin 0 标准输入
    显示器 /dev/sdtout 1 标准输出
    显示器 /dev/sdterr 2 标准错误输出

    输出重定向

    类型 符号 作用
    标准输出重定向 命令 > 文件 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
      命令 >> 文件 以追加的方式,把命令的正确输出输出到指定的文件或设备当中
    标准错误输出重定向 错误命令 2> 文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
      错误命令 2>>文件 以追加的方式,把命令的错误输出输出到指定的文件或设备当中
    正确输出和错误输出同时保存 命令 > 文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
      命令 >> 文件 2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件当中
      命令 &> 文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
      命令 &>> 文件 以追加的方式,把正确输出和错误输出都保存到同一个文件当中
      命令 >> 文件1 2>>文件2 把正确的输出追加到文件1,把错误的输出追加到文件2中

    输入重定向

    语法:wc 【选项】 【文件名】

    选项:

         -c:    统计字节数

        -w:    统计单词数

         -l:  统计行数

    命令<文件: 把文件作为命令的输入

    多命令顺序执行:

    多命令执行符 格式 作用
    命令1;名2;命令n 多个命令顺序执行,命令之间没有任何逻辑关系
    && 命令1 && 命令2 && 命令n

    逻辑与

    当命令1正确执行,则命令2才执行

    当命令2执行不正确,则命令2不执行

    || 命令1 || 命令2 || 命令n

    逻辑或

    当命令1正确执行,则命令2 不执行

    当命令2执行不正确,则命令2执行

     

     

     

     

     

     

     

    dd命令:dd if=输入文件 of=输出文件 bs=字节数 count=个数

    选项:

        if=输入文件      指定源文件或源设备

        of=输出文件     指定目标文件或者目标设备

        bs=字节数        指定一次输入/输出多少字节,即把这些字节看作一个数据块

        count=个数       指定输入/输出多少个数据块

     

    管道符:命令1 | 命令2

    作用: 命令1的正确输出作为命令2的操作对象

     

    grep 【选项】 “搜索内容”

    选项:

        -i:                            忽略大小写

        -n:                           输出行号

        -v:                           反向查找

        --color=auto               搜索出的关键字用颜色显示

    通配符

    通配符 作用
    匹配一个任意字符
    * 匹配0个或多个个字符,也就是可以匹配任何内容
    [] 匹配中括号中任意一个字符,例如[abc]代表匹配a,b,c三个字符其中一个字符只能是a,或者是b,或者是c
    [-] 匹配中括号中任意一个字符,-代表一个范围:例如[a-z],代表匹配任意一个小写字母
    [^] 逻辑非,表示匹配不是中括号内的一个字符,例如[^0-9],代表匹配一个不是数字的字符

    Bash中其他的特殊符号

    符号 作用
    '' 单引号,在单引号中所有的特殊符号都没有特殊含义(包括“$”和“`”)
    "" 双引号,在双引号中特殊符号都没有特殊含义,但是“$”,"`","\"例外,拥有“调用变量的值”,“引用命令”,“转义符”的特殊含义
    ·· 反引号,反引号括起来的内容是系统命令,在Bash中会先执行它,和$()作用一样,不过推荐使用$(),因为反引号非常容易看错
    $() 和反引号作用一样,用来引用系统命令
    # 在shell脚本中,#开头的行代表注释
    用于调用变量的值,如需要调用变量name的值时,需要用$name的方式来得到变量的值
    \ 转义符,跟着\之后的特殊符号将失去特殊含义,变为普通字符,如\$将输出$符号,而不当作时变量引用

    变量:   变量是计算机内存的单元,其中存放的值可以改变,当shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中,每个变量有一个名字,所有很容易引用它,使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息

    变量设置规则:

           1. 变量名称可以由字母,数字和下划线组成,但是不能以数字开头

           2. 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值类型

           3.变量用等号连接值,等号左右两侧不能有空格

           4.变量的值如果有空格,需要使用单引号或双引号括起来

           5.在变量的值中,可以使用"\"转义符

           6.如果需要增加变量的值,那么可以进行变量值的叠加,不过变量需要用双引号包含“$变量名”或用${变量名}包含 

           7.如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令

           8.环境变量名建议大写,便于区分

    变量分类:

           1. 用户自定义变量

           2. 环境变量:这种变量中主要保存的是和系统操作环境相关的数据

           3. 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的

           4. 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

      本地变量(用户自定义变量):

    [root@zyf sh]# aa=123
    [root@zyf sh]# aa="$aa"456
    [root@zyf sh]# echo $aa
    123456
    [root@zyf sh]# aa=${aa}789
    [root@zyf sh]# echo $aa
    123456789
    [root@zyf sh]#
    #查看变量 :set 
    #删除变量 :unset 变量名
    
    

        环境变量:用户自定义变量只在当前shell中生效,而环境变量会在当前shell和这个shell所有子shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效  

        设置环境变量:export 变量名=变量值

        查询变量:env

        删除变量:unset 变量名

        系统常见环境变量:

          PATH:系统查找命令的路径

          PATH="$PATH":/root/sh : PATH变量叠加(临时生效,需要保存进相关的文件才能永久生效)    

          PS1:定义系统提示符的变量

    \d 显示日期,格式为“星期 月 日”
    \h 显示简写主机名。如默认主机名“localhost”
    \t

    显示24小时制时间,格式为“HH:MM:SS”

    \T 显示12小时制时间,格式为“HH:MM:SS”
    \A 显示24小时制时间,格式为“HH:MM”
    \u 显示当前用户名
    \w 显示当前所在目录的完整名称
    \W 显示当前所在目录的最后一个目录
    \# 指定的第几个命令
    \$ 提示符。如果是root用户会显示提示符为“#”,如果是普通瀛湖为显示提示符为“$”

    位置参数变量:

    位置参数变量 作用
    $n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
    $* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
    $@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
    $# 这个变量代表命令行中所有参数的个数
    [root@zyf sh]# vi canshu1.sh
    #!/bin/sh
    echo $0
    echo $1
    echo $2
    echo $3
    [root@zyf sh]# chmod 755 canshu1.sh 
    [root@zyf sh]# ./canshu1.sh 
    ./canshu1.sh
    [root@zyf sh]# ./canshu1.sh 11 22 33
    ./canshu1.sh
    11
    22
    33
    [root@zyf sh]# cat canshu1.sh 
    #!/bin/sh
    echo $0
    echo $1
    echo $2
    echo $3
    [root@zyf sh]# ./canshu1.sh 11 22 33 44
    ./canshu1.sh
    11
    22
    33
    [root@zyf sh]# vi canshu2.sh
    #!/bin/sh
    sum=$(($1+$2))
    echo $sum
    [root@zyf sh]# chmod 775 canshu2.sh 
    [root@zyf sh]# ./canshu2.sh 11 22
    33
    

    例子:*$与$@区别

    [root@zyf sh]# vi canshu3.sh
    for i in "$*"
    #$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
        do
            echo "The parameters is:$*"
        done
    x=1
    for y in "$@"
    #$@中每个参数都看成是独立的,所以“$@” 中有几个参数,就会循环几次
        do
            echo "The parameters$x is:$y"
            x=$(($x +1))
        done
    [root@zyf sh]# chmod 755 canshu3.sh 
    [root@zyf sh]# ./canshu3.sh 1 2 3 4
    The parameters is:1 2 3 4
    The parameters1 is:1
    The parameters2 is:2
    The parameters3 is:3
    The parameters4 is:4
    

     预定义变量

    预定义变量 作用
    $? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,有命令自己决定),则证明上一条命令执行不正确
    $$ 当前进程的进程号(PID)
    $! 后台运行的最后一个进程的进程号(PID)

    例子:

    [root@zyf sh]# vi canshu4.sh
    #!/bin/sh
    echo "The current process is $$"
    #输出当前进程的PID
    #这个PID就是variable.sh这个脚本执行时,生成的进程的PID
    find /root -name hello.sh &
    #使用find命令在root目录下查找hello.sh文件
    #符号&的意思是把命令放入后台执行
    echo "The last one Daemon process $!"
    [root@zyf sh]# chmod 755 canshu4.sh 
    [root@zyf sh]# ./canshu4.sh 
    The current process is 40514
    The last one Daenon process is 40515
    [root@zyf sh]# /root/.local/share/Trash/files/hello.sh
    

    接收键盘输入: read 【选项】【变量名】

    选项:

        -p “提示信息”:  在等待read输入时,输出提示信息

        -t 秒数:              read命令会一直等待用户输入,使用此选项可以指定等待时间

        -n 字符数:          read命令只接受指定的字符数,就会执行

        -s:                      隐藏输入的数据,适用于机密信息的输入

    例如:

    [root@zyf sh]# vim canshu5.sh
    #!/bin/sh
    read -t 30 -p "Please input your name: " name
    #提示“请输入行命” 并等待30秒,把用户的输入保存到变量name中
    echo "Name is $name "
    read -s -t 30 -p "Please enter your age: " age
    #年龄时隐私,所以我们用“-s” 选项来隐藏输入
    echo -e "\n"
    echo "Age is $age "
    read -n 1 -t 30 -p "Please select your gender[M/F]: " gender
    #使用 “-n 1” 选项只接收一个输入字符就会执行(都不用输入回车)
    echo -e "\n"
    echo "Sex is $gender" 
    [root@zyf sh]# chmod 755 canshu5.sh 
    [root@zyf sh]# ./canshu5.sh 
    Please input your name: zz
    Name is zz 
    Please enter your age: 
    
    Age is 18
    Please select your gender[M/F]: M
    
    Sex is M
    [root@zyf sh]# 
    
    
    

    Bash 运算符

      1. declare:声明变量类型

        语法:declare [+/-] [选项] 变量名

        选项:

          -: 给变量设定类型属性

         +: 取消变量的类型属性

         -i: 将变量声明为整数型(integer)

        -x: 将变量声明为环境变量

        -p: 显示指定变量的被声明的类型

     

      数值运算与运算符

        第一种数值运算方式

    [root@zyf sh]# aa=11
    [root@zyf sh]# declare -p aa
    declare -- aa="11"
    [root@zyf sh]# export aa
    [root@zyf sh]# declare -p aa
    declare -x aa="11"
    [root@zyf sh]# bb=22
    [root@zyf sh]# cc=$aa+$bb
    [root@zyf sh]# echo $cc
    11+22
    [root@zyf sh]# declare -i cc=$aa+$bb
    [root@zyf sh]# echo $cc
    33
    [root@zyf sh]# 

        第二种数值运算方式: expr 

    [root@zyf sh]# aa=11
    [root@zyf sh]# bb=22
    [root@zyf sh]# cc=$(expr $aa + $bb)
    #dd的值是aa和bb的和,注意"+"号左右两侧必须有空格
    [root@zyf sh]# echo $cc
    33
    [root@zyf sh]# 
    

        第三种数值运算方式: "$((运算式))"或 "$[运算式]"

    [root@zyf sh]# aa=11
    [root@zyf sh]# bb=22
    [root@zyf sh]# cc=$(($aa + $bb))
    [root@zyf sh]# dd=$[$aa+$bb]
    [root@zyf sh]# echo $cc
    33
    [root@zyf sh]# echo $dd
    33
    [root@zyf sh]# 
    

        运算符:  优先级越高,越先执行

    优先级 运算符 说明
    13 -.+ 单目负,单目正
    12 !,~

    逻辑非,按位取反或补码

    11 *./,% 乘,除,取模
    10 +,- 加减
    9 <<,>> 按位左移,按位右移
    8 <=,>=,<,> 小于等于,大于等于,小于,大于
    7 ==,!= 等于,不等于
    6 & 按位与
    5 ^ 按位异或
    4 | 按位或
    3 && 逻辑非
    2 || 逻辑或
    1 =,+=,-,=,*=,/=,%=,&=,^=,|=,<<=.>>= 赋值,运算且赋值

     

     

     

     

     

     

     

     

     

     

     

     

     

    例子:

    [root@zyf sh]# aa=$(((11+3)*3/2))
    #虽然乘除的优先级高于加,但是通过小括号可以调整运算优先级
    [root@zyf sh]# echo $aa
    21[root@zyf sh]# bb=$((11+3*3/2))
    [root@zyf sh]# echo $bb
    15
    [root@zyf sh]# cc=$((14%3))
    #14不能被3整除,余数为2
    [root@zyf sh]# echo $cc
    2
    [root@zyf sh]# dd=$((1&&0))
    #逻辑与运算只有两边都是1,与的结果才是1,否在与的结果是0
    [root@zyf sh]# echo $dd
    0
    [root@zyf sh]# 
    

    变量测试与内容替换:

    变量置换方式 变量y没有设置 变量y为空值 变量y设置值
    x=${y-新值} x=新值 x为空 x=$y
    x=${y:-新值} x=新值 x=新值 x=$y
    x=${y+新值} x为空 x=新值 x=新值
    x=${y:+新值} x为空 x为空 x=新值
    x=${y=新值}

    x=新值

    y=新值

    x为空

    y值不变

    x=$y

    y值不变

    x=${y:=新值}

    x=新值

    y=新值

    x=新值

    y=新值

    x=$y

    y值不变

    x=${y?新值} 新值输出到标准错误输出(就是屏幕) x为空 x=$y
    x=${y:?新值} 新值输出到标准错误输出 新值输出到标准错误输出 x=$y

     

     

     

     

     

     

     

     

     

    例子:

    [root@zyf sh]# unset a
    #删除变量a
    [root@zyf sh]# x=${a-new}
    #测试x=${y-新值}
    [root@zyf sh]# echo $x
    #因为变量a不存在,所以x=new
    new
    [root@zyf sh]# a=123
    #声明变量a并赋值
    [root@zyf sh]# x=${a-new}
    [root@zyf sh]# echo $x
    #因为变量a有值,所以x=a的值
    123
    [root@zyf sh]# a=""
    [root@zyf sh]# x=${a-new}
    [root@zyf sh]# echo $x
    #因为变量a为空,所以x也为空
    
    [root@zyf sh]#

     

    环境变量配置文件

      环境变量配置文件简介:

        1. source 命令:  语法: source  配置文件(. 配置文件): 强制更行配置文件使其重新加载生效,就不需要重启电脑了

        环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH,HISTSIZE,PS1,HOSTNAME等默认环境变量

      主要配置文件:

    1.     /etc/profile
    2.     /etc/profile.d/*.sh  
    3.     ~/.bash_profile
    4.     ~/.bashrc
    5.     /etc/bashrc

      注意:  只要是在etc下面的shell文件是对所有登录的用户都生效的 

                ~/是home目录,所以如果是root用户登录会读取root用户的家目录,但是当其他用户去登录的时候就不会去读取这个文件,那也就是.bash_profile和bashrc文件只对当前用户生效,哪个用户修改了对应文件就只对哪个用户生效,而且这两个文件是隐藏文件,所以用.开头

      环境变量配置文件作用

        

      1. /etc/profile的作用

    • USER变量:                             当前用户名
    • LOGNAME变量:                    登录用户名
    • MAIL变量:                              当前用户邮箱
    • PATH变量:                             环境变量
    • HOSTNAME变量:                  历史命令
    • HISTSIZE变量:                      默认历史命令条数    
    • umask:                                  系统默认权限(root用户是002)
    • 调用/etc/profile.d/*.sh文件    主要功能是定义当前用户的使用语言,和默认编码集

       2. ~/.bash_profile的作用

    •     调用了~/.bashrc文件
    •     再PATH变量后面加入了":$HOME/bin" 这个目录

       3. ~/.bashrc的作用

    •     定义了系统别名
    •     调用了/etc/bashrc文件

       4. /etc/bashrc的作用

    •     PS1变量 :                              提示符 
    •     umask:                                 默认权限
    •     PATH变量:                            环境变量   
    •     调用/etc/profile.d/*.sh文件

      注意: 重新定义的umask,PAHT和调用的文件主要是针对不需要用户密码切换的用户的配置

    其他配置文件和登录信息

    1. 注销时生效的环境变量配置文件

    ~/.bash_logout:  该文件默认是空的,如果每次登录想要清空历史命令啊,清空环境变量之类的一些命令就可以写在该文件中,写完之后每次注销登录的时候就会把这些命令执行一次

    2. 其他配置文件

    ~/bash_history: 历史命令保存文件

    3. Shell登录信息

    本地终端欢迎信息: /etc/issue

    转义符 作用
    \d 显示当前系统日期
    \s 显示操作系统名称
    \l 显示登录的终端号,这个比较常用
    \m 显示硬件体系结构,如i386,i686等
    \n 显示主机名
    \o 显示域名
    \r 显示内核版本
    \t 显示当前系统时间
    \u 显示当前登录用户的序列号 

    远程终端欢迎信息: /etc/issue.net

    • 转义符在/etc/issue.net文件中不能使用
    • 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入" Banner /etc/issue/net"行才能显示(记得重启ssh服务service sshd restart)

    登录后欢迎信息: /etc/motd

      不管是本地登录还是远程登录都可以显示此欢迎信息

     

    正则表达式

    1. 基础正则表达式

    1.正则表示式与通配符

    • 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep,awk,sed等命令可以支持正则表达式
    • 通配符用来匹配符合条件的文件名,通配符是完全匹配,ls,find,cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了

    2. 基础正则表达式

    元字符 作用
    * 前一个字符匹配0次或任意次
    . 匹配除了换行符外任意一个字符
    ^ 匹配行首,例如^hello会匹配以hello开头的行
    $ 匹配行尾,例如hello$会匹配以hello结尾的行
    []

    匹配中括号中指定的任意一个字符,只匹配一个字符

    例如:[aoeiu]匹配任意一个元音字母,[0-9]普配任意一个数字,[a-z][0-9]匹配小写字母和一个数字构成的两个字符

    [^] 匹配除中括号的字符意外的任意一个字符,例如[^0-9]匹配任意以为非数字的字符,[^a-z]匹配任意以为非小写字母的字符
    \ 转义符,用于取消特殊符号的含义
    \{n\} 表示其前面的字符恰好出现n次,例如:[0-9]\{4\}匹配4位数字,[1][3-8][0-9]\{9\}匹配手机号码
    \{n,\} 表示其前面的字符出现不小于n次,例如[0-9]\{2,\}表示两位及以上的数字
    \{n,m\} 表示其前面的字符至少出现n次,最多出现m次,例如[z-a]\{6,8\}匹配6到8位的小写字母

    grep: 在文件中提取符合条件的行

    测试文件:

     

    Your eyes are any hint of warm not for me.
    To look back, and saw one no longer young, never make public does not rise.
    
    As long as no death simply Fortunately
    One person you loved is not love
    Love you more than myself
    North of the city to the north is not to miss
    
    Youth is not a time of life, it is a state of mind
    
    Do not let dream just be your dream
    The man who has made up his mind to win will never say “impossible”.——baiBonapart Napoleon
    If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds

    测试: "*" 前一个字符匹配0次或任意多次

    #匹配所有内容,包括空白行
    [root@localhost test]# grep "a*" test1 
    Your eyes are any hint of warm not for me.
    To look back, and saw one no longer young, never make public does not rise.
    
    As long as no death simply Fortunately
    One person you loved is not love
    Love you more than myself
    North of the city to the north is not to miss
    
    Youth is not a time of life, it is a state of mind
    
    Do not let dream just be your dream
    The man who has made up his mind to win will never say “impossible”.——baiBonapart Napoleon
    If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds
    
    #匹配至少包含有一个a的行
    [root@localhost test]# grep "aa*" test1 
    Your eyes are any hint of warm not for me.
    To look back, and saw one no longer young, never make public does not rise.
    As long as no death simply Fortunately
    Love you more than myself
    Youth is not a time of life, it is a state of mind
    Do not let dream just be your dream
    The man who has made up his mind to win will never say “impossible”.——baiBonapart Napoleon
    If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds
    [root@localhost test]# 
    
    

    测试: "." 匹配除了换行符外任意一个字符

    #匹配在y和u这两个字母之间一定有一个字符的单词
    [root@localhost test]# grep "y.u" test1 
    To look back, and saw one no longer young, never make public does not rise.
    One person you loved is not love
    Love you more than myself
    Do not let dream just be your dream
    If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds
    #匹配在y和u字母之间有任意字符
    [root@localhost test]# grep "y.*u" test1 
    To look back, and saw one no longer young, never make public does not rise.
    As long as no death simply Fortunately
    One person you loved is not love
    Love you more than myself
    Do not let dream just be your dream
    If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds
    [root@localhost test]# 

    测试: "^" 匹配行首,"$" 匹配行尾

    #匹配以大写字母Y开头的行
    [root@localhost test]# grep "^Y" test1 
    Your eyes are any hint of warm not for me.
    Youth is not a time of life, it is a state of mind
    #匹配以小写字母y结尾的行
    [root@localhost test]# grep "y$" test1 
    As long as no death simply Fortunately
    #匹配空白行
    [root@localhost test]# grep "^$" test1 
    
    
    
    [root@localhost test]#

    测试: "[]" 匹配中括号中指定的任意一个字符

    #匹配y和u中要不是o,s,e,g,u的字母
    [root@localhost test]# grep "y[osegw]u" test1 
    To look back, and saw one no longer young, never make public does not rise.
    One person you loved is not love
    Love you more than myself
    Do not let dream just be your dream
    If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds
    [root@localhost test]# 

    测试: "\" 转义符

    #匹配以.结尾的行
    [root@localhost test]# grep "\.$" test1 
    Your eyes are any hint of warm not for me.
    To look back, and saw one no longer young, never make public does not rise.
    [root@localhost test]# 

    测试: "\{n\}" 表示前面的字符出现n次

    #匹配字母o出现2次的字符串
    [root@localhost test]# grep "o\{2\}" test1 
    To look back, and saw one no longer young, never make public does not rise.
    [root@localhost test]#

    测试: "\{n,m\}" 表示前面的字符最少出现n次,最多出现m次

    #匹配字母o最少出现1次或2次的字符串
    [root@localhost test]# grep "o\{1,2\}" test1 
    Your eyes are any hint of warm not for me.
    To look back, and saw one no longer young, never make public does not rise.
    As long as no death simply Fortunately
    One person you loved is not love
    Love you more than myself
    North of the city to the north is not to miss
    Youth is not a time of life, it is a state of mind
    Do not let dream just be your dream
    The man who has made up his mind to win will never say “impossible”.——baiBonapart Napoleon
    If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds
    [root@localhost test]# 

     

    2. 字符截取命令

    1. cut 字段提取命令 :

      语法:   cut [选项] 文件名

      选项:   -f  列号:       提取第几列

                 -d 分隔符:    按照指定分隔符分割列

    测试文件:

    [root@localhost test]# vim test2
    ID    Name    Gender   Mark
    1     Lilin   W        99
    2     Xiaoxi  M        88
    3     Ganyu   W        77
    

    测试: cut

    #提取第二列
    [root@localhost test]# cut -f 2 test2
    Name
    Lilin
    Xiaoxi
    Ganyu
    #提取第二列和第三列
    [root@localhost test]# cut -f 2,3 test2
    Name	Gender
    Lilin	W
    Xiaoxi	M
    Ganyu	M
    [root@localhost test]# 

    注意: cut命令的缺陷,不能space来分列,只能识别tab制表符或具体的分割符号

     

    2. printf命令: 格式化输出命令

      语法: printf '输出类型输出格式' 输出内容

      输出类型: 

        %ns:           输出字符串,n是数字指代输出几个字符

        %ni:            输出整数,n是数值指代输出几个数字

        %m.nf:        输出浮点数,m和n是数字,指代输出的整数位数和小数位数,如%8.2f代表共输出8位数,其中2位是小数,6位是整数

      输出格式:

        \a:               输出警告声音

        \b:               输出退格键,也就是Backspace键

        \f:                清除屏幕

        \n:               换行

        \r:                回车,也就是Enter键

        \t:                水平输出退格键,也就是Tab键

        \v:               垂直输出退格键,也就是Tab键

    测试:

    [root@localhost test]# printf %s 1 2 3 4 5 6
    #输出字符串123456
    123456[root@localhost test]# printf %s %s %s 1 2 3 4 5 6
    #想输出1 2 3 三个字符串为一组,结果printf把从第二个%s开始后面的内容都当成了一个字符串输出了
    %s%s123456[root@localhost test]# printf '%s %s %s' 1 2 3 4 5 6
    #输出字符串3个字符串为一组输出,但是两组字符串没有换行符
    1 2 34 5 6[root@localhost test]# printf '%s %s %s\n' 1 2 3 4 5 6
    #输出字符串3个字符串为一组并换行输出
    1 2 3
    4 5 6
    [root@localhost test]# vim student.txt
    ID	 Name	 PHP	 Linux	 MySQL	 Average
    1	 Lilin	 88	 99	 77	 66
    2	 Ganyu	 67	 78	 89	 90
    3	 Yungang 66	 77	 88	 99
    [root@localhost test]# printf '%s\t %s\t %s\t %s\t %s\t %s\n' $(cat student.txt) 
    ID	 Name	 PHP	 Linux	 MySQL	 Average
    1	 Lilin	 88	 99	 77	 66
    2	 Ganyu	 67	 78	 89	 90
    3	 Yungang	 66	 77	 88	 99
    [root@localhost test]# 
    

      在awk命令的输出中支持print和printf命令

    •   print:   print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
    •   printf:  printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符

     

    3. awk命令

      语法:         awk '条件1{动作1} 条件2{动作2} .......' 文件名

        条件(Pattern):

          一般使用关系表达式作为条件

          x > 10          判断变量x是否大于10

          x >= 10        大于等于

          x <= 10        小于等于

        动作(Action):

          格式化输出

          流程控制语句

      测试:

    [root@localhost test]# awk '{printf $2 "\t" $6 "\n" }' student.txt
    Name	Average
    Lilin	66
    Ganyu	90
    Yungang	99
    #获取sda1的根分区占用率
    [root@localhost test]# df -h
    Filesystem               Size  Used Avail Use% Mounted on
    devtmpfs                 894M     0  894M   0% /dev
    tmpfs                    910M     0  910M   0% /dev/shm
    tmpfs                    910M   11M  900M   2% /run
    tmpfs                    910M     0  910M   0% /sys/fs/cgroup
    /dev/mapper/centos-root   17G   14G  3.9G  78% /
    /dev/sda1               1014M  185M  830M  19% /boot
    tmpfs                    182M   36K  182M   1% /run/user/0
    /dev/sr0                 4.5G  4.5G     0 100% /run/media/root/CentOS 7 x86_64
    [root@localhost test]# df -h | grep sda1
    /dev/sda1               1014M  185M  830M  19% /boot
    [root@localhost test]# df -h | grep sda1 | awk '{print $5}'
    19%
    [root@localhost test]# df -h | grep sda1 | awk '{print $5}' | cut -d "%" -f1
    19
    [root@localhost test]# 
    #BEGIN: 在所有命令执行之前先执行该行命令
    #因为awk是先读取数据在进行截取,所以第一行数据就没有进行处理
    [root@localhost ~]# awk '{FS=":"}{print $1 "\t" $3}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash	
    bin	1
    daemon	2
    adm	3
    lp	4
    sync	5
    #加上BEGIN就能解决
    [root@localhost ~]# awk 'BEGIN{FS=":"}{print $1 "\t" $3}' /etc/passwd
    root	0
    bin	1
    daemon	2
    adm	3
    lp	4
    sync	5
    

     

    4. sed命令

        sed是一种几乎包括所有unix平台(包括Linux)的轻量级流编辑器,sed主要是用来将数据进行选取,替换,删除,新增的命令

      语法: sed [选项]-'[动作]'- 文件名

      选项:

        -n:                 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕

        -e:                 允许对输入数据应用多条sed命令编辑,多条命令之间由;分割

        -i:                  用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

      动作:

       a \:                追加,在当前行后添加一行或多行,添加多行时,除最后一行外,每行末尾都需要用"\"代表数据未完结

       c \:                行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用"\" 代表数据未完结

       i \:                 插入,在当前行前插入一行或多行,插入多行时,除最后一行外,每行末尾需要用"\"代表数据未完结

       d:                  删除,删除指定的行

       p:                 打印,输出指定的行

       s:                 字串替换,用一个字符串替换另外一个字符串,格式为"行范围s/旧字串/新字串/g"(和vim中的替换格式类似)

    测试:

    [root@localhost ~]# sed '2p' student.txt 
    ID	 Name	 PHP	 Linux	 MySQL	 Average
    1	 Lilin	 88	 99	 77	 66
    1	 Lilin	 88	 99	 77	 66
    2	 Ganyu	 67	 78	 89	 90
    3	 Yungang 66	 77	 88	 99
    [root@localhost ~]# sed -n '2p' student.txt 
    1	 Lilin	 88	 99	 77	 66
    [root@localhost ~]# df -h | sed -n '2p'
    devtmpfs        895M     0  895M   0% /dev
    [root@localhost ~]# sed '2,4d' student.txt 
    ID	 Name	 PHP	 Linux	 MySQL	 Average
    [root@localhost ~]# sed '2,3d' student.txt 
    ID	 Name	 PHP	 Linux	 MySQL	 Average
    3	 Yungang 66	 77	 88	 99
    [root@localhost ~]# cat student.txt 
    ID	 Name	 PHP	 Linux	 MySQL	 Average
    1	 Lilin	 88	 99	 77	 66
    2	 Ganyu	 67	 78	 89	 90
    3	 Yungang 66	 77	 88	 99
    [root@localhost ~]# sed '2a zuobi' student.txt 
    ID	 Name	 PHP	 Linux	 MySQL	 Average
    1	 Lilin	 88	 99	 77	 66
    zuobi
    2	 Ganyu	 67	 78	 89	 90
    3	 Yungang 66	 77	 88	 99
    [root@localhost ~]# sed '2i xixi \
    dada' student.txt
    ID	 Name	 PHP	 Linux	 MySQL	 Average
    xixi 
    dada
    1	 Lilin	 88	 99	 77	 66
    2	 Ganyu	 67	 78	 89	 90
    3	 Yungang 66	 77	 88	 99
    [root@localhost ~]# sed '4c no person' student.txt 
    ID	 Name	 PHP	 Linux	 MySQL	 Average
    1	 Lilin	 88	 99	 77	 66
    2	 Ganyu	 67	 78	 89	 90
    no person
    [root@localhost ~]# sed '4s/77/55/g' student.txt 
    ID	 Name	 PHP	 Linux	 MySQL	 Average
    1	 Lilin	 88	 99	 77	 66
    2	 Ganyu	 67	 78	 89	 90
    3	 Yungang 66	 55	 88	 99
    [root@localhost ~]#
    
    
    

     

    3. 字符处理命令

    1. 排序命令sort : 

      语法:                      sort [选项] 文件名

      选项:

        -f:                         忽略大小写

        -n:                        以数值型进行排序,默认使用字符串型排序

        -r:                         反向排序

        -t:                         指定分隔符,默认分隔符时制表符

        -k n[,m]:               按照指定的字段范围排序,从第n字段开始,m字段结束(默认到行尾)

     

    2. 统计命令wc: 

        语法:                   wc [选项] 文件名

        选项:

        -l:                        只统计行数

        -w:                      只统计单词数

        -m:                     只统计字符数

    测试:

    [root@localhost ~]# wc /etc/passwd
      46   93 2431 /etc/passwd
    [root@localhost ~]# wc -l /etc/passwd
    46 /etc/passwd
    [root@localhost ~]# 
    

     

    4. 条件判断

    1. 按照文件类型进行判断

    测试选项 作用
    -b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
    -c 文件 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
    -d 文件 判断该文件是否存在,并且是否为目录文件(是目录文件为真)
    -e 文件 判断该文件是否存在(存在为真)
    -f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真)
    -L 文件 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
    -p 文件 判断该文件是否存在,并且是否为管道文件(是管道文件为真)
    -s 文件 判断该文件是否存在,并且是否为非空(非空为真)
    -S 文件 判断该文件是否存在,并且是否为套接文件(是套接文件为真)

     

     

     

     

     

     

     

     

     

    测试:
     

    #判断是否是否存在
    [root@localhost ~]# test -e student.txt 
    #判断上一条命令执行是否正确,正确返回0,不正确返回其他数值
    [root@localhost ~]# echo $?
    0
    [root@localhost ~]# test -e student.txtsss
    [root@localhost ~]# echo $?
    1
    #判断是否是否存在
    [root@localhost ~]# [ -e student.txt ]
    [root@localhost ~]# echo $?
    0
    [root@localhost ~]# [ -e student.txtss ]
    [root@localhost ~]# echo $?
    1
    #判断student.txt是否存在,并且是目录,是则输出 yes,不是则输出no
    [root@localhost ~]# [ -d student.txt ] && echo 'yes' || echo 'no'
    no
    

     

    2. 按照文件权限进行判断

    测试选项 作用
    -r 文件 判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
    -w 文件 判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
    -x 文件 判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
    -u 文件 判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)
    -g 文件 判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)
    -k 文件 判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)

     

     

     

     

     

     

     

    3. 两个文件之间进行比较

    测试选项 作用
    文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新(如果新则为真)
    文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧(如果旧则为真)
    文件1 -ef 文件2  判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件,这个判断用于判断硬链接是很好的方法

    测试:

    [root@localhost ~]# ln /root/student.txt /tmp/stu.txt
    [root@localhost ~]# cd /tmp/
    [root@localhost tmp]# ll
    total 80
    drwxr-xr-x. 2 root root    32 Jun 29 15:07 hsperfdata_root
    drwx------  2 root root    24 Aug 12 15:32 ssh-hfV0RNAlbUB3
    -rw-r--r--  2 root root   113 Aug 12 15:35 stu.txt
    drwx------  3 root root    17 Aug 12 15:29 systemd-private-84b1b895fd3e4659a6751b2a2187561a-bolt.service-GbstGq
    drwx------  3 root root    17 Aug 12 15:30 systemd-private-84b1b895fd3e4659a6751b2a2187561a-colord.service-H0aumN
    drwx------  3 root root    17 Aug 12 15:27 systemd-private-84b1b895fd3e4659a6751b2a2187561a-cups.service-A0jw9z
    drwx------  3 root root    17 Aug 12 15:32 systemd-private-84b1b895fd3e4659a6751b2a2187561a-fwupd.service-hY312B
    drwx------  3 root root    17 Aug 12 15:27 systemd-private-84b1b895fd3e4659a6751b2a2187561a-rtkit-daemon.service-sf9wMd
    drwx------. 2 root root     6 Aug 12 15:35 tracker-extract-files.0
    drwx------  2 root root     6 Aug 12 15:27 vmware-root_599-4022243158
    -rw-------  1 root root 76622 Aug 11 09:24 yum_save_tx.2020-08-11.09-24.j2Vbor.yumtx
    [root@localhost tmp]# [ /root/student.txt -ef /tmp/stu.txt ] && echo 'yes' || echo 'no'
    yes
    [root@localhost tmp]# 

    4. 两个整数之间比较

    测试选项 作用
    整数1 -eq 整数2 判断整数1是否和整数2相等(相等为真)
    整数1 -ne 整数2  判断整数1和整数2不相等(不相等为真)
    整数1 -gt 整数2 判断整数1是否大于整数2(大于为真)
    整数1 -lt 整数2  判断整数1是否小于整数2(小于为真)
    整数1 -ge 整数2 判断整数1是否大于等于整数2(大于等于为真)
    整数1 -le  整数2 判断整数1是否小于等于整数2(小于等于为真)

     

    5. 字符串的判断

    测试选项 作用
    -z 字符串 判断字符串是否为空(为空反返回真)
    -n 字符串 判断字符串是否为非空(非空返回真)
    字串1 == 字串2 判断字符串1是否和字符串2相等(相等返回真)
    字串1 != 字串2 判断字符串1是否和字符串2不相等(不相等返回真)

    6. 多重条件判断

    测试选项 作用
    判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终结果为真
    判断1 -o 判断2 逻辑或,判断1和判断2有一个成立,最终结果为真
    ! 判断 逻辑非,是原始的判断取反

     

    5. 流程控制

    1. if语句

    1.1 单分支if条件语句

    语法:  if [ 条件判断式 ]:then

                    程序

              fi

              或者

              if [ 条件判断式 ]

                    then

                           程序

             fi

    单分支条件语句需要注意的几个点

    • if语句使用fi结尾,和一般语言使用大括号结尾不同
    • [ 条件判断式 ] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格
    • then后面跟符合条件之后执行的程序,可以放在[]之后,用"; "分割,也可以换行写入,就不需要"; " 了

    样例: 判断分区使用率

    [root@localhost ~]# cat test1.sh 
    #! /bin/sh
    #统计根分区使用率,如果内存占用率达到80%就报警
    #把根分区使用率作为变量值赋予变量rate
    rate=$(df -h | grep '/dev/sda3' | awk '{print $5}' | cut -d "%" -f1)
    
    if [ $rate -ge 80 ]; then
    	echo "Warning1 /dev/sda3 is full!!"
    fi
    

    1.2 多分支if条件语句

    语法: if [ 条件判断式 } 

                 then

                    条件成立时,执行得程序

                 else

                    条件不成立时,执行得另一个程序

             fi

    样例: 备份MySQL数据库

    [root@localhost sh]# vim test2.sh 
    #! /bin/bash
    #备份MySQL数据库
    #同步系统时间
    ntpdate asia.pool.ntp.org &>/dev/null
    #把当前系统时间安装'年月日'格式赋予变量date
    date=$(date +%y%m%d)
    #统计MySQL数据库得大小,并把大小赋予size变量
    size=$(du -sh /var/lib/mysql)
    #判断临时文件dbbak是否存在
    if [ -d /tmp/dbbak ]
            then
                    #如果存在则将date变量输出,并写入临时文件dbinfo.txt文件中,以覆盖得方式写入
                    echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
                    #将备份数据大小,以追加得方式写入dbinfo.txt文件中
                    echo "Date size : $size!" >> /tmp/dbbak/dbinfo.txt
                    cd /tmp/dbbak
                    #将 MySQL目录和临时文件打包
                    # &>/dev/null 是将所有得输出内容都丢入回收站
                    tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &> /de
    v/null
                    #删除临时文件
                    rm -rf /tmp/dbbak/dbinfo.txt
            else
                    # 创建临时文件目录
                    mkdir /tmp/dbbak
                    # 将date变量输出并写入临时文件dbinfo.txt文件中,以覆盖得方式写入
                    echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
                    # 将size变量输出并写入临时文件dbinfo.txt文件中,以追加方式写入
                    echo "Date size : $size" >> /tmp/dbbak.dbinfo.txt
                    cd /tmp/dbbak
                    # 将MySQL目录和临时文件打包,以日期为名字是为了防止文件被覆盖
                    tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev
    /null
                    #删除临时文件
                    rm -rf /tmp/dbbak/dbinfo.txt
    fi
    

    样例: 判断apache是否启动

     

     

     

     

    2. case语句

     

     

    3. for循环

     

     

    4. while循环

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

        

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • shell命令行小技巧

    2019-07-20 23:12:45
    我们都知道在shell脚本中,可以在一条命令行里连续书写多条执行命令,仅需用分号;隔开即可,那进一步思考是否可以直接在shell控制台使用呢,小试一下果然可以。举例如下: [root@dev ~]# cd ~;cd consume-service...

    今天在写代码的时候,突然灵光一现,进入了如下思维逻辑:

    我们都知道在shell脚本中,可以在一条命令行里连续书写多条执行命令,仅需用分号;隔开即可,那进一步思考是否可以直接在shell控制台使用呢,小试一下果然可以。举例如下:

    [root@dev ~]# cd ~;cd consume-service
    [root@dev ~/consume-service]# 

     

    展开全文
  • SHELL基本知识及常用命令

    万次阅读 2018-06-25 14:51:32
    一、shell基本知识 1. 什么是shell shell shell也是操作系统中的一个软件,它包在 linux 内核的外面,为用户和内核之间的交互提供了一个接口,系统中的命令用 shell 去解释 shell 接收系统回应的输出并...
  • shell&&终端常用快捷键

    2018-09-15 11:53:11
    复制(粘贴到windows中):选择后,压下选择鼠标左键复制 , 粘贴到终端:选择后,ctrl + 压下鼠标滚轮
  • 【Linux常用命令】

    2020-08-06 09:39:20
    一、基本命令 作者:Demon_gu 出自:...1.1 关机和重启 关机 shutdown -h now 立刻关机 shutdown -h 5 5分钟后关机 poweroff 立刻关机 重启 shutdown -r now 立刻重启 shutdown -r 5 5分钟后重启 ...–
  • shell

    万次阅读 多人点赞 2019-09-16 20:22:38
    shell 什么是shell: 现在我们使用的操作系统(Windows、Mac OS、Android、iOS等)都是带图形界面的,简单直观,容易上手,对专业用户(程序员、网管等)和普通用户(家庭主妇、老年人等)都非常适用;计算机的普及...
  • 在sed中引入shell变量的四种方法

    万次阅读 2017-03-15 10:06:29
    今天在写一个脚本遇到问题,----需要在sed中引入shell变量,在网上搜了变天才找到,经过测试 这四种方法都可用,在这里跟大家分享下,=---同时谢谢netman大哥,前辈就是前辈哈哈 1.eval sed ’s/$a/$b/’ ...
  • 介绍下Shell中的${}、##和%%使用范例,本文给出了不同情况下得到的结果。假设定义了一个变量为:代码如下:file=/dir1/dir2/dir3/my.file.txt可以用${ }分别替换得到不同的值:${file#*/}:删掉第一个 / 及其左边的...
  • shell的本质

    千次阅读 2018-09-22 17:00:36
    shell 摘要:shell是什么语言?shell语言的本质“Shell是Linux/Unix的一个外壳,你理解成衣服也行。它负责外界与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,内核是...
  • linux下的shell运算(加、减、乘、除)

    万次阅读 多人点赞 2020-04-22 15:15:28
    ((i=$j+$k)) 等价于 i=`expr $j + $k` ((i=$j-$k)) 等价于 i=`expr $j -$k` ((i=$j*$k)) 等价于 i=`expr $j \*$k` ((i=$j/$k)) 等价于 i=`expr $j /$k` Let expressions执行一个或多个表达式。...
  • linux反弹shell的原理

    万次阅读 2020-08-24 11:30:15
    反弹shell命令: bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 bash -i > /dev/tcp/ip/port 0>&1 2>&1 利用nc反弹shell: nc -lvvp 12345 -t -e /bin/bash 原理 bash -i > /dev/tcp...
  • Linux中编写Shell脚本

    万次阅读 多人点赞 2020-02-04 17:02:12
    Shell Shell脚本的执行 Shell脚本编写规范 Shell 中的变量 变量的算术运算 双小括号 (()) 数值运算命令的用法 let 运算命令的用法 expr 命令的用法 br 命令的用法 $[]符号的运算示例 Shell脚本的条件测试 ...
  • Android中常用的adb shell命令

    万次阅读 2020-09-09 14:33:19
    注意事项:这里写的命令,网页会...android 常用shell命令记录下来备忘设置adb环境变量其实就是将adb.exe的路径放到Path中,目的是cmd直接可以使用adb命令 比如我的adb.exe路径G:\tools\adt-bundle\sdk\platform-tools
  • 漏洞概况 ...虽然该漏洞利用需要有几个前提条件,但鉴于国内使用ThinkPHP框架的...由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞。 漏洞危害 攻击者可通过该漏洞获取...
  • jenkins运行shell

    万次阅读 2019-01-29 12:16:07
    jenkins在本机上构建项目时运行Shell,有2种方法 1 Excute Shell 此时会新建用户jenkins登录 但是有些命令不一定有权限,比如docker images: 报错: Got permission denied while trying to connect to the ...
1 2 3 4 5 ... 20
收藏数 3,440,617
精华内容 1,376,246
关键字:

shell