BASH知识点记录
bash配置文件
profile类
为交互式shell提供配置文件
~/.bash_profile 个人配置
/etc/profile,/etc/profile.d/*.sh 全局配置
功用:定义环境变量;运行命令和脚本。
bashrc类
为非交互式用户提供配置文件
~/.bashrc 个人配置
/etc/bashrc 全局配置
功用:定义本地变量,别名。
登录式shell读取配置文件顺序
/etc/profile ---> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非登录式shell读取顺序
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
让定义的配置文件立即生效
#source /etc/profile
#. /etc/bashrc
bash的工作特点
命令执行状态返回值
每个命令执行结束后,会有“执行状态返回值”,有效范围:0-255
0:表示执行成功
1-255:表示执行失败
使用$? 可查看状态返回值
命令
格式:
COMMAND OPTIONS ARGUMENTS # 命令 选项 参数
使用type查看命令类型
内部命令:shell程序自带的命令,由shell内建提供
外部命令:独立的可执行程序文件,名字即为程序名
执行外部命令时查找方式
echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
选项
短格式选项-char
-l, -d, -h,
-ldh
长格式选项
--word, --long, --directory, ...
参数
命令的作用对象
快捷键
Ctrl+a:光标跳至命令行首
Ctrl+e:光标跳至命令行尾
Ctrl+u:删除光标之前的所有内容
Ctrl+k:删除光标之后的所有内容
bash功能
文件名通配:globbing
特殊字符,元字符
不表示字符的表面意义,而是被匹配符合指定特征的字符串
*:匹配任意长度的字符,包括空
?:匹配任意单个字符,不包括空
[]:匹配指定范围[]内的任意单个字符
[^]取反,匹配指定范围[]之外的任意单个字符
字符集合
[:space:]表示所有空白字符
[[:space:]]表示匹配其中任意一个
[:punct:]所有的标点符号
[:lower:]所有小写字母a-z
[:upper:]所有大写字母A-Z
[:digit:]所有的数字 1-9
[:alnum:]所有的数字和字母字符
[:alpha:]所有的字母
命令补全,路径补全
history
history
-c清空历史记录
-w保存缓存中的历史命令到历史文件中
-a追加保存
-d n删除第n条历史记录
export HISTCONTROL=ignorespace\执行history命令时,不显示空格开头的命令
export HISTCONTROL=ignoredups\忽略重复的命令
export HISTCONTROL=ignoreboth\空格开头的重复的命令全不显示
位置:通常在用户家目录下.bash_history
!#:执行第几条历史命令
!!:执行上一条命令
!..:执行上一个..开头的命令
!$:调用上一条命令的最后一个参数
按ESC松开再按.号,即会重新调用上一个命令的参数
管道和重定向
输出重定向:
COMMAND > POSITION 覆盖输出
COMMAND > POSITION 在原有内容的后面追加输出
错误重定向:
COMMAND 2> POSITION 只有错误信息才会被重定向
COMMAND 2>> POSITION
合并重定向:
COMMAND &> POSITION 无论正确与否全部重定向
COMMAND > POSITION 2> POSITION
输入重定向:
COMMAND < POSITION 覆盖输入,是指把POSITION的内容定向给COMMAND,并显示COMMAND的执行结果
COMMAND << POSITION 追加输入,此处文档
常搭配EOF使用:
#cat > /tmp/123.txt << EOF
>Hello,world.
>How are you?
>EOF
单双引号区别
“”:双引号,弱引用,里面的变量会被替换
‘’:单引号,强引用,里面的所有字符都是字面量,直接输出
如果一个字串没有变量,单双引号没有区别
如果有变量,想要获取变量的结果,需要双引号,如果想要变量本身,那么使用单引号
如果是命令,需要使用反引号,才能得到该命令执行的结果
bash变量
内存空间地址+数据,数据是放在内存中,即也叫有名称的内存地址
变量的赋值:向变量的存储空间中存储数据
定义一个变量后,也就确定了:
1,存储机制,如存储的是字符型还是数值型等;
2,存储空间
3,参与的运算方式,如数值型的加减乘除等;
bash对变量的机制:
1,所有都看作字符型
2,不支持浮点数据,需借用外部机制
3,变量无需事先声明,相当于,赋值和声明同时实现
命名规范:
1,不能以数字开头,只能使用字母,数字和下划线
2,变量名要做到见名知义,如userName=admin风格
3,不能使用程序中的关键字(保留字),如if,else,where,for等
查看变量:
查看当前shell进程中所有的本地变量
set
查看当前shell进程中的所有环境变量
export
printenv
env
取消赋值:unset VAR_NAME(注意,这里不需要加$)
本地变量:作用范围仅当前shell,对其他shell和当前shell的子进程都无效,重启后失效;
赋值:var_name=VALUE
环境变量:只作用于当前shell进程及其子进程
用户可自定义环境变量:
bash有许多内置的环境变量,赋值时注意不要重名
export VAR_NAME=VALUE # 定义一个环境变量
export VAR_NAME # 导出一个变量为环境变量
readonly VAR_NAME # 锁定变量为只读变量,在当前shell进程结束前无法更改
var_name=value --> export var_name
declare -x var_name=VALUE # -x 表示定义为一个环境变量
如:declare -i var_name=VALUE # 将var_name定义为整形
局部变量:作用范围为shell脚本中的某片代码片,通常用于函数本地
local VAR_NAME=VALUE
位置变量
使用$1, $2, ..., $9, ${10}, ...
$0表示脚本文件路径本身;取文件名:basename $0
shift:把引用过的参数'踢'掉,在脚本中永远只使用$1引用下一个
例如:shift 2 :踢2个,这样就可以在脚本中永远以$1和$2来引用后面的参数
特殊变量:shell内置,有特殊功用
$? 上个命令的状态返回值
$# 传递给脚本参数的个数,就是一共有多少个位置变量
\(* 或\)@ 引用传递给脚本的所有参数
变量引用:
1,${var_name}
2,$var_name
3,date
反引号``,有同样效果
一般\(var与\){var}并没有啥不一样
但是用${}会比较精确的界定变量名称的范围,比如:
$A=B
$echo $AB
原意是想将$A的值替换出来,然后在后面加B,但在命令行上,结果却是只会替换变量为AB的值出来
正确的应该是${A}B
变量撤销
unset var_name
bash弱类型:
变量=值 (无需事先声明,可直接使用,默认值为字符型)
变量的值的类型:
数值型:
精确数值:整数
近似数值:浮点型,浮点型又分单精度和双精度浮点型
字符型:char,string
布尔型:true,false
增强型赋值:
a=\([\)a+100],一般写成 let a+=100
表示变量a在自己的值上加上一个100,得到的结果在赋值给本身
+=, -=, *=, /=, %=, **= 都需要使用let命令进行描述
变量自加:var=\([\)var+1] == let var+=1 == let var++
表示一个变量每次只加1或减1,赋值给自己本身,可写成此形式
export PATH=$PATH:
unset PATH //撤销变量
算术运算:bash会对数字执行隐式的类型转换
let VAR_NAME=Integer_Value(语句)
declare -i Var_Name=Integer_Value
VAR_NAME=$Integer_Value(表达式)
操作符:+, -, *, /, %(取模), **(次方)
双目运算符:需要至少两个操作数
bash的算术运算的方式:
let Var_Name=EXPRESSION(表达式)
$[EXPRESSION]
$((EXPRESSION))
命令:expr ARG1 OP ARG2
举例:
#let sum=\(num1+\)num2
#echo $sum
#echo $[ $num1 + $num2 ]
#echo \(((\)num1 + $num2))
expr $num1 + $num2
语句不能单独执行,需要let等命令来执行
表达式可以单独执行
给变量以默认值
varName=${varName-:value}
若varName不为空,则其值不变;否则,会使用value作为其值
逻辑运算
布尔运算:真1和假0
与运算:
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0
只有两个都为真,结果才为真,否则为假。遵守短路法则
或运算:
1 || 0 = 1
1 || 1 = 1
0 || 1 = 1
0 || 0 = 0
只要有一个为真,即为真,类似电路并联
非运算:
非真为假,非假为真
异或运算:
判断两者是否不同,不同者为真;相同者为假
短路法则:
COMMAND1 && COMMAND2
COMMAND1为真,COMMAND2才会执行;COMMAND1为假时,COMMAND2不会在执行。
COMMAND1 || COMMAND2
COMMAND1为真,COMMAND2不执行;COMMAND1为假,COMMAND2才会执行
bash条件测试
命令执行成功与否,即为测试条件
命令执行成功与否为测试条件
test 表达式
[ 表达式 ]
[[ 表达式 ]]
比较运算:
<, >, <=, >=, ==, !=,
整型比较:数值间的大小比较
-eq:等于
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
-ne:不等于
a=10
b=20
[ $a -gt $b ]
echo $?
字符串比较:
字符串大小比较
1,字符串要加引号引用
2,作比较时使用双中括号[[ VAR ]]
==:等于
>:大于 需用双中括号
<:小于 [[ ]]
!=:不等于
=~:左侧的字符串是否能被右侧的pattern所匹配,匹配为一部分,不是精确匹配,如:[[ "ab" =~ [ab][Ab][AB] ]]
例如:写个脚本,可判断输入的用户是否有可登录shell
#!/bin/bash
#
read -p "Plz input a username: " userName
userInfo=`grep "^$userName\>" /etc/passwd
if [[ "$userName" =~ /bin/.*sh$ ]]; then
echo "Can login."
else
echo "Not can login."
fi`
-z “STRING”:判断指定的字串是否为空,空则为真,不空则假
-n “string”:判断指定的字串是否不空,空则为假,不空则真
#[ "$a" -gt "$b" ]
#echo $?
判断文件的存在性及属性等
-a或-e FILE:判断一个文件是否存在,存在即为真;
-f FILE :存在且为普通文件,则为真;
-d FILE:存在且为目录,则为真;
-L或-h FILE :存在且为软链接文件,则为真;
-b FILE:块设备
-S FILE:套接字文件
-s FILE :存在且为非空文件
-N FILE:修改时间新于访问时间的文件,如被重定向过的文件
-r FILE:存在且可读
-w:可写
-x:可执行
例如:
FILE1 -nt FILE2:文件1的修改时间mtime,新于文件2,则为真;
FILE1 -ot FILE2 :旧于
FILE1 -ef FILE2 :
例如:
if [ -x $a ];then
echo $a
fi
权限测试
r,w,x,
组合条件测试:
与:[ condition1 -a condition2 ]
或:[ condition1 -o condition2 ]
非:[ -not condition ]
bash切片
1、基于字符串切片
Usage: ${var:offset: length}
# 定义一个变量,等会切这个变量
mypath="/etc/sysconfig/network-scripts/"
echo ${mypath:5} #偏移5个字符显示
"""
sysconfig/network-scripts/
"""
echo ${mypath:10} #偏移10个字符显示
"""
nfig/network-scripts/
"""
echo ${mypath:5:5} #偏移5个字符,取5个字符
"""
sysco
"""
# 取出字符串的最后几个字符:${var: -length}
# 注意:-length之前有空白字符
echo ${mypath: -10}
"""
k-scripts/
"""
2、基于模式取子串
Usage:
${var#*word}: 自左而右,查找var变量中存储的字符串中第一次出现的由word所指明的字符,删除此字符及其左侧的所有内容
${var##*word}: 自左而右,查找var变量中存储的字符串中最后一次出现的由word所指明的字符,删除此字符及其左侧的所有内容
${var%word*}: 自右而左,查找var变量中存储的字符串中第一次出现的由word所指明的字符,删除字符及其右侧的所有内容
${var%%word*}: 自右而左,查找var变量中存储的字符串中最后一次出现的由word所指明的字符,删除此字符及其右侧的所有内容
mypath="/etc/sysconfig/network-scripts"
echo ${mypath#*/}
"""
etc/sysconfig/network-scripts
"""
mypath="/etc/sysconfig/network-scripts"
echo ${mypath##*/}
"""
network-scripts
"""
mypath="/etc/sysconfig/network-scripts"
echo ${mypath%c*}
"""
/etc/sysconfig/network-s
"""
echo ${mypath%%c*}
"""
/et
"""
3、基于字串查找替换
Usage:
${var/pattern/replacement} :查找var变量存储的字符中第一次由pattern匹配到的内容,并替换为replacement
${var//pattern/replacement} :查找var变量存储的字符中所有能够由pattern匹配到的内容,并替换为replacement
${var/#pattern/replacement} :查找var变量存储的字符中最开始处能够由pattern匹配到的内容,并替换为replacement
${var/%pattern/replacement} : 查找var变量存储的字符中最后位置能够由pattern匹配到的内容,并替换为replacement
示例:
url="http://www.baidu.com:80"
echo ${url/www/WWW}
"""
http://WWW.baidu.com:80
"""
echo ${url/w/W}
"""
http://Www.baidu.com:80
"""
echo ${url//w/W}
"""
http://WWW.baidu.com:80
"""
userinfo="root:x:0:0:rootuser:/root:/bin/bash"
echo ${userinfo/#root/ROOT}
"""
ROOT:x:0:0:root user:/root:/bin/bash
"""
userinfo="root:x:0:0:rootuser:/root:/bin/root"
echo ${userinfo/%root/ROOT}
"""
root:x:0:0:root user:/root:/bin/ROOT
"""
4、基于字串查找删除
Usage:
\({var/pattern}:删除变量第一次pattern匹配到的内容
\){var//pattern}:删除变量所有pattern匹配到的内容
\({var/#pattern}:删除变量头部匹配pattern的内容
\){var/%pattern}:删除变量尾部能够匹配pattern的内容
示例:
userinfo="root:x:0:0:rootuser:/root:/bin/root"
echo ${userinfo/root}
"""
:x:0:0:root user:/root:/bin/root
"""
echo ${userinfo//root}
"""
:x:0:0: user:/:/bin/
"""
echo ${userinfo/#root}
"""
:x:0:0:root user:/root:/bin/root
"""
echo ${userinfo/%root}
"""
root:x:0:0:root user:/root:/bin/
"""
5、基于字符串大小写转换
Usage:
\({var^^}:把var变量中的所有小写字母,统统替换为大写;
\){var,,}:把var变量中的所有大写字母,统统替换为小写;
示例
echo $userinfo
"""
root:x:0:0:root user:/root:/bin/root
"""
myinfo=${userinfo^^}
echo $myinfo
"""
ROOT:X:0:0:ROOT USER:/ROOT:/BIN/ROOT
"""
echo ${myinfo,,}
"""
root:x:0:0:root user:/root:/bin/root
"""
6、空变量判断赋值
Usage:
${var:-word}:如果变量var为空或未声明,则返回word所表示的字符串;否则,则返回var变量的值, 临时赋值
echo $name # 这行的值为空
echo ${name:-tom}
tom
name=hello
echo ${name:-tom} hello
${var:=word}:如果变量var为空或未声明,则返回word所表示的字符串,并且把word赋值为var变量;否则,则返回var变量的值,直接等值
echo "User's name is${name:?wrong}"
-bash: name: wrong
name=tom
echo "User's name is${name:?wrong}"
User's name is tom
${var:+word}:如果变量var为空或未声明则忽略;否则,则返回word;
unset name
echo "User's name is ${name:+wrong}"
"""
User's name is
"""
name=tom
echo "User's name is${name:+wrong}"
"""
User's name is wrong
"""
正则表达式字符匹配
.:匹配任意单个字符
.*:匹配任意字符,0个到无穷多个
[]:匹配指定范围内的任意字符:
[0-9],[[:digit:]]
[a-z],[[:lower:]]
[A-Z],[[:upper:]]
空白 [[:space:]]
所有标点符号 [[:punct:]]
所有大小写字母 [[:alpha:]]
所有大小写字母和数字符号 [[:alnum:]]
[^] 取反
bash环境中特殊符号
#:批注符号,视为说明
\:转义符号,将特殊字符或通配符还原成一般字符
|:管道。左边命令结果,输送给右边命令执行
;:连续命令执行分隔符,前面命令执行完,执行后面一个,然后同时输出屏幕
&&:如果前面的命令执行正确,则开始执行后面的命令,如果前面命令出错,后面命令也不会执行
||:如果前面的命令执行成功,则后面的命令不执行,反之,如果前面的命令执行失败,则开始执行后面的命令
$:使用变量前导符
&:作业控制,将命令送到后台执行
!:逻辑运算中‘非’的意思
‘’:单引号,不具有变量置换功能,原样输出
“”:双引号,具有变量置换的功能
··:反单引号,优先执行的命令,等同于$()
RAID
:0:条带技术 性能+,读写+
冗余 -
1:镜像 (每块硬盘都存储同一种数据) 性能+,读+,写-
冗余+
2:3:4:校验码技术5:RAID 5 (至少3块) 性能+,读写+
冗余+1+0: (至少4块) 性能+,读写+
冗余+
0+1:(至少4块) 性能+,读写+ 冗余+5+0: (至少6块) 性能+,读写+
冗余+JBOD技术:适用于存储单个大文件,多个硬盘累加当成一块硬盘用 性能0,读写0
冗余0(至少2块)(ps:比如一块硬盘存储一个文件,这个文件的大小累计增长的,当文件大小达到硬盘容量后,这时可以在添加一块硬盘,然后使用JBOD技术,把新加的硬盘与原硬盘合并成一整块硬盘。)
![img](file:///D:/My Knowledge/temp/6ea688a4-c878-4750-b831-eda777da87d0/128/index_files/9b88cf85-3efc-465c-a7f3-390a86c4e9b9.png)
![img](file:///D:/My Knowledge/temp/6ea688a4-c878-4750-b831-eda777da87d0/128/index_files/4dd05eca-0141-4c9f-b8de-d67d044d3045.jpg)
man手册的段落
NAME:命令的名称
DESCRIPTION:命令功能的详细描述
OPTIONS:所有选项
SYNOPSIS:使用格式
EXAMPLES:使用示例
FILES:与当前命令相关的配置文件
SEE ALSO:可参考的其他手册
帮助中的格式字串 []:可省略
<>:不可省略
| : 二选一或多选一
... : 同类内容可以出现多个
Linux将命令行执行的命令记录到日志文件中便于审计使用
配置方法:
1,编辑/etc/bashrc文件
vim /etc/bashrc
# 在此文件的最后一行加入如下内容
export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[hostname- \((hostname)]": "[euid=\)(whoami)]":\((who am i):[`pwd`]:"\)msg"; }'
# 保存退出
2,重新加载下bashrc
source /etc/bashrc
3,查看配置结果
# 在执行如下之令之前,可以随意执行几个命令,以便显示效果
tail -f /var/log/messages
end
出处:http://www.cnblogs.com/xiaofeiweb/
版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。