一、认识bash
(一)shell
1、定义:命令解释器。
将用户下达的命令解释给kernel,将kernel的反馈解释给用户。
2、使用文字界面的shell的原因
1)通用性
2)便捷迅速
3)可以将多个小工具组合在一起完成任务
4)节省资源
5)方便远程管理
3、shell的历史
1)Steven Borne最早创建了bsh
2)Bill Joy创建了csh。并创办了SUN。csh衍生出tcsh。
3)Bran.J.Fox创建了Bash ――Bourne again shell,Linux上最为常用的shell。
4)AIX平台上常用的是ksh
5)使用cat /etc/shells命令,查看linux当前系统下支持的shell
(二)、内建指令与命令用法
1)内建指令不真实存在本机硬盘目录下,包含在bash内部自身中;使用help查看bash shell的内建命
令。
外建命令指放在本机/bin,/sbin等目录下的可执行文件,运行外建命令的标准方式是切换到目录下
通过./ ,或者是以绝对路径的方式调用命令。
通过$PATH变量可以方便的调用执行命令
2)cd /root
ls
与(cd /root ; ls)(用分号的方式分割)显示结果一样;
区别:分两次执行完毕后,当前目录已经切换到/root;在括号内一次执行完毕后,当前所在路径依
然是未切换之前的目录/etc。当以() ;的方式连接多个命令执行时,是在当前的进程中开
启了一个子进程,并在子进程中执行的一系列命令(先执行cd /root,然后执行ls),当执
行完毕后,退出子进程,回到原进程,回到初始目录。
(三)变量
1、变量是shell所记得的指定值
2、声明变量(给变量赋值)A=1,使用echo $A查看变量A;如果直接echo A将直接输出A。
$叫做变量的前缀
3、取消声明变量unsetA
变量名称中的字母一般是大写的,后面指定的一般是数字
(四)BASH的只读变量
只读变量是由bash shell自动设置的,这些变量是只读的,不能被用户设置。
1、 ? 最新执行的命令的退出状态。状态有两种,分别为0和1。
代表执行成功或者执行失败
echo $?的值为0表示cd /etc/的命令执行成功。
echo $?的值为1表示cd /fu/的命令执行失败
写shell脚本时,使用 $? 判断前一个指令是否执行成功
2、 _当前启用中的shell选项标记。
echo $_ :
该结果随着使用会发生变化的。
当前执行ls ,进程中执行的是/bin/ls --color=tty
如果只执行/bin/ls ,显示无颜色
3、$ 当前shell的进程(pid)
echo $$ 查看当前进程的编号
4、! 最新的后台命令的进程id(pid)
5、_ (下划线) 前一个命令的最后标记
- 当前命令的特殊标记
6、PPID 当前进程父进程的号码
(五)预赋值变量
预赋值变量由bash shell初始化,不要去重新赋值
1、 BASH_VERSION:当前bash的版本
2、 HOSTNAME :当前机器的DNS主机名
3、 OLDPWD:上一次工作目录
cd - 查找的就是OLDPWD存放的信息,进入相关目录
4、 PWD:当前工作目录
5、 RANDOM:随机显示介于0到32767之间的任意整数
6、 SECONDS:自shell启动以来经过的秒数
(六)环境变量和局部变量
1、局部变量:只在当前进程范围内有效的变量
2、环境变量:Linux内核允许任何进程定义被称做环境变量的“名称-值对”。这些变量是保存在内核
进程中的一部分。无论何时,一个进程启动另一个进程时(例如,bash shell启动ls命
令),子进程都会继承环境变量
3、set:列出当前系统已经定义的shell变量和与shell有关的环境变量
env:只列出环境变量
例如:LANG 程序应该使用的默认语言
(七)、命令行替换
1) ! 前一个命令行
2){} 指定的文本
3) ~username 进入指定用户的家目录
cd ~ 默认进入当前用户的家目录
4) $ shell的变量
${ …} 环境变量
$(...) 将变量值替换为括号内命令执行的结果
5) $((…)) 算术运算。只能进行标准的整数运算。例如
6)`…` (反逗点) ,$(…)(括号内为命令)
运行在子shell中的命令的输出
例如:在/tmp下创建一个以当前时间命名的文件
(1)touch /tmp/$(date +%Y%m%d).log
(2)touch /tmp/`date +%Y%m%d `.log
7)
* 任意多个字符
? 任意单个字符
[… ] 括号中的字符之一
[^…] 任何一个不在[…]字符
文件系统中匹配的文件名,如通配符等
8)如何转义或者避免shell将其特殊解释,bash shell提供三种方法:
(1)转义 \ 避免下一个字符被shell进行解释,例如:
(2)""(双引号) 避免双引号内除了$、!、空格和` `(反引号)字符以外的其他字符被shell解释
(3)''(单引号) 避免单引号内的字符被shell解释
(包括$,!,` `(反引号)特殊字符在内的所有字符)
(八)自定义shell
1、alias不能创建新的命令,但可以创建现有命令的方便用法。
2、执行alias查看当前系统的别名定义
定义alias h
unalias取消别名的定义
(九)Shell脚本
1、Shell脚本本质是Shell命令的罗列
2、Shell脚本中
shell下执行命令方式:
<1> source的方式执行
<2>. 的方式执行
例如:执行vi /etc/init.d/sshd
1)标准的shell脚本一般以#!/开始
注意:一般情况下,#开头的称为注释行,该行无任何含义,主要写一些说明性的文字;
但是如果 # 后跟上!表示该脚本以什么shell来运行的
如跟/bin/bash,表示以/bin/bash来运行
2)shell尽量书写相应的注释
3)良好的缩进,可以更方便的阅读脚本
如写完开头先写个结尾,然后在中间写入;
尽可能使用变量;
先写变量的赋值,然后再写相应的内容;
相应的功能建议形成模块,制作成为函数,方便以后调用