bash简介:
bash是众多shell中最常用的一种,许多linux发行版将bash设置为默认shell。bash是一种命令解释型语言,是操作系统给用户提供的一种接口,能够将用户标准输入或文件中的命令提交内核执行。
bash基础特性:
1、变量
编程程序语言:
强类型:
定义变量时必须指定类型,参与运算必须符合类型要求,调用为声明
弱类型:
无需指定类型,默认均为字符型,参与运算会自动进行隐式类型转换
注:bash为弱类型语言
bash中的变量的种类,根据变量的生效范围:
本地变量:生效范围为当前shell进程,对当前shell之外的其他shell包括当前shell的子shell均无效
环境变量:对当前shell及子shell都有效;(对其他shell无效)
局部变量:生效范围为当前sehll进程中某代码片段(通常指函数)
位置变量:$1,$2,$3,...用于在命令行给脚本传递的参数
特殊变量:$?, $0, $*, $#, $@,$$
本地变量
变量赋值:name='value',可以使用引用赋值:
(1)可以使直接字符串
(2)变量引用:name=$var_name
(3)命令引用:name=`COMMAND`, name=$(COMMAND)
变量引用:${name} , $name
${name}’s
"":弱引用,其中的变量名会被替换成变量值;
'':强引用,其中的变量引用不会被替换成变量值,而保持原字符串;
set:显示已定义的所有变量
unset var_name:销毁变量
环境变量:
变量声明及赋值:
export name=value
declare -x name=value
变量引用:$name,$(name)
显示所有环境变量
export
env
printenv
销毁:
unset name
变量命名法则:
1、不能使用程序中的关键字
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义,驼峰法则或下划线
只读变量:(不能被修改,不能销毁,只能等到shell进程结束)
readonly name
或 declare -r name
位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1,$2,...:对应调用第1、第2等参数
shift [n]:左移当前的位置参数,不加参数默认向左移动一位
$0: 脚本本身的名称
$*:传递给脚本的所有参数(把所有参数当做一个字符串)
$@:传递给脚本的所有参数(每一个参数都是一个单独个体)
$#:参数的个数
$$:是脚本运行的当前进程ID号
2、history管理命令历史
登录shell时,会读取命令历史文件~/.bash_history记录下的命令;登录进shell后重新执行的
命令只 会记录在缓存中,这些命令会在用户退出时追加记录到命令历史文件中(或者使用-a选项)。
history常用选项:
-d OFFSET:根据序列号删除历史中指定的命令
-c:清空历史文件
-a:追加本次会话新执行的命令历史列表到历史文件.bash_history中
快捷操作:
!#:调用历史中第#条命令
!string:调用历史中最近一个以string开头的命令
!!:执行上一条命令
!$:调用上一条命令的最后一个参数
快捷键:ESC, . 或者alt + .
相关环境变量:
HISTFILE: ~/.bash_history(用户家目录)
HISTSIZE:命令历史记录的条数,即history所能显示命令的最多条数。
HISTFILESIZE:命令历史文件所能记录的最多历史命令条数
HISTCONTROL:控制命令历史记录方式
ignoredups: 忽略重复的命令,连续且相同方为"重复"(bash默认)
ignorespace:忽略所有以空白开头的命令
ignoreboth:包含ignoredups和ignorespace
修改环境变量值方式:export 变量名='值'
变量赋值:把赋值符号后面的数据存储于变量名
hash:缓存(记录)用户的历史命令路径到内存中,实现系统加速,只记录外部命令路径
[root@localhost
man
]
# hash
hits
command
5
/bin/grep
1
/bin/egrep
1
/usr/bin/head
3
/bin/cat
4
/usr/bin/man
hash -r:删除某条命令的缓存记录
注意:当命令的路径修改之后,需要删除此条命令的缓存记录,否则会报错,提示找不到此命令
3、命令及路径补全(Tab键)
命令补全:bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻命令名命名的文件,返回第一次找到的命令。
4、命令行展开
~:展开为用户的主目录
~USERNAME:展开为指定用户的主目录
{}:可承载一个以逗号分隔的列表,并将其展开为多个路径
5、命令的执行结果状态,两类:
1、程序的返回值
2、程序的执行状态结果
bash使用特殊变量$?保存最近一条命令的执行状态结果:
0:成功
1 - 255:失败
6、命令别名(alias)
(1) alias
显示当前shell进程所有可用的命令别名
(2) alias NAME='VALUE'
注意:在命令行中定义的别名,仅对当前的shell进程有效;
仅对当前用户生效(永久):~/.bashrc
对所有用户生效(永久):/etc/bashrc
bash进程重新读取配置文件,立即生效:
source /etc/bashrc
. /etc/bashrc
删除别名:
unalias NAME
注意:如果别名同原命令的名称一样,如果要执行原命令,则用"\COMMAND"
7、glob(globbing)
bash中用于实现文件名"通配"
通配符:
* : 任意长度的任意字符
?:一个任意字符
[]: 匹配指定范围内的任意单个字符
[0-9]
[a-z]:不区分字符大小写,区分用[[:lower:]]
[A-Z]:不区分字符大小写,区分用[[:upper:]]
[^]:匹配指定范围外的任意单个字符,[^0-9]
专用字符集合:
[:digit:]:数字
[:lower:]:小写字母
[:upper:]:大写字母
[:alpha:]:字母
[:alnum:]:字母及数字集合
[:space:]:空格
[:punct:]:标点符号
8、bash的I/O重定向及管道
打开的文件都有一个fd:file description(文件描述符)
标准输入: keyboard,0
标准输出: monitor, 1
标准错误输出:monitor, 2
I/0重定向:改变标准位置
输出重定向:COMMAND > NEW_POS, COMMAND >> NEW_POS
>: 覆盖重定向
>>: 追加重定向
set -C: 禁止将内容覆盖输出到已有文件中
强制覆盖:>|
set +C:取消禁止
2>: 覆盖重定向错误输出流
2>>:追加
标准输出和错误输出各自定向至不同位置:
COMMAND > /path/to/file.out 2> /path/to/error.out
合并标准输出和错误输出为同一个数据流进行重定向:
&> :覆盖
COMMAND > /path/to/file.out 2>&1
&>> :追加
COMMAND >> /path/to/file.out 2>&1
输入重定向:<
tr:转换或删除字符
tr [OPTION]... SET1 [SET2]
tr abc ABC < /etc/fstab
-d:给定删除字符
HERE DOCUMENT:<<
cat << EOF
cat > /path/to/somefile << EOF
[root@localhost ~]
# cat > /tmp/test.out << EOF
> Hello
> World
> EOF
[root@localhost ~]
# cat /tmp/test.out
Hello
World
管道:
echo $PATH | tr 'abc' 'ABC'
tee命令:read from standard input and write to standard output and files
-a,--append:追加
echo $PATH | tr 'a-z' 'A-Z' | tee /tmp/path.out
bash配置配置文件:
按生效范围划分:存在两类:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
按功能划分,存在两类:
profile类:为交互式登录的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
个人: ~/.bash_profile
功能:
(1)用于定义环境变量
(2)运行命令或脚本
bashrc类:为非交互式登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功用:
(1)定义命令别名
(2)定义本地变量
shell登录:
交互式登录:
直接通过终端输入账号密码登录;
使用"su - UserName"或"su -l Username"切换的用户
读取配置文件的顺序流程:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录:
su UserName
图形界面下打开的终端
执行脚本
读取配置文件的顺序流程:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
编辑配置文件定义的新配置的生效方式:
(1)重新启动shell进程
(2)使用source或.命令
终端:
用户与主机交互
物理终端:直接接入本机的显示器和键盘设备,console
虚拟终端:附加在物理终端之上的以软件方式虚拟实现的终端,Centos 6 默认有6个
ctrl + alt + f1-6
设备文件路径:/dev/tty#
图形终端:附加在物理终端之上的以软件方式虚拟实现的终端,
ctrl + alt + f7
模拟终端:图形界面下打开的命令行接口,基于ssh协议或telnet协议等远程方式打开的界面
设备文件:/dev/pts/# [0,∞]
交互式接口:启动终端后,在终端设备附加一个交互式应用程序
GUI:
X protocol ,window manager,desktop
Desktop:
GNOME(c , gtk)
KDE (C++,qt)
XFCE(轻量级桌面)
CLI:
shell程序:
sh(bourn)
csh
ksh(korn)
bash(bourn again shell),GPL
zsh
命令提示符:prompt
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
prompt:
管理员:#
普通用户:$
查看当前用户默认shell:
[root@localhost ~]#
echo $SHELL
/bin/bash
查看系统所有可用的shell:
[root@localhost ~]
# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
bash的快捷键:
Ctrl + l:清屏
Ctrl + a:跳转至命令开始处
Ctrl + e:跳转至命令结尾处
Ctrl + c:取消命令的执行
Ctrl + u:删除命令行首至光标所在处的所有内容
Ctrl + k:删除光标所在处至命令行尾的所有内容