bash cheat book

index

变量&常量

  1. 引用时加上 $ 符号( 第一次赋值及在For循环的头部不用$符号 )
  2. BASH 中没有浮点,可借助awk
#!/bin/bash

# = 周围不能有空格
x=2015

name="lbk"
readonly name

#删除变量,不能删只读
unset x

# 字符串
# 单引号不会转义
# 双引号可以转义,可以有变量
echo "hellow ,${name}"
# 长度
echo ${#name}
# 截取 0 开始
echo ${name:1:2}

其它操作可以用 re  or awk
re='abc[A-Z]*.2'
[[ $stringZ =~ $re ]] && echo ${#BASH_REMATCH}

局部变量

#!/bin/bash
HELLO=Hello
function hello {
  local HELLO=World
  echo $HELLO
}

local HELLOHELLO是独立的

数组

# 空格隔开
array_name=(1 2 3)
echo ${array_name[0]}
# all element
echo ${array_name[@]}

# 取元素个数
len=${#array_name[@]}
# 或者
len=${#array_name[*]}
# 取单个元素的长度
len=${#array_name[n]}

运算

#let "x = $x + 1" 或者 x=`expr $x + 1`  注意引号,推荐给变量加{}
let "x = ${x} + 1"
x="current year is"$x
echo $x

算术运算符

运算符 说明 举例
+ 加法 expr $a + $b
- 减法 expr $a - $b
* 乘法 expr $a \* $b
/ 除法 expr $b / $a
% 取余 expr $b % $a
= 赋值 a=$b
== 比较两个数字 [ $a == $b ]
!= 比较两个数字 [ $a != $b ]

关系运算符

只支持数字,不支持字符串,除非字符串的值是数字。

运算符 说明
-eq 相等
-ne 不相等
-gt >
-lt <
-ge >=
-le <=

字符串运算符

运算符 说明 举例
= 相等
!= 不相等
-z len = 0 [ -z $a ]
-n len > 0 [ -n $a ]
str 空返回 true [ $a ]

文件测试运算符

操作符 说明
-b file 是否是块设备文件,是,则返回 true。
-c file 是否是字符设备文件,是,则返回 true。
-d file 是否是目录,是,则返回 true。
-f file 是否是普通文件(既不是目录,也不是设备文件),是,则返回 true。
-g file 是否设置了 SGID 位,是,则返回 true。
-k file 是否设置了粘着位(Sticky Bit),是,则返回 true。
-p file 是否是具名管道,是,则返回 true。
-u file 是否设置了 SUID 位,是,则返回 true。
-r file 是否可读,是,则返回 true。
-w file 是否可写,是,则返回 true。
-x file 是否可执行,是,则返回 true。
-s file 是否为空(文件大小是否大于0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,是,则返回 true。
file1 -nt file2 file1 比 file2更新
file1 -ot file2 file1 比 file2更老

流程控制

if

if..then..fi statement (Simple If)
if..then..else..fi statement (If-Else)
if..elif..else..fi statement (Else If ladder)
if..then..else..if..then..fi..fi..(Nested if)

i=5
if [ $i -gt 1 ];then
  echo '>1'
elif [ %i -eq 1 ];then
  echo '=1'
else
  echo '<1'
fi

for

for i in 1 2 3
do
    echo $i
done
#循环文件list
for file in `ls /etc`

如果for后面没有in [list]部分,则将遍历命令行的所有参数

while

while [ condition ]
do
  statments
done

until

until [ condition ]
do
  statments
done

case

echo "pls input sth"
read var
#字符变量用引号包起来
case "$var" in
  [a-z] ) echo "小写";;
  [A-Z] ) echo "大写";;
  [0-9] ) echo "数字";;
  [yY][eE][sS] ) echo "Your input is YES" ;;
  [nN][oO] ) echo "Your input is no" ;;
  * ) echo "呵呵。。";;
esac

break/continue

C lang

函数

function my_funcname {
  code block
}

或者

my_funcname() {
  code block
}

函数参数 $1 $2...
函数的返回值 $?

square() {
    re='^[0-9]+$'
    if ! [[ $1 =~ $re ]] ; then
         echo "error: Not a number"; exit 1
    fi
    let "res = $1 * $1"
    return $res

}

square $1
echo $?

输入参数

参数处理 说明
$n 1...n
$# 参数个数
$@ 始终把每个参数单独输出
$* 使用引号时 "$*"作为单一字符串
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 最后命令的退出状态。0 没错误,其他任何值表明有错误。

输入输出

文件描述符: 0 标准输入(STDIN),1 标准输出(STDOUT),2 是标准错误输出(STDERR)

命令 说明
command > file 输出重定
command < file 输入重定
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
a >& b 将输出合并
a <& b 将输入合并
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
# 只有标准输出
ls -al > STDOUT
# 2 表示只有错误重定向
ls -al 2> STDERR
# 标准错误输出和标准输出
ls -al > out_err 2>&1
# 丢弃输出
ls -al > STDOUT > /dev/null
ls -al > STDOUT 2>&-

echo

echo -e "OK! \n" # -e 开启转义 \n 换行
echo -e "OK! \c" # \c 不换行
echo '$1'

bash快捷键

关于bash在控制台下的快捷键

CMD 解释
ctrl+u 删除光标以前的所有字符
ctrl+d 删除光标以前的一个字符
ctrl+k 删除光标以后的所有字符
ctrl+h 删除光标以后的一个字符
ctrl+t 调换光标前两个字符的次序
ctrl+a 移动光标到最前面
ctrl+e 移动光标到最后面
ctrl+p 上一个命令
ctrl+n 下一个命令
ctrl+s 锁定输入
ctrl+q 解除锁定
ctrl+f 移动光标到后一个字符
ctrl+b 移动光标到前一个字符
ctrl+x 标记一个位置
ctrl+c 清除当前的输入

正则表达式

字符 功能
^ 置于待搜索的字符串之前,匹配行首的字
$ 置于待搜索的字符串之后,匹配行末的字
< 匹配一个字的字头

匹配一个字的字尾
. 匹配任意单个正文字符
[str] 匹配字符串 str 中的任意单个字符
[^str] 匹配不在字符串 str 中的任意单个字符
[a-c] 匹配从 a 到 c 之间的任一字符

  • 匹配前一个字符的 0 次或多次出现
    忽略特殊字符的特殊含义,将其看作普通字符

扩充的特殊字符:
字符 功能

  • 重复匹配前一项 1 次以上
    ? 重复匹配前一项 0 次或 1 次
    {j} 重复匹配前一项 j 次
    {j, } 重复匹配前一项 j 次以上
    {, k} 重复匹配前一项最多 k 次
    {j, k} 重复匹配前一项 j 到 k 次
    s | t 匹配 s 或 t 中的一项
    (exp) 将表达式 exp 作为单项处理
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • BASH的基本语法 ·最简单的例子—— Hello World! ·关于输入、输出和错误输出 ·BASH中对变量的...
    约落小宫山阅读 1,190评论 0 13
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,088评论 0 0
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,702评论 0 11
  • 丫头,今天你跟我说你跟你的第一个客户谈项目时,外面正下着你从未见过的瓢泼大雨,客户的项目数量翻倍了,有两个特别急....
    胡泉_hq阅读 326评论 7 8
  • 每一个人天生就是演员,在不同人面前扮演不同的角色。在父母面前,以乖乖子女或叛逆子女的角色和他们相处;在朋友面前...
    如是如是阅读 237评论 1 1