Shell脚本学习——符号

来源:互联网 发布:域名是什么别名 编辑:程序博客网 时间:2024/06/02 04:18

Shell的历史

Shell的作用是解释执行用户的命令。
交互式(Interactive):用户输入一条,Shell就解释一条。
批处理(Batch):用户实现写一个Shell脚本,其中有很多条命令,Shell一次性把这些命令执行完,不必一条一条的敲。

UNIX系统上有很多种Shell:

  1. sh(Bourne Shell):由 Steve Bourne开发,各种UNIX系统配置都有sh。
  2. csh(C Shell):它的流程控制语句跟C语言很像,支持很多Bourne Shell所不支持的功能:作业控制,命令历史,命令编辑。
  3. ksh(Korn Shell):向后兼容了sh的功能,并且添加了csh引入的新功能,是目前很多UNIX系统变准配置的Shell,在这些系统上/bin/sh往往是指向/bin/ksh的符号链接。
  4. tcsh(TENEX Shell):是csh的增强版,引入了命令补全等功能,在FreeBSD,Mac OS X等系统上替代了csh。
  5. bash(Bourne Again Shell):由GNU开发的Shell,主要目标是与POSIX标准保持一致。同时兼顾对sh的兼容,bash从csh和ksh借鉴了很多功能,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。
    文件/etc/shells给出了系统中所有的已知(不一定已安装)的Shell。
    这里写图片描述

Shell 执行脚本

eg:test.sh
这里写图片描述
结果是:
这里写图片描述
Shell脚本中:#表示注释,相当于c语言的//注释。位于第一行开头的#则是例外。
他表示该脚本使用后面指定的解释器/bin/bash解释执行。

给这个脚本文件加上可执行权限:

  1. chmod +x test.sh
    test.sh是一个文本文件,根本没有代码段和_start函数。exec还有另外一种机制,如果偏要执行的是一个文本文件,并且第一行用Shebang制定了解释器,则用解释程序的代码段替换当前进程,并且从解释器的_strat开始执行,而这个文本文件被当做命令行参数传给解释器。
  2. /bin/bash test.sh

如果将命令行下输入的命令用()括起来,那么也会fork出一个字shell执行小括号中的命令。
一行中可以输入有分号;隔开的多个命令 eg:$$(cd ..;ls -l)
和上面两种方法执行shell脚本的效果是相同的,cd ..命令改变的是子Shell的PWD,不会影响到交互式shell。
命令$cd ..;ls -l则有不同的效果,cd ..命令是直接在交互式shell下执行的,改变交互式shell的PWD,然而这种方式相当于这样执行shell脚本:

$$source ./test.sh
或者
$. ./test.sh

source 或者. 命令是shell的内建命令,这种方式也不会创建子shell,而是直接在交互式shell下逐行执行脚本中的命令。

Shell 变量

惯例,Shell变量有全大写字母+下划线组成,有两种类型的变量:
环境变量
环境变量可以从父进程传给子进程。,用printenv命令可以显示当前Shell进程的环境变量。
本地变量
只存在于当前shell进程,用set命令可以显示当前shell进程中定义的所有变量(包括本地变量和环境变量)和函数。

环境变量是任何进程都有的,本地变量是shell特有的。
在Shell中定义或赋值一个变量:
VARNAME=value
*等号两边不能有空格,否则会被Shell解释成命令和命令行参数。

一个变量定以后仅存在于当前Shell,为本地变量,用export命令可以把本地变量导出为环境变量:
export VARNAME=value
也可分两步:
VARNAME=value
export VARNAME
用unset命令可以删除已定义的环境变量或者本地变量:
unset VARNAME

变量引用

如果一个变量叫做VARNAME,用**VARNAMEVARNAME.
这里写图片描述

注意,在定义变量时不用,.
Shell变量不需要明确定义类型,事实上,Shell变量的值都是字符串,eg:VAR=45,值是字符串45。
Shell变量不需要先定义,如果对一个没有定义的变量取值,值为空字符串。

文件名代换(Clobbing)::*?[]
用于匹配的字符称为通配符:
*:匹配0个或多个任意字符
:匹配一个任意字符
[若干字符]:匹配[]中任意一个字符的一次出现。
这里写图片描述
Globbing所匹配的文件名是由Shell展开的,即参数还没传给程序之前已经展开。

命令代换:`或$()
由反引号括起来的也是一条命令,Shell先执行该命令,然后将输出结果马上代换到当前命令行中。
这里写图片描述
命令代换也可以用()(())
算术计算中:$(())中的Shell变量取值将转换成整数
这里写图片描述
$(())中只能用+-*/和()运算符,并且只能整数运算。
*转义字符*
\在Shell中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外),即 紧跟其后的字符取字面值。

这里写图片描述

touch ./-test 创建有- 的文件名的文件
\还有一种用法,在\后敲回车表示续⾏行,Shell并不会立刻执行命令,而是把光标移到下一行,给出 一个续行提示符>,等待用户继续输入,最后把所有的续行接到一起当作一个命令执行。这里写图片描述

单引号
Shell脚本中的单引号和双引号一样都是字符串的界定符(双引号下一节介绍),而不是字符的界定符。单引号用于保持引号内所有字符的字⾯面值,即使引号内的\和回车也不例外, 但是字符串中不能出现单引号

这里写图片描述

双引号
双引号用于保持引号内所有字符的字面值(回车也不例外),但以下情况除外:
$的字面值
`表示`的字面值
\”表示”的字面值
\表示\的字面值 除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值。

0 0
原创粉丝点击