导图社区 Linux-5shell
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
编辑于2021-05-28 19:44:18Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
如果你已经使用 Linux 有一段时间,那么你肯定听到过 Vim 。Vim 是一个高度可配置的、跨平台的、高效率的文本编辑器,几乎所有的 Linux 发行版本都已经内置了 Vim ,由于其特性之丰富,它已经变得非常流行了。
社区模板帮助中心,点此进入>>
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
如果你已经使用 Linux 有一段时间,那么你肯定听到过 Vim 。Vim 是一个高度可配置的、跨平台的、高效率的文本编辑器,几乎所有的 Linux 发行版本都已经内置了 Vim ,由于其特性之丰富,它已经变得非常流行了。
shell程序设计
shell概述
特点和主要版本
shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序。
shell就是用户和内核交互的界面。
shell还是一种高级程序设计语言,它有变量,关键字,有各种控制语句,如if、case、while、for等语句,支持函数模块,有自己的语法结构。
shell是解释执行的脚本语言,在shell中可以直接调用Linux系统命令。
shell种类
Bourne shell(简称sh)
从1979年起Unix就开始使用,Bourne shell的主文件名为sh。
C shell(简称csh)
语法结构和C语言类似,主要在BSD版的Unix系统中使用。
注意: Bourne shell和C shell彼此不兼容。
(3)Korn shell(简称ksh)
(4)Bourne Again shell(即bash) Linux的标准shell。属于sh家族。
shell脚本建立和执行
建立
vi或其他编辑器
执行shell脚本的三种方式
输入定向到shell脚本 $ bash < 脚本名
(2)以脚本名作为参数,其一般形式是 $ bash 脚本名 [参数]
如果以目前shell(以 . 表示)执行一个shell脚本,则可以使用如下简便形式 $ .脚本名 [参数]
将shell脚本的权限设置为可执行,然后在提示符下直接执行它,此时该脚本所在的目录应被包含在命令搜索路径(PATH)中
命令历史
显示历史命令
语法格式是:history [option] [arg…]
如果不带任何参数,则history命令会显示历史命令的清单
如果history 后给出一个正整数(如50),就只显示历史表中的最后50行命令 。
如果history后给出一个文件名,就把它作为历史文件名
执行历史命令
!!
重复上一条命令,也就是“!-1”
!n
重新执行第n条历史命令
!-n
重新执行倒数第n条历史命令。!-1就等于! !
!string
重新执行以字符串string开头的最近的历史命令行
!?string?
重新执行最近的、包含字符串string的那条历史命令
!#
到现在为止所输入的整个命令行
配置历史命令环境
在默认方式下,bash使用用户主目录下面的文件“.bash_history”来保存命令历史。
改变存放历史命令的文件
$ HISTFILE="/home/mengqc/.myhistory"
重新设定能够保留的命令个数
$ HISTSIZE=600
名称补全
可以输入目录名或文件名的开头部分,然后按Tab键,Linux根据输入的字母查找以这些字母开头的目录或文件,并自动补全剩余的部分。
别名
定义别名
一般语法格式为: alias [name[=value]]…
eg:alias aa='echo I am ivy'
如果没有指定参数,将在标准输出(屏幕)上显示别名清单 。
定义别名时,往往用单引号将它代表的内容括起来,从而防止shell对其中的内容产生歧义,如对空格和特殊字符另作解释。
取消别名
可以一次将所有的别名都从别名表中删除,使用如下命令:
unalias -a
eg:unalias aa
shell特殊字符
通配符
*(星号),它匹配任意字符的0次或多次出现
?(问号),它匹配任意一个字符
[ ](方括号),其中有一个字符组。其作用是匹配该字符组所限定的任何一个字符
!(惊叹号),如果它紧跟在一对方括号的左方括号([)之后,则表示不在一对方括号中所列出的字符
引号
双引号
由双引号括起来的字符(除$、倒引号`和反斜线\外)均作为普通字符对待。
2.单引号
由单引号括起来的字符都作为普通字符出现。
3.倒引号
倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。
倒引号还可以嵌套使用。但嵌套使用时内层的倒引号必须用反斜线(\)将其转义。转义字符(\) ,可将特殊字符变成普通字符。
输出输入重定向符
1. 输入重定向符——使用文件作为一个命令的输入
一般形式是:命令 < 文件名
cat < ex1 把ex1中的内容作为cat的参数
2.输出重定向符 ——把命令的结果保存在文件里,覆盖保存
一般形式是:命令 > 文件名
3.输出附加定向符——把命令的结果保存在文件里,追加保存
一般形式是:命令>>文件名
输入和输出重新定向可以连在一起使用。
4. 即时文件定向符
即时文件的形式是:
命令 [参数]<< 标记符
输入行
…
标记符
注意:标记符要成对出现(可以任意定义,完全取决于个人喜好,最常见的是EOF)
eg:[]wc << end
>hello
>bye
>end
2 2 10
eg:[]cat > file << smile
>happy
>sad
>smile
eg:[]cat file
happy
sad
5.与文件描述字有关的重定向
通过指定文件描述符2,标准错误输出可重定向到一个文件中,其一般形式是:
命令 2> 文件名 (覆盖)
命令 2>> 文件名 (追加)
标准输出和标准错误输出可以重定向到同一个文件,一般形式是:
命令 &>文件名
等价于命令: 命令 > 文件名 2>& 1
注释、管道线和后台命令
注释
以#开头的正文行表示注释
管道线
管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示。它的一般形式为: 命令1 | 命令2
后台命令
要让程序在后台执行,只需在命令行的最后加上“&”符号
命令执行操作符
顺序执行
在执行时,以分号隔开的各条命令从左到右依次执行
pwd ; who | wc -l ; cd /usr/bin
逻辑与
&&把两个命令联系在一起,命令1 && 命令2
功能:先执行命令1,如果执行成功,才执行命令2;否则,若命令1执行不成功,则不执行命令2。 cp ex1 ex10 && rm ex1
注意:命令执行成功返回值为0,不成功则返回非0
逻辑或
命令1 || 命令2
其功能是,先执行命令1,如果执行不成功,则执行命令2;否则,若命令1执行成功,则不执行命令2。
成组命令
{ }形式
以{ }括起来的全部命令可视为语法上的一条命令,出现在管道符的一边。
$ {(空格)echo “User Report for ` date ` . ”; who ; } | pr
使用花括号时在格式上应注意:左括号 “{ ”后面应有一个空格;右括号“}”之前应有一个分号( ;)
( )形式
$ (echo “User Report for ` date ` . ”; who )| pr
shell变量
用户定义的变量
变量名
以字母或下线符开头的字母、数字和下线符序列,并且大小写字母意义不同。
变量赋值
定义变量并赋值的一般形式是:变量名=字符串
注意:=的两边没有空格
如果在赋给变量的值中要含有空格、制表符或换行符,那么,就应该用双引号把这个字符串括起来。
引用变量值
在变量名前面加上一个符号“$”,例如
$ names=‘Zhangsan Lisi Wangwu’
$ echo $names
如果变量值须出现在长字符串的开头或者中间,为了使变量名与其后的字符区分开,避免shell把它与其它字符混在一起视为一个新变量,则应该用花括号将该变量名括起来。例如,
$ dir=/usr/meng
$ cat ${dir}qc/m1.c
命令替换
有两种形式的命令替换:一种是使用倒引号引用命令,其一般形式是: `命令表`
$ dir=`pwd`
另一种形式是:$(命令表)
$ echo $(pwd ; cd /home/mengqc ; ls -d)
数组
bash只提供一维数组,并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。
对数组元素赋值的一般形式是:数组名[下标]=值
可以用declare命令显式声明一个数组,一般形式是:
declare -a 数组名
读取数组元素值的一般格式是:${数组名[下标]}
定义一个数组同时为其赋初值,一般形式是:
数组名=(值1 值2 … 值n) 其中,各个值之间以空格分开。
$ A=(this is an example of shell scripts)
若没有给出数组元素的下标,则数组名表示下标为0的数组元素
$ echo ${A}
使用*或@当作下标,则会以数组中所有元素取代[*]或[@],例如
$ echo ${A[@]}
unset命令可以取消某个数组元素或整个数组的定义
$ unset A[4] $ unset A[*]
变量引用
$name ${name#pattern}
${name} ${name##pattern}
${name[n]} ${name % pattern}
${name[*]} ${name %% pattern}
${name [@]} ${#@}
${name:-word} ${$#*}
${name:=word} ${# name }
${name:?word} ${# name[*]}
${name:+word} ${#name[@]}
输入/输出命令(用于交互)
read命令
从键盘上读取数据,然后赋给指定的变量。
read命令的一般格式是: read 变量1 [ 变量2 …]
变量个数与给定数据个数相同,则依次对应赋值
变量个数少于数据个数,则从左至右对应赋值,但最后一个变量被赋予剩余的所有数据。
变量个数多于给定数据个数,则依次对应赋值,而没有数据与之对应的变量取空串
echo命令
显示其后的变量值,或者直接显示它后面的字符串
如果echo命令带有选项“-e”,那么在其后的参数中可以有以下转义字符: \a \b \c \e \f \n \r \t \v \\ \m \xm
\c 不换行。(同-n)
\n 换行。
位置参数
位置参数及其引用
用set命令为位置参数赋值
$0不能用set命令赋值,它的值总是脚本名
移动位置参数
预先定义的特殊变量
$# 命令行上参数的个数,但不包含shell脚本名($0)本身。
$? 上一条命令执行后的返回值。0表示没有错误,其他任何值表示有错误。
$$ 当前进程的ID号。
$! 上一个后台命令对应的进程号。(用得少)
$* 以一个单字符串表示在命令行中实际给出的所有实参字符串,它并不仅限于9个实参。(不包括$0)
$@ 它与$*基本功能相同,即表示在命令行中给出的所有实参。但表示形式不同,$@在引号中返回每个参数