bash cheat book

index

  • 变量&运算符
    • 局部变量
    • 算术运算符
    • 关系运算符
    • 字符串运算符
    • 文件测试运算符
    • 数组
  • 流程控制
    • if
    • for
    • while
    • until
    • case
    • break/continue
  • 输入参数
  • 输入输出
  • bash快捷键

变量&常量

  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 作为单项处理

你可能感兴趣的:(bash cheat book)