1. shell的简单介绍
Shell简单说既是提供用户操作系统的接口。Linux默认使用的shell就是 bash。你可以通过查看 "/etc/shells" 这个文件来检查我们目前的机器上可以支持使用的shell啦。
如果你想查看你这个用户使用的是哪个shell的话,你可以查看 "etc/passwd" 文件,每行的最后标出来的就是这个用户所使用的shell啦。
/bin/bash 是 Linux 默认的 shell,bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux distributions 的标准 shell。bash 主要兼容于 sh ,并且依据一些使用者需求,而加强的 shell 版本。
bash 主要的优点有底下几个:
-
- 命令记忆能力(history)
简单说就是会记录我们的历史命令,这些命令记录你可以在你的主文件夹内的 .bash_history 中找到。
-
- 命令与文件补全功能([Tab]按键的好处)
[Tab] 接在一串命令的第一个字的后面,则为命令补全;[Tab] 接在一串命令的第二个字以后时,则为文件补齐。
-
- 命令别名设置功能(alias)
比如你在命令行敲下 "alias lm=‘ls -al‘" 那么你就可以通过 lm 命令来代替 ls -al 命令了。
-
- 作业控制、前台、后台控制(job control, foreground, background)
- 程序脚本(shell script)
- 通配符(Wildcard)
2. bash shell 的内置命令 -- type
为了方便 shell 的操作,bash 内建了很多命令,如果你想确定某个命令是来自于外部命令(其他非bash所提供的命令)或是内置在bash当中的,你可以使用type这个命令来查看:
[[email protected] ~]# type [-tpa] name 选项与参数: :不加任何选项与参数时,type 会显示出 name 是外部命令还是 bash 内建命令 -t :type 会将 name 以底下这些字眼显示出它的意义: file :表示为外部命令; alias :表示该命令为命令别名所配置的名称; builtin :表示该命令为 bash 内建的命令功能; -p :如果后面接的 name 为外部命令时,才会显示完整文件名; -a :会由 PATH 变量定义的路径中,将所有含 name 的命令都列出来,包含 alias 范例一:查询一下 ls 这个命令是否为 bash 内建? [[email protected] ~]# type ls ls is aliased to `ls --color=tty‘
3. shell的变量功能
3.1 变量的显示与设置 echo, unset
利用 echo 这个命令来取用变量,变量被取用时,前面必须要加上钱字号 $ ,例如:
[[email protected] ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [[email protected] ~]# echo ${PATH} <==也可以使用这种方式
那变量如何设置,如下所示:
[[email protected] ~]# myname=VBird
我们在配置变量时,需要遵循以下守则:
-
- 变量名称只能是英文字母与数字,但是数字不能作开头字符;
- 变量内容若有空格符可使用双引号 [ " ] 或单引号 [ ‘ ] 将变量内容包含起来;
- 可用跳脱字符[ \ ] 将特殊符号(如 [Enter], $, \, 空格符, ‘等)变成一般字符;
- 在一串命令中,还需要根据其他的命令提供信息时,可以使用反单引号[ `命令` ]或 [ $(命令) ]。特别注意,这个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号;
- 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,比如 PATH="$PATH":/home/bin;
- 若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量,比如 export PATH;
- 取消变量的方法为使用 unset ,[ unset 变量名称 ] ,比如取消 myname 的配置,则为 unset myname;
3.2 环境变量的功能
可以使用 env 或 export 命令来查看我们系统目前存在的环境变量。
可以使用 set 查看所有变量(包含环境变量与自定义变量)。
可以使用 export 命令将自定义变量转为环境变量。
[[email protected] ~]# export 变量名称
3.3 变量的有效范围
操作系统中分环境变量与自定义变量,这两个主要区别就是,子进程中访问不到父进程中定义的自定义变量,但是可以访问到环境变量。
3.4 变量的键盘读取、数组与声明: read, array, declare
需要读取来自键盘输入的变量,可以使用 read 命令:
[[email protected] ~]# read [-pt] variable 选项与参数: -p :后面可以接提示字符 -t :后面可以接等待的秒数 范例一:让用户由键盘输入一内容,将该内容变成名为 atest 的变量 [[email protected] ~]# read atest This is a test <==此时光标会等待你输入!请输入左侧文字看看 [root@www ~]# echo $atest This is a test <==你刚刚输入的数据已经变成一个变量内容! 范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named 的变量内容 [[email protected] ~]# read -p "Please keyin your name: " -t 30 named Please keyin your name: Tsai <==注意看,会有提示字符喔! [[email protected] ~]# echo $named Tsai <==输入的数据又变成一个变量的内容了!
declare / typeset 是一样的功能,就是声明变量的类型
[[email protected] ~]# declare [-aixr] variable 选项与参数: -a :将后面名为 variable 的变量定义成为数组 (array) 类型 -i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型 -x :用法与 export 一样,就是将后面的 variable 变成环境变量; -r :将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset 范例一:让变量 sum 进行 100+300+50 的加总结果 [[email protected] ~]# sum=100+300+50 [[email protected] ~]# echo $sum 100+300+50 <==因为这是文字型态的变量属性,所有并没有相加 [root@www ~]# declare -i sum=100+300+50 [[email protected] ~]# echo $sum 450
数组变量的类型
数组的设置方式: var[index]=content
3.5 变量内容的删除、替代与替换
变量配置方式 | 说明 |
${变量#关键词} ${变量##关键词} |
若变量内容从头开始的数据符合“关键词”,则将符合的最短数据删除 若变量内容从头开始的数据符合“关键词”,则将符合的最长数据删除 若变量内容从头开始的数据符合“关键词”,则将符合的最短数据删除 若变量内容从头开始的数据符合“关键词”,则将符合的最长数据删除 |
${变量%关键词} ${变量%%关键词} |
若变量内容从尾向前的数据符合“关键词”,则将符合的最短数据删除
若变量内容从尾向前的数据符合“关键词”,则将符合的最长数据删除 |
${变量/旧字符串/新字符串} ${变量//旧字符串/新字符串} |
若变量内容符合“旧字符串”则“第一个旧字符串会被新字符串取代”
若变量内容符合“旧字符串”则“全部的旧字符串会被新字符串取代” |
4. Bash Shell的操作环境
4.1 通配符与特殊符号
符号 | 意义 |
* | 代表0 个到无穷多个任意字符 |
? | 代表一定有一个任意字符 |
[] | 代表一定有一个在括号内的字符(非任意字符)。例如 [abcd] 代表一定有一个字符, 可能是 a, b, c, d 这四个任何一个 |
[-] | 若有减号在中括号内时,代表在编码顺序内的所有字符。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的 |
[^] | 若中括号内的第一个字符为指数符号 (^) ,那表示反向选择,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受 |