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(命令字符串[,窗口类型])
收起全文
精华内容
参与话题
问答
  • 收藏!一篇教会你写90%的shell脚本!

    万次阅读 多人点赞 2019-09-06 18:18:36
    还不会写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——你只需要了解这么多

    万次阅读 多人点赞 2018-06-30 20:34:09
    一.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编程

    千人学习 2018-07-13 14:50:33
    从没上过课的学渣 学了还不会的学弱 想学懂的学霸 10小时全掌握Linux下shell编程 工作、面试全没问题。
  • Shell是一个功能相当强大的编程语言,易编写、易调试、灵活性强。Shell可以帮助我们来管理大数据集群,提高开发效率。 本课程详细讲解:Shell解析器、变量、运算符、条件判断、流程控制、函数、cut、sed、awk...
  • shell脚本精简教程

    万人学习 2016-12-19 14:54:59
    详细的介绍shell脚本的使用。
  • SHELL的一些见解

    2020-11-08 21:54:23
    一、认识shellshell脚本 1.shell——命令解释器,其主要功能是负责解释和执行命令行上键入的内容. 2.shell也提供了完善的编程能力. 3.流行的shell有多种,如Bash、Tcsh、Ksh等. 4.用户–>shell–>内核–>...

    一、认识shell及shell脚本

    1.shell——命令解释器,其主要功能是负责解释和执行命令行上键入的内容.

    2.shell也提供了完善的编程能力.

    3.流行的shell有多种,如Bash、Tcsh、Ksh等.

    4.用户–>shell–>内核–>硬件
    5.shell script 就像是早期批处理文件,最简单的功能就是将多条指令汇整写在一起,只需执行一次就可以轻松处理复杂的动作。
    shell脚本实质上就是一个文本文件,内容是多条命令和变量通过控制语句结合在一起来完成特定的功能,因此编辑shell脚本可以通过vim来实现。

    二、Bash的重要功能

    1.命令和补全
    2.命令历史记录功能
    3.命令别名设置功能
    4.通配符功能
    5.作业控制、前后台控制

    三、SHELL

    1.shell脚本是按行解释的,每个脚本的第一行总是以#!/bin/bash开头
    2.在shell脚本中, 以“#”开头的行表示注释。shell将忽略对该行的处理,即不进行解释、显示和执行
    3.反引号括起来的字符串被shell解释为命令
    4.可使用declare指令来声明变量并设置变量
    5.清除变量,使用“unset”命令将其清除
    6.shift num 前移(从左往右).

    四、环境变量

    在用户登录时,Linux系统会自动设置一些变量,这些变量的值决定了用户的工作环境和外观,因此称为环境变量.
    常用环境变量
    1.HOSTNAME:代表主机名称;
    2.SHELL:当前环境下使用的shell程序,如果是bash的话,默认是/bin/bash;
    3.HISTSIZE:记录曾经执行过的历史命令条数;
    4.USER:用户的名称;
    5.ENV:用户所用的个性化环境设置文件的读取文件;
    6.HOME:代表用户的家目录,很多程序都可能会用到这个变量的值;
    7.MAIL:当使用mail命令收信时,系统会去读取的邮件信箱文件;
    8.PATH:执行文件搜索的路径。目录之间以冒号(:)分割,顺序很重要,决定查询顺序;
    9.PWD:当前工作目录;
    10.SHLVL环境变量:SHELL的层数.
    显示环境变量 # echo $变量名

    五、特殊变量

    $ #:传递到shell脚本的参数个数.
    $ * :以一个单字符串显示所有向脚本传递的参数.
    $ $:脚本运行的当前进程ID号.
    $ !:后台运行的最后一个进程的进程ID号.
    $ @:使用时每个参数加引号.
    $ -:显示shell使用的当前选项,与set命令功能相同.
    $ ?:显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误.

    六、元字符

    元字符:具有特殊的含义与作用,无法像普通字符那样使用它们,如果想把它们用作普通字符(比如说在echo语句中)就需要用一个反斜杠对它们进行转换.
    当然也可以使用单引号“’”将元字符或者含有元字符的变量字符串括起来,同样可以达到相同的目的.

    元字符 作用
    $ 取变量值
    ! 取历史指令
    * N个字符占位符
    ? 1个字符占位符
    & 保证指令在后台执行
    ( ) 在子shell中执行一组指令
    \ 禁用元字符,就是转义符
    [ ] 含义有多种:占位,条件测试
    ~ 用户主目录
    | 管道符号
    { } 占位符号,一组字符

    七、输入输出重定向

    1. 输入重定向 < 文件名
    2. 标准输出重定向:[1]> >>
      标准错误重定向 2>
    3. 指定文件描述符的输出重定向
      文件描述符1>&文件描述符2
      1 第一条:标准输出
      2 第二条:标准出错
      作用:将文件描述符1的输出与文件描述符2的输出结合输出到文件描述符2中

    八、编写一个shell脚本的基本步骤

    1. 打开vim(gedit图形窗口)等文本编辑器,准备输入脚本内容;
    2. 添加shell定义语句,使linux操作系统知道用户使用哪一种shell语言;
    3. 编写shell命令脚本程序;
    4. 保存命令(vim的话“:wq”)脚本程序并退出;
    5. 使用“chmod u+x”命令来修改这个脚本文件的权限使它可以执行;
    6. 终端提示符后输入“./ScriptName”(or bash ScriptName)来执行该脚本;
    7. 如执行错误进行必要调试,转步骤4)执行.

    九、shell脚本调试方法

    参数 作用
    -n 读一遍脚本中的命令但不执行,用于检查脚本中的语法错误
    -v 一边执行脚本,一边将执行过的脚本命令打印到标准错误输出
    -x 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来
    展开全文
  • 1|shell

    2020-11-22 22:30:46
    01.shell介绍 用法:#ls -lh 路径 含义:列出指定路径下的所有文件/文件夹的名称,以列表的形式并且显示文档大小的时候以可读性较高的形式显示 Cat指令 语法:#cat 文件的路径 作用1:cat可以直接打开一个文件的...

    01.shell介绍

    1|
    在这里插入图片描述
    用法:#ls -lh 路径
    含义:列出指定路径下的所有文件/文件夹的名称,以列表的形式并且显示文档大小的时候以可读性较高的形式显示
    Cat指令
    语法:#cat 文件的路径
    作用1:cat可以直接打开一个文件的功能。
    在这里插入图片描述

    在这里插入图片描述

    用户打开终端的时会自动打开一个shell
    在这里插入图片描述

    02.shell 脚本

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    03.shell 脚本基本写法

    在这里插入图片描述
    在这里插入图片描述

    04.shell 脚本的执行方式

    在这里插入图片描述
    first_shell.sh:
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    指令:rm
    作用:移除/删除文档
    语法:#rm 选项 需要移除的文档路径
    注意:删除一个目录的时候需要递归删除,并且一般也不需要删除确认询问,所以移除目录的时候一般需要使用-rf选项

    mkdir命令(make directory,创建目录)
    语法:#mkdir 路径[路径:可以是文件夹名称也可以是包含名称的一个完整路径]

    cp指令(copy,复制)
    指令:cp
    作用:复制文件/文件夹到指定的位置
    语法:#cp 被复制的文档路径 文档被复制到的路径
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    05.变量的定义

    在这里插入图片描述
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/202011222024在这里插入图片描述

    在这里插入图片描述

    06.变量定义规则

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    07.变量定义的方式

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    交互式定义变量read(让用户自己输入)

    在这里插入图片描述
    read [可选项] 变量名

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    09.交互式定义变量 read(变量来自文件 )

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    010.定义有类型变量

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    env:查询环境变量
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • shellshell中的%% ##

    2019-10-14 19:18:30
    假设定义了一个变量为: 代码如下: file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值: ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:删掉最后一个 / ...
  • shell-#!

    2019-09-20 16:29:06
    shell执行一个程序时,会要求UNIX内核启动一个新的进程,以便在该进程里执行所指定的程序。 当系统只有一个shell时,退回到/bin/sh 的机制非常方便,但现行的UNIX系统都会拥有好几个shell,此时就需要一种方式,...
  • shell

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

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

    万次阅读 2014-11-05 15:29:59
    shell中有许多奇特的语法: 比如有以下一段脚本; #!/bin/sh files=`find -name *.conifg` for i in $files do  name=${i#*/}  dir=${name%/*} done name和dir都代表什么呢? 假如 i=this/is/a/path.config ...
  • shell脚本--sed的用法

    万次阅读 多人点赞 2018-05-17 01:04:27
    sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳...本文主要介绍sed的一些基本用法,并通过shell脚本演示sed的使用实例。 1.sed的使用方法,调用sed 命令的语法有两种: 一.在命令...
  • Linux中编写Shell脚本

    万次阅读 多人点赞 2018-10-08 11:22:35
    Shell脚本的执行 Shell脚本编写规范 Shell 中的变量 变量的算术运算 双小括号 (()) 数值运算命令的用法 let 运算命令的用法 expr 命令的用法 br 命令的用法 $[]符号的运算示例 Shell脚本的条件测试 几种...
  • IDEA中编写并运行shell脚本

    万次阅读 多人点赞 2018-07-31 09:25:37
    IEDA中的bashsupport插件支持在IDEA中编写shell脚本文件,有友好的代码格式,支持自动补全,检查错误,并且配置完之后,还可以在IEDA中直接运行shell脚本。下面将一步一步演示插件的安装和配置。 打开IEDA,安装...
  • Shell脚本(一)

    万次阅读 多人点赞 2018-07-30 08:44:01
    20.1 什么是Shell脚本 shell脚本并不能作为正式的编程语言,因为它是在linux的shell中运行的,所以称为shell脚本。事实上,shell脚本就是一些命令的集合。 假如完成某个需求需要一口气输入10条命令,对于简单的命令...
  • 以Linux系统为例,linux系统里面有很多个命令,脚本可以是一个或者多个命令的集合,通过运行...shell与批处理的比较:Linux环境下有个脚本语言叫做shell,一般的,shell脚本文件以.sh结尾,.sh并没有什么实际作用...
  • Shell脚本编写实战

    千人学习 2017-10-23 16:55:25
    根据实际的案例讲解怎么编写Shell脚本,在什么场景下编写为讲解导向。 课程内容如下: 1.编写Shell脚本注意事项与编写打印字体颜色函数 2.批量创建用户 3.监控主机存活状态 4.监控CPU、内存、硬盘和网卡流量...
  • shell脚本基本语法

    千次阅读 2018-08-24 18:06:59
    终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要。下面笔者就带你正式进入shell脚本的世界吧。 到现在为止,你明白什么是shell...
  • shell脚本之shell内部变量和环境变量

    万次阅读 2018-06-16 10:24:28
    这篇博客介绍:1、部分常用的内部变量2、环境变量变量的分类可以参考:点击打开链接1、部分常用的内部变量: ⑴ #  说明:$#变量是命令行参数或位置参数的数量 ⑵ -  说明:$-变量是传递给shell脚本的执行标志 ...
  • 【Linux】Shell脚本学习总结篇

    万次阅读 多人点赞 2017-06-11 17:24:31
    【Linux】Shell脚本学习总结篇shell学习分为下面3个部分: shell基本命令回顾 shell基本语法学习 awk/sed 工具学习 关于shell的介绍之类的在这里不做赘述!shell基本命令回顾1.1 最基础的常用命令(注:命令选项直接...
  • 现在有两个shell脚本A和B,用A脚本去调用B脚本,B脚本中有一条将程序放到后台执行的语句。两脚本大体内容如下: A脚本: #!/bin/bash source /etc/profile source ~/.bash_profile B B脚本: #!/bin/bash ...
  • 脚本调用: 先来说一下主要以下有几种方式: fork: 如果脚本有执行权限的话,path/to/foo.sh。...新开启子shell,需要在父shell定义环境变量的变量子shell才可以使用可以继承环境变量。在脚本中定义环境...
  • 一个for循环实现一个目录下的文件和目录遍历,很实用[root@localhost shell_order]# cat test27.sh #!/bin/bash #print the directory and file for file in /home/hustyangju/* do if [ -d "$file" ] then echo...
  • Shell 脚本中调用另一个 Shell 脚本的三种方式

    万次阅读 多人点赞 2017-07-28 23:38:09
    先来说一下主要以下有几种方式: ...forkfork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用 foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会
  • 70个经典的 Shell 脚本

    万次阅读 多人点赞 2018-08-30 13:29:59
    阿里Linux Shell脚本面试25个经典问答 分享70个经典的 Shell 脚本面试题与答案     1) 如何向脚本传递参数 ? ./script argument 例子: 显示文件名称脚本 ? 1 2 3 4 ./show.sh ...
  • shell脚本中执行命令Shell is a command-line interpreter that allows the user to interact with the system. It is responsible for taking inputs from the user and displaying the output. Shell是一个命令行...
  • Shell脚本书写方法详解

    万次阅读 多人点赞 2018-05-31 12:04:02
    同学给我推荐了一个关于如何书写shell脚本教程文件。看过之后觉得受益良多,自己特意将该PDF内的内容自己总结了一份,在这里和大家分享一下。愿所有像我一样的shell脚本的初学者能够从中受益,少走弯路。首先,shell...
  • perl 、shell、python之shell脚本入门

    万次阅读 2014-07-23 15:35:54
    终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要。下面笔者就带你正式进入shell脚本的世界吧。 到现在为止,你明白什么是shell...

空空如也

1 2 3 4 5 ... 20
收藏数 3,711,662
精华内容 1,484,664
关键字:

shell