Shell 概要

Shell 概述

shell关键概念中英文

  • blank:包含空格space和制表符tab
  • control operator, 控制符:包含newline, '||', '&&', '&', ';', ';;', ';&', ';;&', '|', '|&', '(', ')'
  • field, 字段:shell扩展之一带来的文本单位。扩展后,当执行命令时,生成的字段将用作命令名称和参数
  • job, 作业:在同一个进程组中的一系列进程,可由管道或衍生的进程组成
  • job control, 作业控制:一种机制,用户可以通过该机制选择性地停止(挂起)并重新开始(恢复)进程的执行。
  • metacharacter, 元字符:当不在引号中时,用于分割单词的字符,包括space, tab, newline, '|', '&', ';', '(', ')', '<', '>'
  • operator, 操作符:分为控制符或重定向符,操作符由至少一个元字符组成
  • process group, 进程组:一系列具有相同组进程ID的进程
  • reserved word, 保留字:对shell具有特殊含义的单词。,大多数保留字用于流程控制,如for, while, if
  • signal, 信号:一种机制,内核可以通过该机制将系统中发生的事件通知给进程
  • token, 标记:可以被shell认为是一个独立单元的一串字符,分为单词word或操作符operator
  • word, 单词:可以被shell认为是一个单元的一串字符,单词不能包括不带引号的元字符。

shell脚本的第一行

1> #! /bin/sh -
  • -符号表示没有其他参数,防止一些欺骗攻击
  • shell脚本的第一行长度一般不要超过64个字符

shell脚本的重定向符

  • > 表示将命令输出的内容重定向到其他位置

    1$ cat > nusers  
    2who | wc -l 
    

    即将who | wc -l复制到nusers文件中

  • >> 表示已用附加的方式重定向到指定文件。区别在于如果目标文件存在,会将内容附加到文档后面,而不会覆盖文档。

  • <表示从其他地方而不是键盘接受输入patch --verbose --backup -p1 < /tmp/cx,表示从/tmp/cx文件输入内容

一些特殊符号

  • ; 表示一条命令输入结束,命令按顺序执行
  • 表示后台执行&之前的命令,直接在前台执行&之后的命令。
  • && 用法command 1 && command 2,表示当command 1执行成功后,再执行command 2,如果不成功,则不执行command 2
  • || 用法command 1 || command 2,表示若command 1执行失败,则执行command 2,如果执行成功,则不执行command 2

变量

Shell脚本中变量可以是(并且通常是)空值,null。 变量赋值的时候VarName=VarValue,如果VarValue中间有空格,则需要使用双引号,包括VarValue。变量引用的时候需要使用$符号,$VarName;如果想在CMD终端显示有空格的VarValue,需要使用echo命令。

1$ fullname="hello world"  
2$ echo $fullname  
3hello world

PATH路径中:的作用

表示从哪里开始搜寻命令

访问Shell的的参数

访问shell的参数也就是说shell的命令行参数,例如myshell para1 para2;在Shell函数里面用$1,$2,$3,.....,$9,${10}表示。当参数大于10个时,由于历史原因,需要用大括号包裹起来。

删除一个变量可以使用unset命令,变量名不用加$,即unset x

设置环境变量export VarName=VarValue,使用env命令可以查看所有的环境变量

预定义变量和位置变量(位置变量也是预定义变量的一种,只是比较常见单独拿出来说)

预定义变量有3个,$?,$$.$!;位置变量有:$n,$*,$@,$#

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。这种方式将所有参数作为一个整体。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,会将每一个变量法分开表示。
$? 上个命令的退出状态,或函数的返回值。$?:表示上一个命令执行的结果,如果正常执行则返回0,非正常执行则为错误代码
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
$! 后台最后一个进程所表示的PID

简单的命令跟踪

在Shell中输入

set -x 表示每一个命令使用+表示执行到哪一个命令
set +x 表示取消跟踪
shell -x CMD 表示追踪此CMD命令

shell脚本中的“.”

shell脚本中,使用“.”等同于使用source,相当于在脚本中执行另一个脚本,但是执行的时候共用一个shell

source命令用法: source FileName

作用:在当前bash环境下读取并执行FileName中的命令。该命令通常用命令“.”来替代。source filepath或者. filepathsh filepath或者./filepath区别:

  1. sh filepath会重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell是新建的,其改变的变量不会被带回父shell,除非使用export。
  2. source filename其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。