index
变量&常量
- 引用时加上
$
符号( 第一次赋值及在For循环的头部不用加$
符号 )- 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 HELLO
和HELLO
是独立的
数组
# 空格隔开
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 作为单项处理