版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
内建变量与特殊符号
$0,$1/$2..$0
指当前执行的脚本名称,$1、$2...指第N个脚本参数
$#
命令行或者是位置参数的个数
"$*"
把命令行的所有参数用一个字符串表示("$1$2…")
"$@"
命令行的所有参数都是独立表示("$1""$2"…)
$-
显示shell使用的当前选项,与set命令功能相同
$?
上一条命令执行后的回传值,如果执行成功,回传值为0
$$
当前执行进程的ID
$!
最后执行的后台命令的进程ID
1、注释符#
除了#!/bin/bash里的#特殊
2、美元符$ 变量符。
与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。
变量字符长度超过1个时,用{}括起来
3、单引号
被引起的字符全部做普通字符,即全部原样
在单引号括起来的字符串中,反斜线也成为普通字符,而失去转义字符功能。
echo ‘my $SHELL’
4、双引号
引号内的内容,除$ 转义符\ 倒引号` //`
这三个保留特殊功能,其他字符均做普通字符。
5、倒引号(数字1键旁边的那个键)
引号内的字符串当做shell命令行解释执行,
得到的结果取代整个倒引号括起来的部分。
6. 反斜线 转义字符
把特殊字符变成普通字符。
在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
.. 上一层目录,与cd命令配合用得比较多
. 目前工作的目录
* 任意长度的字符
? 长度为一个的任意字符
[..] 括号内的一个字符
\m 等于某个通配符,如*、?等
[a-z] *小写字母开头的所有字符串
\ 转义符号,用以解除特殊字符的特殊意义
~ 用户目录
; 分隔符,当命令行有多个命令时,做分隔用
$ BourneShell的提示符,同时也作为shell语言的位置变量参数
# 做注释用
| 建立一个管道,使一命令的输出作为另一个命令的输入
& 将命令以后台方式执行
> 将命令的输出重导入文件中
< 将命令的输入流指定为由文件中加载,和>相反
>> 将命令的输出加在一个已经存在的文件后面
{..} 括号内的一个字符串
数值处理
num1 –eq num2 如果num1等于num2,测试结果为真
num1 –gt num2 如果num1大于num2,测试结果为真
num1 –lt num2 如果num1小于num2,测试结果为真
num1 –ge num2 如果num1大于或等于num2,测试结果为真
num1 –le num2 如果num1小于或等于num2,测试结果为真
num1 –ne num2 如果num1不等于num2,测试结果为真
expr命令
r=`expr 4 + 5`
r=`expr 40 -5`
r=`expr 4 \* 5` // \* 才表示*
r=`expr 40 / 5`
r=`expr 100 % 43`
注:expr不支持乘幂
$(())命令
r=$(( 4 + 5 ))
r=$(( 40 -5 ))
r=$(( 4 * 5 ))
r=$(( 40 / 5 ))
r=$((100 % 43))
r=$(( 2 ** 3 ))
$[]命令
r=$[ 4 + 5 ]
r=$[ 40 -5 ]
r=$[ 4 * 5 ]
r=$[ 40 / 5 ]
r=$[100 % 43]
r=$[ 2 ** 3 ]
let命令
let "r = 4+5"
let "r = 40 -5"
let "r = 4 * 5"
let "r = 40 / 5"
let "r = 100 % 43"
let "r = 2**3"
注:不带引号时,=两边不能有空格
字符串----简单正则
字符串常量
[:alpha:]
匹配当前归类中的大写和小写字母字符
'[0-9]{3}[[:alpha:]]{2}'匹配三个数字,后跟两个字母
[:alnum:]
匹配当前归类中的数字、大写和小写字母符
'[[:alnum:]]+'匹配含有一个或多个字母和数字的字符串
[:digit:]
匹配当前归类中的数字
'[[:digit:]-]+'匹配含有一个或多个数字或横线的字符串
[:lower:]
匹配当前归类中的数字匹配当前归类中的小写字母字符。
'[[:lower:]]'不匹配A,因为A 为大写
[:space:]
匹配单个空格(' ')
[[:space:]]空白字符
[:upper:]
匹配当前归类中的大写字母字符
'[[:upper:]ab]'与以下其中一项匹配:任何大写字母、a 或b。
[:whitespace:]
匹配一个空白字符空格、制表符、换页符和回车符
[:ascii:]
匹配任何七位的ASCII 字符控制字符包括换行符、换页符、退格符
[:blank:]
匹配一个空白区或水平制表符
[[:blank:]]等效于[ \t]
字符串匹配(定位,判断,替换)
\b匹配一个单词边界,是指单词和空格间的位置。
例:“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
echo "never verb" |xargs -n1 |grep "er\b"
^ 匹配字符串开头
例:匹配以abc开头的行:
echo –e “abc\nxyz”|grep –E ^abc
$ 匹配字符串结尾
例:匹配以xyz结尾的行
echo –e “abc\nxyz”|grep –E xyz$
* 0到无数次
+ 1到无数次
? 0或者1 次
{n} 重复N次
{n,} 重复至少N次
{n,m} n到m次
[] 字符组,字符范围
() 捕获组(子表达式)
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
email地址的正则表达式可以写成
^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$
分析:
^[a-zA-Z0-9_]+
@
[a-zA-Z0-9_]+
\.
[a-zA-Z0-9_]+$
匹配腾讯QQ号:[1-9][0-9]{4,}
. 除换行以外的其他任意字符
\s 空白字符——[ \f\n\r\t\v]
\S 除空白字符以外的任意字符——[^ \f\n\r\t\v]
\w 字母、数字、下划线——[A-Za-z0-9_]
\W 除了字母、数字、下划线以外的任意字符——[^A-Za-z0-9_]
\d 数字0-9——[0-9]
\D 除了数字之外的任意字符——[^0-9]
-n string 测试字符串string是否不为空
-z string 测试字符串string是否为空
String1=string2 测试字符串string1是否与字符串string2
相同
String1!=string2 测试字符串string1是否与字符串string2
不相同
注意:字符串比较时建议字符串变量要使用双引号,即使变量为空,也要使用双引号;
${#string}
$string的长度
${string:position}
在$string中,从位置$position开始提取子串
${string:position:length}
在$string中,从位置$position开始提取长度为$length的子串
${string#substring}
从变量$string的开头,删除最短匹配$substring的子串
${string##substring}
从变量$string的开头,删除最长匹配$substring的子串
${string%substring}
从变量$string的结尾,删除最短匹配$substring的子串
${string%%substring}
从变量$string的结尾,删除最长匹配$substring的子串
${string/old/new}
使用$new,来代替第一个匹配的$old
${string//old/new}
使用$new,代替所有匹配的$old
${string/#old/new}
替换开头.如果$string以$old开头,那么就用$new替换
${string/%old/new}
替换结尾.如果$string以$old结尾,那么就用$new替换
复合条件
! expression
如果expression为假,则测试结果为真。!与表达式之间要有空格
expression1 –a expression2
如果expression1和expression2同时为真,则测试结果为真
expression1 –o expression2
如果expression1和expression2有一个为真,则测试结果为真
结构化控制:
分支结构:
if语句: if then else提供条件测试
Case语句:允许匹配模式、单词或值
循环结构:
for:每次依次处理列表内的信息,直至循环耗尽。
until:条件在循环末尾,至少执行一次。
while:条件在循环头部。
continue:继续执行下一次循环。
break:结束循环,继续执行循环后面的命令。
格式1:
if[ 条件 ]
then
命令
fi
格式2:
if[ 条件] ; then 命令
fi
格式3:
if [ 条件]
then
命令1
else
命令2
fi
格式4:
if [ 条件1 ]
then
命令1
elif[ 条件2 ]
then
命令2
else
命令3
fi
case格式:
case 值 in
模式1)
命令1
;;
模式2)
…
*)
命令n
;;
esac
//取值后面必须为单词in,每一个模式必须以右括号结束。取值可以为变量或常数。
//取值检测匹配的每一个模式,一旦模式匹配,其间所有命令开始执行直至;;
//*****执行完匹配模式相应命令后不再继续其他模式。
//如果无一匹配模式,使用*号捕获该值。
for格式1
for 变量名 in 列表
do
命令
done
for格式2:
for ((变量=初始值;条件判断;变量变化))
do
命令
done
例子:
s=0
for ((i=1;i<=100;i++))
do
s=$((s+i))
done
echo $s
while格式:
while 条件
do
命令
done
//while循环用于不断执行一系列命令,也用于从输入文件中读取数据。
//虽然通常只有一个命令,但在while和do之间可以放几个命令。
//命令通常用作测试条件,
//只有当命令的退出状态为0时,do和done之间命令才被执行,
//如果退出状态不是0,则循环终止。
until格式
until 条件
do
命令
done
until 执行一系列命令,直至条件为真时停止。
break和continue可以在for、while、until循环中产生中断
break把控制权转交给done之后的语句,从而跳出循环。
continue命令把控制权交给done语句,继续执行写一次循环。
输入输出
Linux启动后,会默认打开3个文件描述符,分别是:
标准输入:standard input 0。
从键盘输入数据,即从键盘读入数据。
正确输出:standard output 1。
把数据输出到终端上。
错误输出:error output 2。
标准错误输出到终端上。
重定向分为输入重定向与输出重定向。
输入重定向:输入不从键盘读入,而是从文件输入或其它。
输出重定向:不输出到终端上,而是输出到文件中去或其它。
键盘 /dev/stdin0 标准输入
显示器 /dev/stdout1 标准输出
显示器 /dev/stderr2 标准错误输出
“<”:输入重定向运算符,如果文件不存在会自动建立一个文件,如果第二次输入时,会覆盖前一次的输入内容。
“>>”:表示把第二次的输出内容追加到文件中去,而不是覆盖。
“>”:输出重定向运算符。
用文件的内容为变量赋值
read a < 1.txt
echo $a
标准输出重定向 命令>文件 覆盖方式
命令>>文件 追加方式
标准错误输出重定向
错误命令2>文件 覆盖方式
错误命令2>>文件 追加方式
正确输出和错误输出保存到同一个文件
命令>文件 2>&1 覆盖方式
命令>>文件 2>&1 追加方式
命令 &>文件 覆盖方式
命令 &>>文件 追加方式
命令>>文件1 2>>文件2
&>/dev/null
//将标准输出和错误输出全部重定向到/dev/null中
//也就是将产生的所有信息丢弃.
cat filename >/dev/null
rm filename1 2>/dev/null
rm filename1 >/dev/null 2>&1
cat /dev/null > filename
ls –l >/dev/null 2>&1 === &>/dev/null
函数
函数由两部分组成:1.函数名; 2.函数体
函数与脚本中的一段代码 的区别:
执行函数时,它保留当前shell和内存信息。
如果执行或调用一个脚本文件中的另一段代码,将创建一个单独的shell,因而去除所有原脚本中定义的变量。
函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。
必须在调用函数地方之前,声明函数,shell脚本是逐行运行。
调用函数仅使用其函数名即可,要传给函数的变量跟在函数后面。
函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。
函数名()
{
. . .
}
function 函数名()
{
…
}