文章目录
1、命令和文件自动补全
Tab只能补全命令和文件(RHEL6/Centos6)
2、常见的快捷键
^c 终止前台运行程序
^z 将前台运行的程序挂起到后台
^d 退出 等价exit
^l 清屏
^a | home 光标移到命令行的最前端
^e | end 光标移到命令行的后端
^u 删除光标前所有字符
^k 删除光标后所有字符
^r 搜索历史命令
3、常用的通配符
*: 匹配0或多个任意字符
?: 配任意单个字符
[list]: 匹配[1ist]中的任意单个字符
[!list]:匹配除1ist中的任意单个字符
{string1,string2,...}: 匹配string1,string2或更多字符串
简单案例
ls -l file* #匹配以file开头,任意字符或没有字符结尾的文件
ls -l file? #匹配以file开头,任意一个字符结尾(必须有一个字符)的文件
ls -l file*.txt #匹配以file开头,.txt结尾的文件
ls -l file[1234] #匹配file1,file2,file3,file4(file开头,1234结尾的文件)
ls -l file[!1-4] #匹配除file开头,1234结尾,并且任意单个字符结尾的文件
touch file{1..10} #创建file1到file10
4、bash中的引号
- 单引号 ’ ’:会把引号的内容当成整体来看待, 禁止引用其他变量值, shell中特殊符号都被视为普通字符
- 双引号" ":会把引号的内容当成整体来看待,允许通过$符号引号用其他变量值
- 反撇号 ``:反撇号和$()一样,引号或括号里的命令会优先执行,如果存在嵌套,反撇号不能用
一个简单的例子对比bash中的单引号,双引号和反撇号
[root@fl Shell]# echo '$(date +%F)' #单引号
$(date +%F)
[root@fl Shell]# echo "$(date +%F)" #双引号
2023-01-16
[root@fl Shell]# echo `date +%F` #反撇号
2023-01-16
[root@fl Shell]# echo "`date +%F`"
2023-01-16
[root@fl Shell]# echo '`date +%F`'
`date +%F`
5、变量定义
变量名=变量值
变量名:用来临时保存数据的
变量值:就是临时的可变化的数据
A=hello #定义变量
echo $A #调用变量A
echo ${A} #调用变量A
A=world #变量可以改变
unset A #取消变量
5.1 变量定义的规则
虽然可以给变量(变量名)赋予任何值。但是,对于变量名也是有要求的
- 变量名区分大小写
- 变量名不能有特殊符号,比如 ?* 等等
- 变量名不能以数字开头
- 等号两边不能有任何空格
- 变量名需要见名知意(优秀程序员必备)
5.2 变量定义的方式
基本赋值方式
直接赋值给一个变量
[root@fl Shell]# A=1234567
[root@fl Shell]# echo $A
1234567
[root@fl Shell]# echo ${A:2:4}
3456
说明:
$变量名和${变量名}的异同
相同点:都可以调用变量
不同点: ${变量名}可以只截取变量的一部分,而$变量名不可以
命令执行结果赋值给变量
[root@fl Shell]# hostname
fl
[root@fl Shell]# A=`hostname` #将hostname中的值赋给变量A
[root@fl Shell]# echo ${A}
fl
交互式定义变量
目的:让用户自己给变量赋值,比较灵活
语法:read [选项] 变量名
常见选项
选项 | 含义 |
---|---|
-p | 定义用户提示信息 |
-n | 定义字符数(限制变量值的长度) |
-s | 不显示用户输入的内容 |
-t | 定义超时时间,默认单位为秒(限制用户输入变量值的超时时间) |
用户自己定义变量值
[root@fl Shell]# read -p 请输入 name
请输入fl
[root@fl Shell]# echo ${name}
fl
[root@fl Shell]# read -p 请输入 -n 3 name
请输入123[root@flecho ${name} #当输入字符个数已经等于限制个数时,会自动停止输入
123
[root@fl Shell]# read -p 请输入 -s name
请输入[root@fl Shell]# #输入ffll,但是被隐藏了
[root@fl Shell]# echo ${name}
ffll
[root@fl Shell]# read -p 请输入 -t 3 name
请输入[root@fl Shell]# #超过定义的超时时间,就会停止输入
变量值来自文件
read -p 请输入name name < name.txt #将name.txt中的值赋值给变量name
定义有类型的变量(declare)
目的:给变量做一些限制,固定变量的类型,比如:整型,只读
用法:declare 选项 变量名=变量值
常见选项
选项 | 含义 | 举例 |
---|---|---|
-i | 将变量看成整数 | declare -i A=123 |
-r | 定义只读变量 | declare -r B=hello |
-a | 定义普通数组,查看普通数组 | |
-A | 定义关联数组,查看关联数组 | |
-x | 将变量通过环境导出 | declare -x AAA=12345 等于 export AAA=12345 |
[root@fl Shell]# declare -i A=hello #无法将一个字符串赋值给一个整形变量
[root@fl Shell]# echo $A
0
[root@fl Shell]# declare -r B=fl
[root@fl Shell]# echo $B
fl
[root@fl Shell]# B=ff #只读变量无法被修改
bash: B: readonly variable
[root@fl Shell]# unset B #只读变量无法被删除
bash: unset: B: cannot unset: readonly variable
想要删除只读变量,只有exit退出后重新登录,因为B是一个临时变量
[root@fl Shell]# declare -x FL=fl #导出环境变量
[root@fl Shell]# env | grep FL #在环境变量中查找 FL
fl
5.3 其他变量定义
取出一个目录下的目录和文件:dirname和basename
A=/root/Shell/tmp/ip.txt
echo $A
/root/Shell/tmp/ip.txt
dirname $A #取出目录
/root/Shell/tmp
basename $A #取出文件
ip.txt
5.4 “变量内容的删除和替换”
一个"%“代表从右往左去掉一个/key/
两个”%“代表从右往左最大去掉/key/
一个”#“代表从左往右去掉一个/key/
两个”##"代表从左往右最大去掉/key/
url=www.baidu.com
echo ${#url} #获取长度
13
echo ${url#*.} #从左往右,删除第一个.以及之前的所有内容
baidu.com
echo ${url##*.} #从左往右,删除最后一个.以及之前的所有内容
com
echo ${url%.*} #从右往左,删除第一个.以及之后的所有内容
www.baidu
echo ${url%%.*} #从右往左,删除最后一个.以及之后的所有内容
www
6、变量的分类
本地变量
当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效
[root@fl Shell]# A=hello
[root@fl Shell]# echo $A
hello
[root@fl Shell]# sh
sh-4.2# echo $A #本地变量在子shell中无效
sh-4.2#
环境变量
当前进程有效,并且能被子进程调用
- env 查看当前用户的环境变量
- set 查询当前用户的所有变量(临时变量与环境变量)
- export 变量名=变量值 或者 变量名=变量值;export 变量名
[root@fl ~]# FFLL=123
[root@fl ~]# env | grep FFLL #env中不包含临时变量,所有查不到
[root@fl ~]# set | grep FFLL #set中包含临时变量,所有能查到
FFLL=123
用户退出再登录后,临时变量则失效
如果想要永久生效,则需要修改配置文件:
vim /etc/profile(全局配置,配置完成后,对每个用户都能生效) 或者 ~/.bashrc(针对某一个用户生效)
export FFLL=123
或者
全局变量
全局所有的用户和程序都能被调用,且继承,新建的用户也默认能调用
相关配置文件
文件名 | 说明 | 备注 |
---|---|---|
$HOME/.bashrc | 当前用户的bash信息,用户登录时读取 | 定义别名、umask、函数等 |
$HOME/.bash_profile | 当前用户的环境变量,用户登录时读取 | |
$HOME/.bash_ logout | 当前用户退出当前shell时最后读取 | 定义用户退出时执行的程序等 |
/etc/bashrc | 全局的bash信息,所有用户的都生效 | |
/etc/profile | 全局环境变量信息 | 系统和所有用户都生效 |
说明:以上文件修改后,都需要重新source让其生效或者退出重新登录
用户登录系统读取先关文件的顺序
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bashrc
系统变量
系统变量(内置bash中的变量):shell本身已经固定好了它的名字和作用
内置变量 | 含义 |
---|---|
$? | 上一条命令执行后返回的状态。状态值为0表示执行正常,非0表示执行异常或错误 |
$0 | 当前执行的程序或脚本名 |
$# | 脚本后面接的参数的个数 |
$* | 脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开 |
$@ | 脚本后面所有参数,参数是独立的,也是全部输出 |
$1-$9 | 脚本后面的位置参数,$1表示第1个位置参数,依次类推 |
${10}~${n} | 扩展位置参数,第10个位置变量必须用{}大括号括起来(2位数字以上扩起来) |
$$ | 当前所在进程的进程号,如echo $$ |
$! | 后台运行的最后一个进程号(当前终端) |
!$ | 调用最后一条命令 历史中的参数 |
验证内置变量
#!/bin/env bash
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$10 = ${10}"
bash test3.sh a b c
$0 = test3.sh
$# = 3 #一共有3个参数
$* = a b c
$@ = a b c
$1 = a
$2 = b
$3 = c
$10 = #没有第10个参数,所以为空