Linux命令 bash
Linux 技巧: Bash 测试和比较函数
Bash的=~正则表达式匹配
[](http://mywiki.wooledge.org/BashPitfalls/)
快捷键 <<< 就是将后面的内容作为前面命令的标准输入 echo -en '[ # ] 05%\r' Bash命令行的编辑模式: emacs模式的热键操作: (2)对于单词(esc): (3)对于行(ctrl): (4)对于历史文件(esc): 命令行补齐: (2)补齐文件名(/): (3)补齐用户名(~): (4)补齐主机名(@): (5)补齐内置变量($): (6)补齐命令名(!): (7)补齐历史列表中的命令 名:esc+tab 杂项命令: (1)清 屏:ctrl+l Emacs风格 ctrl+p: 方向键 上 ↑ Ctrl+U 剪切文本直到行的起始(可以用于清空行) 按多次{esc}可以补全 Bang Bang 历史命令 出现的new替换为old。 比如 vim !?test.cpp?:s/cpp/c/ ################################################################################ 这是 PS1 (数字的 1 不是英文字母),这个东西就是我们的『命令提示字符』喔! 当我们每次按下 [Enter] 按键去运行某个命令后,最后要再次出现提示字符时, 就会主动去读取这个变量值了。上头 PS1 内显示的是一些特殊符号,这些特殊符号可以显示不同的信息, 每个 distributions 的 bash 默认的 PS1 变量内容可能有些许的差异,不要紧,『习惯你自己的习惯』就好了。 你可以用 man bash (注3)去查询一下 PS1 的相关说明,以理解底下的一些符号意义。 export PS1="[\033]0;\w\007]"; Use Default Values: ${parameter-default}, ${parameter:-default} 运算符 描述 示例 -e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ] -z string 如果 string 长度为零,则为真 [ -z "$myvar" ] num1 -eq num2 等于 [ 3 -eq $mynum ] file1 -nt file2 文件 file1 比 file2 更新 字符串操作 str1 = str2 当两个串有相同内容、长度时为真 int1 -eq int2 两数相等为真 -a file 文件 file 存在则为真 -f file 文件 file 是普通文件 -r file 文件 file 对当前用户可以读取 -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。 -g file 文件 file 的 GID 标志被设置 [ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。 -a 与 多条件判断
把当前的命令行存放到文本编辑器中
grep a <<< "$VARIABLE" 意思就是在VARIABLE这个变量值里查找字符ashell 实现进度条
echo -en '[ ################### ] 95%'
其中, \r是关键. -en参数也是不可少的.for i in '-' '\\' '|' '/' ; do echo -en $i'\r';sleep 1; done
1. bash 命令行快捷键
(1)有两种:emacs模式、vi 模式。EMACS=Esc+Meta+Alt+Control+Shift,VI=Visual+Interface。
(2)emacs模式是默认的。
(3)可以在选项中查看、修改输入模式:命令set -o查看,命令set -o vi/emacs修 改。
(1)对于字符(ctrl): 前移一个字符:ctrl+f
后移一个字符:ctrl+b
删除前一字符:ctrl+h
删除后一字符:ctrl+d
前移一个单词:esc+f
后移一个单词:esc+b
删除前一单词:esc+ctrl+h,或ctrl+w
删除后一单词:esc+d
恢复最后删除的项:ctrl+y
移到行首:ctrl+a
移到行尾:ctrl+e
从光标所在删除直到行首:ctrl+u
从光标所在删除直到行尾:ctrl+k
移到前一行:ctrl+p
移到后一行:ctrl+n
移动到历史文件的首行:esc+<
移动到历史文件的末行:esc+>
在历史文件中反向搜索:ctrl+r
(1)通用热键: 试图补齐命令行:tab
列出所有可能的备选项:esc+?
试图补齐文件名:esc+/
列出所有备选文件名:ctrl+x+/
试图补齐用户名:esc+~
列出所有备选用户名:ctrl+x+~
试图补齐主机名:esc+@
列出所有备选主机名:ctrl+x+@
试图补齐变量名:esc+$
列出所有备选变量名:ctrl+x+$
试图补齐命令名:esc+!
列出所有备选命令名:ctrl+x+!
(2)反转光 标所在字符及其前面的字符:ctrl+t
(3)从光标处开始的整个单词大写:esc+u
(4)从光标处开始的整个单词小写:esc+l
(5)将光标处的单词的首字母大写:esc+c
ctrl+n: 方向键下 ↓
ctrl+b: 方向键 ←
alt+f: 光标右移一个单词
ctrl+f :方向键 →
alt+b: 光标左移一个单词
ctrl+a:光标移到行首
ctrl+e:光标移到行尾
ctrl+k:清除光标后至行尾的内容。
ctrl+d: 删除光标所在字母;注意和backspace以及ctrl+h的区别,这2个是删除光标前的字符
ctrl+r:搜索之前打过的命令。会有一个提示,根据你输入的关键字进行搜索bash的history
ctrl+m : 输入回车
ctrl+i : 输入tab
ctrl+[ : 输入esc
其它
ctrl+h:删除光标前一个字符,同 backspace 键相同。
alt + p 非增量方式反向搜索历史
alt + > 历史命令列表中的最后一行命令开始向前
ctrl+u: 清除光标前至行首间的所有内容。(可用于复制整行内容)
ctrl+w: 移除光标前的一个单词
ctrl+t: 交换光标位置前的两个字符
ctrl+y: 粘贴或者恢复上次的删除
ctrl+l:清屏,相当于clear。
ctrl + xx 光标在行头与行尾进行跳转
alt+r 撤销当前行的所有内容
ctrl+z : 把当前进程转到后台运行
ctrl+s : 锁住屏幕
ctrl+q : 恢复屏幕
ctrl+v key: 输入特殊字符
alt + l 将当前光标处之后的字母转化成小写字母
alt + u 将当前光标处之后的字母转化成大写字母
ctrl + Alt + e 扩展命令行的内容(例如:ls => ls -l --color=tty)
ctrl+c:杀死当前进程, 输入模式下,中断输入的命令。
ctrl+d:退出当前 Shell
esc + . 快捷键可以轮询历史命令的参数或选项。
esc + t 快捷键可以 置换前两个单词。
输入重复字母 Esc {100} e 可以输入100个e字符
{esc}{~}可以补全本机上的用户名
{esc}{/}可以补全文件名
{esc}{@}可以补全主机名,localhost可以方便地用 lo补全.
:gs/old/new/ 全部替换
:wn w为数字, 取指令的第w个参数.
:p 回显命令而不是执行, 比如 !ls:p 。 这个很有用, 你可以先查看你选的命令对不对,要执行时再使用!!
:gs/old/new/ 全部替换
:wn w为数字, 取指令的第w个参数.
:p 回显命令而不是执行, 比如 !ls:p 。 这个很有用, 你可以先查看你选的命令对不对,要执行时再使用!!
:gs/old/new/ 全部替换
:wn w为数字, 取指令的第w个参数.
:p 回显命令而不是执行, 比如 !ls:p 。 这个很有用, 你可以先查看你选的命令对不对,要执行时再使用!!2. bash 配置
PS1:(提示字符的配置)
\a ASCII 响铃字符(也可以键入 \007)
\d "Wed Sep 06" 格式的日期
\e ASCII 转义字符(也可以键入 \033)
\h 主机名的第一部分(如 "mybox")
\H 主机的全称(如 "mybox.mydomain.com")
\j 在此shell中通过按 ^Z 挂起的进程数
\l 此 shell 的终端设备名(如 "ttyp4")
\n 换行符
\r 回车符
\s shell 的名称(如 "bash")
\t 24 小时制时间(如 "23:01:01")
\T 12 小时制时间(如 "11:01:01")
\@ 带有 am/pm 的 12 小时制时间
\u 用户名
\v bash 的版本(如 2.04)
\V Bash 版本(包括补丁级别)
\w 当前工作目录(如 "/home/drobbins")
\W 当前工作目录的"基名 (basename)"(如 "drobbins")
! 当前命令在历史缓冲区中的位置
# 命令编号(只要您键入内容,它就会在每次提示时累加)
\$ 如果您不是超级用户 (root),则插入一个 "$";如果您是超级用户,则显示一个 "#"
\xxx 插入一个用三位数 xxx(用零代替未使用的数字,如 "\007")表示的 ASCII 字符
\ 反斜杠
[ 这个序列应该出现在不移动光标的字符序列(如颜色转义序列)之前。它使 bash 能够正确计算自动换行。
] 这个序列应该出现在非打印字符序列之后。
变量默认值设置
${parameter-default} -- 如果变量parameter没被声明, 那么就使用默认值.
${parameter:-default} -- 如果变量parameter没被设置, 那么就使用默认值.
注:"(没)被声明"与"(没)被设置"在是否有 ":" 号的句式差别中仅仅是触发点的不同而已。
"被声明"的触发点显然要比"被设置"的要低,
"被设置"是在"被声明"的基础上而且不能赋值(设置)为空(没有赋值/设置为空)。
比如:DIR=${1:-/root} 意思是说,当第一个命令行参数没有或者为空时,默认值为/root。
比如:DIR=${1-/root} 当没有参数时(第一个命令行参数没有声明,当然就是没有参数),默认值为/root。
Assign Default Values: ${parameter=default}, ${parameter:=default}
${parameter=default} -- 如果变量parameter没被声明, 那么就把它的值设为default.
${parameter:=default} -- 如果变量parameter没被设置, 那么就把它的值设为default.: 空命令
注意前面加上了冒号(:),即空命令,等同于下面的写法:
[ -z "$parameter" ] && parameter=default
if [ -z "$parameter" ]; then parameter=default; fi文件比较运算符
-d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename 为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename 可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename 可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename 可执行,则为真 [ -L /usr/bin/grep ]
filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-n string 如果 string 长度非零,则为真 [ -n "$myvar" ]
string1 = string2 如果 string1 与 string2 相同,则为真 [ "$myvar" = "one two three" ]
string1 != string2 如果 string1 与 string2 不同,则为真 [ "$myvar" != "one two three" ]算术比较运算符
num1 -ne num2 不等于 [ 3 -ne $mynum ]
num1 -lt num2 小于 [ 3 -lt $mynum ]
num1 -le num2 小于或等于 [ 3 -le $mynum ]
num1 -gt num2 大于 [ 3 -gt $mynum ]
num1 -ge num2 大于或等于 [ 3 -ge $mynum ]3.1 保留变量
BASH 中有一些保留变量,下面列出了一些:
$IFS 这个变量中保存了用于分割输入参数的分割字符,默认识空格。
$HOME 这个变量中存储了当前用户的根目录路径。
$PATH 这个变量中存储了当前 Shell 的默认路径字符串。
$PS1 表示第一个系统提示符。
$PS2 表示的二个系统提示符。
$PWD 表示当前工作路径。
$EDITOR 表示系统的默认编辑器名称。
$BASH 表示当前 Shell 的路径字符串。
$0, ${1}, ${2}, ...
$RANDOM 随机数
# 特殊参数
1) $* : 代表所有参数,其间隔为IFS内定参数的第一个字元
2) $@ : 与*星号类同。不同之处在於不参照IFS
3) $# : 代表参数数量
4) $? : 执行上一个指令的返回值
5) $- : 最近执行的foreground pipeline的选项参数
6) $$ : 本身的Process ID
7) $! : 执行上一个背景指令的PID
8) $_ : 显示出最後一个执行的命令
运算符
含义( 满足下面要求时返回 TRUE )
file1 -ot file2 文件 file1 比 file2 更老
对应的操作整数操作
相同 -eq =
不同 -ne !=
大于 -gt >
小于 -lt <
大于或等于 -ge
小于或等于 -le
为空 -z
不为空 -n1、字符串判断
str1 != str2 当串str1和str2不等时为真
-n str1 当串的长度大于0时为真(串非空)
-z str1 当串的长度为0时为真(空串)
str1 当串str1为非空时为真
[ -z STRING ] "STRING" 的长度为零则为真。
[ -n STRING ] or [ STRING ] "STRING" 的长度为非零 non-zero则为真。
[ STRING1 == STRING2 ] 如果2个字符串相同。 "=" may be used instead of "==" for strict POSIX compliance则为真。
[ STRING1 != STRING2 ] 如果字符串不相等则为真。
[ STRING1 < STRING2 ] 如果 "STRING1" sorts before "STRING2" lexicographically in the current locale则为真。
[ STRING1 > STRING2 ] 如果 "STRING1" sorts after "STRING2" lexicographically in the current locale则为真。2、数字的判断
int1 -ne int2 两数不等为真
int1 -gt int2 int1大于int2为真
int1 -ge int2 int1大于等于int2为真
int1 -lt int2 int1小于int2为真
int1 -le int2 int1小于等于int2为真3、文件的判断
-e file 文件 file 已经存在
-s file 文件 file 大小不为零
-d file 文件 file 是一个目录
-c file 文件为字符特殊文件为真
-b file 文件为块特殊文件为真
-w file 文件 file 对当前用户可以写入
-x file 文件 file 对当前用户可以执行
-u file 文件 file 的 UID 标志被设置
-O file 文件 file 是属于当前用户的
-G file 文件 file 的组 ID 和当前用户相同
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。4、复杂逻辑判断
-o 或
! 非
################################################################################shell编程
DATEPATTERN="^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$"
if [[ "$STARTDATE" =~ $DATEPATTERN ]] && [[ $ENDDATE =~ $DATEPATTERN ]]; then :
else
echo "date format is invalid!"
exit;
fi
if [ "$i" == "mysql" ] || [ "$i" == "information_schema" ]; then
continue
fi