Linux自学笔记——bash的基础特性
Bash的基础特性(1)
1.命令历史history
环境变量;
HISTSIZE:命令历史记录的条数;
HISTFILE:~/.bash_history
HISTFILESIZE;命令历史文件记录历史的条数;
调用上一条命令的最后一个参数:
!$:
控制命令记录的方式:
环境变量:HISTCONTROL
ignoredups;忽略重复的命令;连续且相同方为重复;
ignorespace:忽略所有以空白开头的命令;
ignoreboth:ignoredups,ignorespace;
修改环境变量值的方式:export 变量名=“值”
变量赋值:把赋值符号后面的数据存储于变量名指向内存空间;
history其它用法在计算机基础章节也写过,就此略过
2.命令补全
Bash执行命令:
内部命令;
外部命令:bash根据PATH环境变量定义的路径,自左向右在每个路径搜寻以给定命令命名的文件,第一次找到即为要执行的命令;
直接补全:Tab,用户给定的字符串只有一条唯一对应的命令;
以用户给定的字符串为开头对应的命令不唯一,则再次Tab会给出列表;
3.路径补全
把用户给出的字符串当做路径开头,并在其指定上级目录下搜索已指定的字符串开头的文件名;
如果唯一:则直接补全。否则;再次Tab,给出列表;
4.命令行展开
~:展开为用户的主目录;
~USERNAME:展开为指定用户的主目录
{}:可承载一个以逗号分隔的列表,并将其展开为多个路径
/tmp/{a,b}=/tmp/a,/tmp/b;
/tmp/{tom,jerry}/hi=/tmp/tom/hi,/tmp/jerry/hi
5.命令的执行结果
成功
失败
Bash使用特殊变量$?保存最近一次命令的执行状态结果:
0:成功
1-255:失败
echo$?
Bash基础特性(2)
1.命令别名(alias)
通过alias命令来实现:
1)alias
显示当前shell进程所有可用的命令别名;
2)alias NAME=‘VALUE’
note:在命令行中定义的别名,仅对当前的shell进程有效;如果想要永久有效,要定义在配置文件中;
仅对当前用户有效:~/.bashrc
对所有用户有效:/etc/bashrc
Note:编辑配置不会立即生效,需要bash进程重新读取配置文件:
Source /path/to/config_file
. /path/to/config_file
撤销别名:unalias
unalias [-a] name [name...]
note:如果别名同原命令的名称,则要执行原命令,可以使用”\COMMAND”
2.glob(globbing)
bash中用于实现文件名“通配”
通配符:*,?,[]
1)*:任意长度的任意字符
2)?:任意单个字符
3)[]:匹配指定范围内的任意单个字符
[0-9]:0-9之间任意一个值;
[a-z]:不区分大小写;
4)[^]:匹配指定范围外的任意单个字符
[^0-9]:除了0-9以外的任意单个字符;
专用字符集合:
[:digit:]:任意数字,相当于0-9;
[:lower:]:任意小写字母
[:upper:]:任意大写字母
[:alpha:]
[:alnum:]:任意数字
[:space:]:空格
[:punct:]:标点符号
练习:
1)显示/var目录下所有以1开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录;
2)显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录;
3)显示/etc/目录下,以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录;
4)复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/claude目录中
5)复制/etc目录下,所有以.d结尾的文件或目录至/tmp/claude目录中;
6)复制/etc目录下,所以有.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/claude目录中;
3.Bash的快捷键
Ctrl+l:清屏,相当于clear
Ctrl+a:跳转至命令开始处;
Ctrl+e:跳转至命令结尾处;
Ctrl+c:取消命令的执行;
Ctrl+u:删除命令行首至光村所在处的所有内容;
Ctrl+k:除光标所在处至命令行尾部的所有内容;
4.Bash的I/O重定向及管道
程序:指令+数据
读入数据:input
输出数据:output
打开的文件都由一个fd:filedescription(文件描述符)
标准输入:keyboard,0
标准输出:monitor,1
标准错误输出:monitor,2
I/O重定向:改变标准位置
输出重定向:COMMAND > NEW_POS, COMMAND >>NEW_POS
>:覆盖重定向,目标文件中的原有内容会被清除;
>>:追加重定向,新内容会追加至目标文件尾部;
#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]
HERE Documentation:<<
cat << EOF
cat >/path/to/somefile << EOF
管道:
COMMAND1 | COMMAND2 | COMMAND3 |...
Note:最后一个命令会在当前shell进程的子shell进程中执行;
tee命令:
tee [OPTION]... [FILE]...
练习:
1.将/etc/passwd文件中的前5行内容转换为大写后保存至/tmp/passwd.out文件中;
2.将登录至当前系统上的用户信息中的后3行的信息转换为大写后保存/tmp/who.out文件中;
Bash的基础特性(3)
1、提供了编程环境
程序:指令+数据
程序编程风格:
过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
shell程序:提供了编程能力,解释执行
程序的执行方式:
计算机:运行二进制指令;
编程语言:
低级:汇编
高级:
编译:高级语言-->编译器-->目标代码
C、C++, java
解释:高级语言-->解释器-->机器代码
shell, perl, python
过程式编程:
顺序执行
循环执行
选择执行
shell编程:过程式、解释执行
编程语言的基本结构:
数据存储:变量、数组
表达式
语句
shell脚本:文本文件
shebang:
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
magic number: 魔数
运行脚本:
1、给予执行权限,通过具体的文件路径指定文件执行;
2、直接运行解释器,将脚本作为解释器程序的参数运行;
变量:
命名的内存空间;
数据存储方式:ASCII
字符:110:24
数值:110--> 8
整型
浮点型
变量:变量类型
作用:
1、数据存储格式;
2、参与的运算;
3、表示的数据范围;
类型:
字符
数值:
整型
浮点型
编程程序语言:
强类型:
弱类型:bash
把所有要存储的数据统统当作字符进行
不支持浮点数;
逻辑运算:
true, false
1, 0
与:
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0
或:
1 || 1 = 1
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0
非:
! 1 = 0
! 0 = 1
短路运算:
与:
第一个为0,结果必定为0;
第一个为1,第二个必须要参与运算;
或:
第一个为1,结果必定为1;
第一个为0,第二个必须要参与运算;
Bash的基础特性(4)
变量类型:
数据存储格式、存储空间大小、参与运算种类;
字符型;
数值型:
整型;
浮点型;
强类型:定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误;
弱类型:无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用;
Bash中变量的种类:
根据变量的生效范围等标准;
本地变量:生效范围为当前shell进程;队当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;
环境变量:生效范围为当前shell进程的及其子进程;
局部变量:生效范围为当前shell进程中某代码片段(通常指函数);
位置变量:$1,$2,…来表示,用于让脚本在脚本代码中调用通过命令传递给它的参数;
特殊变量:$?,$0,$*,[email protected],$#
本地变量:
变量赋值:name=‘value’可以使用引用
Value:
1)可以直接是字符串;name=“username”
2)变量引用:name=“$username”
3)命令引用:name=’COMMAND’,name=$(COMMAND)
变量引用:${name}, $name
"":弱引用,其中的变量引用会被替换为变量值;
'':强引用,其中的变量引用不会被替换为变量值,而保持原字符串;
显示已定义的所有变量:set
销毁变量:unset name
环境变量:
变量声明、赋值;
export name=VALUE
declare –x name=VALUE
变量引用:$name,${name}
显示所有的环境变量:export,env,printenv
销毁:unset name
Bash有许多內建的环境变量:PATH,SHELL,UID,HISTSIZE,HOME,PWD,OLD,HISTFILE,PS1
变量命名规则:
1)不能使用程序中的保留字:例如if,for;
2)不能使用数字、字母及下划线,且不能以数字开头;
3)见名知意;
只读变量:
readonly name
declare –r name
位置变量:
在脚本代码中调用通过命令行传递给脚本的参数;
$1,$2,…:对应调用第1、第2等参数;
Shift[n]
$0:命令本身;
$*:传递给脚本的所有参数;
[email protected]:传递给脚本的所有参数;
$#;传递给脚本的参数的个数
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
功用:定义命令别名;定义本地变量
Shell登录:
交互式登录:
直接通过终端账号密码登录:
使用“su -username”或“su –l username”切换的用户;
/etc/peofile à /etc/profile.d/*.sh à~/.bash_profile à~/.bashrc à/etc/bashrc
非交互式登录:
su username
图形界面下打开的终端
执行脚本
~/.bashrc à/etc/bashrc à/etc/profile.d/*.sh
编辑配置文件定义的新配置的生效方式:
1)重新启动shell进程;
2)使用source或.命令进程;