【Linux】【Shell】【Basic】Bash
命令历史:shell进程会在其会话中保存此前用户提交执行过的命令;
-------------------------------------------------------------------
~]# history
定制history的功能,可通过环境变量实现:
HISTSIZE:shell进程可保留的命令历史的条数;
HISTFILE:持久保存命令历史的文件;
.bash_history
HISTFILESIZE:命令历史文件的大小;
命令用法:
history [-c] [-d 偏移量] [n]
或 history -anrw [文件名]
或 history -ps 参数 [参数...]
-c:清空命令历史;
-d offset:删除指定命令历史
-r:从文件读取命令历史至历史列表中;
-w:把历史列表中的命令追加至历史文件中;
history #:显示最近的#条命令;
调用命令历史列表中的命令:
!#:再一次执行历史命令中的第#条命令;
!!:再一次执行上一条命令;
!STRING:再一次执行命令历史列表中最近一个以STRING开头的命令;
注意:命令的重复执行有时候需要依赖于幂等性;
调用上一条命令的最后一个参数;
快捷键:ESC, .
字符串:!$
控制命令历史记录的方法:
环境变量:HISTCONTROL
ignoredups:忽略重复的命令;
ignorespace:忽略以空白字符开头的命令;
ignoreboth:以上两者同时生效;
修改变量的值:
NAME='VALUE'
命令补全:
-------------------------------------------------------------------
shell程序在接受到用户执行命令的请求,分析完成之后,最左侧的字符串会被当做命令;
命令查找机制:
查找内部命令;
根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;
给定的打头字符串如果能唯一标识某命令程序文件,则直接补全,不能唯一标识某命令程序,再击一次tab键,会给出列表;
路径补全:
-------------------------------------------------------------------
在给定的起始路径下,以对应路径下的打头字符串来逐一匹配起始路径下的每个文件:
tab:
如果能唯一标识,则直接补全;
否则,再一次tab,给出列表;
命令行展开:
-------------------------------------------------------------------
~:自动展开为用户的家目录,或指定用户的家目录;
{}:可以承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;
例如:/tmp/{a,b} 相当于 /tmp/a /tmp/b
命令执行的状态结果:
-------------------------------------------------------------------
bash通过状态返回值来输出此结果:
成功:0
失败:1-255
命令执行完成之后,其状态返回值保存于bash的特殊变量$?中;
命令正常执行时,有的还会有命令返回值:
根据命令及其功能不同,结果各不相同;
引用命令的执行结果:
$(COMMAND)
或`COMMAND`
引用
-------------------------------------------------------------------
强引用:''
弱引用:""
命令引用:``
快捷键
-------------------------------------------------------------------
Ctrl+a:跳转至命令行行首
Ctrl+e:跳转至命令行行尾
Ctrl+u:删除行首至光标所在处之间的所有字符
Ctrl+K:删除光标所在处至行尾的所有字符
Ctrl+l:清屏,相当于clear
globbing:文件名通配(整体文件名匹配,而非部分)
-------------------------------------------------------------------
匹配模式:元字符
*:匹配任意长度的任意字符
?:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
有几种特殊格式:
[a-z] [A-Z] [0-9] [a-z0-9]
[[:upper:]]:所有大写字母
[[:lower:]]:所有小写字母
[[:alpha:]]:所有字母
[[:digit:]]:所有数字
[[:alnum:]]:所有的字母和数字
[[:space:]]:所有空白字符
[[:punct:]]:
[^]:匹配指定范围外的任意单个字符
[^[:upper:]]
[^0-9]
[^[:alnum:]]
IO重定向及管道
-------------------------------------------------------------------
可用于输入的设备:文件
键盘设备、文件系统上的常规文件、网卡等;
可用于输出的设备:文件
显示器、文件系统上的常规文件、网卡等;
程序的数据流有三种:
输入的数据流:<-- 标准输入(stdin),键盘
输出的数据流:--> 标准输出(stdout),显示器
错误输出流: --> 标准输出(stderr),显示器
fd:file descriptor,文件描述符
标准输入:0
标准输出:1
错误输出:2
IO重定向:
输出重定向:>
特性:覆盖输出
输出重定向:>>
特性:追加重定向
# set -C
禁止覆盖输出重定向至已存在的文件;
此时可使用强制覆盖输出:>|
# set +C
关闭上述特性
错误输出流重定向:2>, 2>>
合并正常输出流和错误输出流:
(1) &>, &>>
(2) COMMAND > /path/to/somefile 2>&1
COMMAND >> /path/to/somefile 2>&1
输入重定向: <
Here Document: <<
cat <<EOF
cat >> /PATH/TO/SOMEFILE << EOF
管道:连接程序,实现前一个命令的输出直接定向到后一个程序的输入
tr命令:
tr [OPTION]... SET1 [SET2]
把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符
用法1:
tr SET1 SET2 < /PATH/FROM/SOMEFILE
用法2:
tr -d SET1 < /PATH/FROM/SOMEFILE
注意,不修改原文件
tee命令:
COMMAND | tee /PATH/TO/SOMEFILE
bash特性之:命令hash
缓存此前命令的查找结果:key-value
key:搜索键
value:值
hash命令:
hash:列出
hash -d COMMAND:删除
hash -r:清空
bash的特性之:变量
程序:指令+数据
指令:由程序文件提供;
数据:IO设备、文件、管道、变量
程序:算法+数据结构
变量名+指向的内存空间
变量赋值:name=value
变量类型:存储格式、表示数据范围、参与的运算
编程语言:
强类型变量:
弱类型变量:
bash把所有变量统统视作字符型;不支持浮点,需要特殊工具支持
bash中的变量无需事先声明;相当于,把声明和赋值过程同时实现;
声明:类型,变量名
变量替换:把变量名出现的位置替换为其所指向的内存空间中数据;
变量引用:${var_name}, $var_name
变量名:变量名只能包含数字、字母和下划线,而且不能以数字开头;
变量名:见名知义,命名机制遵循某种法则;不能够使用程序的保留字,例如if, else, then, while等等;
bash变量类型:
本地变量:作用域仅为当前shell进程;
环境变量:作用域为当前shell进程及其子进程;
局部变量:作用域仅为某代码片断(函数上下文);
位置参数变量:当执行脚本的shell进程传递的参数;
特殊变量:shell内置的有特殊功用的变量;
$?:
0:成功
1-255:失败
本地变量:
变量赋值:name=value
变量引用:${name}, $name
"":变量名会替换为其值;
'':变量名不会替换为其值;
查看变量:set
撤销变量:unset name
注意:此处非变量引用;
环境变量:
变量赋值:
(1) export name=value
(2) name=value
export name
(3) declare -x name=value
(4) name=value
declare -x name
变量引用:${name}, $name
注意:bash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境PATH, HISTFILE, HISTSIZE, HISTFILESIZE, HISTCONTROL, SHELL, HOME, UID, PWD, OLDPWD
查看环境变量:export, declare -x, printenv, env
撤销环境变量:unset name
只读变量:
(1) declare -r name
(2) readonly name
只读变量无法重新赋值,并且不支持撤销;存活时间为当前shell进程的生命周期,随shell进程终止而终止;
bash特性之多命令执行:
~]# COMMAND1; COMMAND2; COMMAND3; ...
逻辑运算:
运算数:真(true, yes, on, 1)
假(false, no, off, 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
短路法则:
~]# COMMAND1 && COMMAND2
COMMAND1为“假”,则COMMAND2不会再执行;
否则,COMMAND1为“真”,则COMMAND2必须执行;
~]# COMMAND1 || COMMAND2
COMMAND1为“真”,则COMMAND2不会再执行;
否则,COMMAND1为“假”,则COMMAND2必须执行;
示例:~]# id $username || useradd $username
bash脚本编程之算术运算
+,-,*,/, **, %
算术运算格式:
(1) let VAR=算术运算表达式
(2) VAR=$[算术运算表达式]
(3) VAR=$((算术运算表达式))
(4) VAR=$(expr $ARG1 $OP $ARG2)
注意:乘法符号在有些场景中需要使用转义符;
练习:写一个脚本,完成如下功能:
添加三个用户;
求此三个用户的UID之和;
信号捕捉:
列出信号:
trap -l
kill -l
man 7 signal
trap 'COMMAND' SIGNALS
常可以进行捕捉的信号:
HUP, INT
示例:
#!/bin/bash
#
declare -a hosttmpfiles
trap 'mytrap' INT
mytrap() {
echo "Quit"
rm -f ${hosttmpfiles[@]}
exit 1
}
for i in {1..50}; do
tmpfile=$(mktemp /tmp/ping.XXXXXX)
if ping -W 1 -c 1 172.16.$i.1 &> /dev/null; then
echo "172.16.$i.1 is up" | tee $tmpfile
else
echo "172.16.$i.1 is down" | tee $tmpfile
fi
hosttmpfiles[${#hosttmpfiles[*]}]=$tmpfile
done
rm -f ${hosttmpfiles[@]}
在bash中使用ACSII颜色
\033[31m hello \033[0m
##m:
左侧#:
3:前景色
4:背景色
右侧#:颜色种类
1, 2, 3, 4, 5, 6, 7
#m:
加粗、闪烁等功能;
多种控制符,可组合使用,彼此间用分号隔开;
dialog命令可实现窗口化编程;
各窗体控件使用方式;
如何获取用户选择或键入的内容?
默认,其输出信息被定向到了错误输出流;
《高级bash编程指南》,《Linux命令行和shell脚本编程宝典》
【Linux】【Shell】【Basic】Bash的更多相关文章
- 【Linux下自定义Shell终端提示符】
目录 基本转义符 字体颜色 背景颜色 移动光标 @ Linux系统终端提示符的特征由系统环境变量 PS1(Prompt String One)定义. 我们可以通过命令echo $PS1来查看当前设置, ...
- 【linux之挂载,Raid,LVM】
一.挂载,卸载 挂载:将新的文件系统关联至当前根文件系统卸载:将某文件系统与当前根文件系统的关联关系移除 cat /etc/mtab 存储着已经挂载的文件系统 (跟 mount 一样) mount:显 ...
- 【Linux&Unix--open/close/write/read系统调用】
个人学习整理.如有不足之处,请不吝不吝赐教. 转载请注明:@CSU-Max 系列博文: Linux&Unix学习第一弹 -- 文件描写叙述符与权限 Linux&Unix学习 ...
- 【linux之设备,分区,文件系统】
一.设备 IDE磁盘的设备文件采用/dev/hdx来命名,分区则采用/dev/hdxy来命名,其中x表示磁盘(a是第一块磁盘,b是第二块磁盘,以此类推), y代表分区的号码(由1开始,..3以此类推) ...
- 【linux之进程管理,系统监控】
一.进程管理 前台进程:一般是指占据着标准输入和/或标准输出的进程后台进程:不占据默认开启的进程都是前台进程ctrl+C 中断ctrl+z 从前台转入后台bg 后台进程编号 让其在后台运行ls -R ...
- 【python中调用shell命令使用PIPE】使用PIPE作为stdout出现假卡死的情况——将stdout重定向为输出到临时文件
在Python中,调用:subprocess.Popen(cmd, stdout = PIPE, stderr = PIPE, shell= true)的时候,如果调用的shell命令本身在执行之后会 ...
- 【Linux运维-集群技术进阶】Nginx+Keepalived+Tomcat搭建高可用/负载均衡/动静分离的Webserver集群
额.博客名字有点长.. . 前言 最终到这篇文章了,心情是有点激动的. 由于这篇文章会集中曾经博客讲到的全部Nginx功能点.包含主要的负载均衡,还有动静分离技术再加上这篇文章的重点.通过Keepal ...
- 【Linux磁盘优化管理--RAID和LVM】
在现阶段的企业环境中,为了数据的安全性及完整性必须要有一个合理的存储方案.面对着每秒可能产生超过几TB的数据,考虑到磁盘能不能实现 热冗余,及扩容,缩容.Linux给出了RAID(磁盘阵列)以及LVM ...
- 【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)
原文:http://blog.csdn.net/wenqian1991/article/details/46700177 通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关 ...
- 【linux之链接,函数,随机数】
一.链接 硬链接(hard link):同一个文件使用了多个别名.新建文件是已经存在的一个别名,,当原文件删除时,新建的文件仍然可以使用.硬链接和原来的文件没有什么区别,而且共享一个inode号.通过 ...
随机推荐
- 稳了!我准备了1个晚上的CMS垃圾收集器
面试官:今天还是来聊聊CMS垃圾收集器呗? 候选者:嗯啊... 候选者:如果用Seria和Parallel系列的垃圾收集器:在垃圾回收的时,用户线程都会完全停止,直至垃圾回收结束! 候选者:CMS的全 ...
- c++学习笔记6(结构化程序设计的不足)
结构化程序设计 c语言使用结构化程序设计: 程序=数据结构+算法 程序有全局变量以及众多相互调用的函数组成 算法以函数的形式实现,用于对数据结构进行操作 结构化程序设计不足 软件业的目标是更快,更正确 ...
- 天冷了,任务栏养只猫吧「GitHub 热点速览 v.21.46」
作者:HelloGitHub-小鱼干 运动能带来热量,盘猫也是,RunCat_for_windows 是一只奔跑在任务栏的猫,一定能给你的电脑带来一丝冬日的温暖.当然送温暖的除了任务栏小猫咪之外,还有 ...
- GitHub出现Permission denied (publickey)
Permission denied (publickey) 没有权限的publickey 重新生成一次ssh key即可解决 ssh-keygen -t rsa -C "这里输入你的邮箱&q ...
- 菜鸡的Java笔记 第二十六 - java 内部类
/* innerClass 从实际的开发来看,真正写到内部类的时候是在很久以后了,短期内如果是自己编写代码,几乎是见不到内部类出现的 讲解它的目的第一个是为了解释概念 ...
- ant命令
ant -help 帮助(ant -h) ant -projecthelp 列举xml中重要的部分 (ant -p) ant -version 查看版本 ant -diagnostics 打印所有环境 ...
- javascript-初级-day01-属性操作、图片切换、短信发送模拟
大多数js就是操作一些css和html的技巧,如果你会html和css学习js更加轻松哦! js中如何获取元素: 通过id名称来获取元素; document get element by id 'li ...
- redis的RDB和AOF两种持久化机制
思维导图:我的redis基础知识汇总 RDB持久化机制的优点 (1)RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的 ...
- Codeforces 1264F - Beautiful Fibonacci Problem(猜结论+找性质)
Codeforces 题面传送门 & 洛谷题面传送门 一道名副其实(beautiful)的结论题. 首先看到这道设问方式我们可以很自然地想到套用斐波那契数列的恒等式,注意到这里涉及到 \(F_ ...
- R语言与医学统计图形-【28】ggplot2扩展包ggrepel、ggsci、gganimate、ggpubr
ggplot2绘图系统--扩展包ggrepel.ggsci.gganimate.ggpubr等 部分扩展包可在CRAN直接下载,有些需借助devtools包从Github下载. 1. ggrepel包 ...