目录
shell种类
Bourne shell(sh)
C shell(csh)
Korn shell(ksh)
Bourne Again shell(bash)
本文将使用linux中的bash
首先为了熟悉shell的编写规范,shell的一个小例子如下:
#!/bin/bash
#hello bash
date
该例子功能为打印日期(中文)。
第一行为了说明是哪种脚本语言
第二行一般为该程序功能的注释
之后就是脚本的编写了
注:脚本一般以.sh结尾;编写完脚本后要执行sudo chmod 0775(这里的权限可以自己规定一定要给脚本文件执行权限) 脚本文件名
shell基本语法
1.输出
#1.输出
echo "家目录"
echo "$HOME"
echo "当前目录"
pwd
echo "时间"
date
2.变量
临时变量:是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括:用户自定义变量、位置变量。
永久变量:是环境变量,其值不随shell脚本的执行结束而消失。
#2.定义变量
VAR1=20 #20是字符串
echo ${VAR1}haha #在变量进行取值时加{}
VAR2="w h g ${VAR1}" #""中可以识别特殊字符
echo ${VAR2}
VAR3='w h g ${VAR1}' #''中被认为是纯字符串
echo ${VAR3}
#字符串求长度
STRING='eweweefgew'
echo ${#STRING}
echo `expr length ${STRING}`
echo ${STRING:0} #从0位置开始输出
echo ${STRING:1}
declare -i A
declare -a B
declare -f C
declare -r D=4
A=1
B=2
C()
{
echo "我是函数"
}
#D=4 只读
echo ${A}
echo ${B}
C
echo ${D}
其它基本语法
代码如下:
#3.命令调用
TIME=`date` #``将内部识别为命令,并将返回结果给符号名
echo ${TIME}
#4.位置变量--用于传参数:$0-$9,一般$0保留不用 shift可以使位置变量左移
echo $0$1$2
#5.特殊变量(属于临时变量):$*所有参数,$#不算命令的参数个数,$!显示上一个调用后台命令的进程ID(不用),$?获取上一个命令的返回值,$$该进程ID
echo $*
echo $#
echo $!
echo $?
echo $$
#6.四则运算expr
echo `expr 3 + 5`
echo `expr 3 + 5 \* 2`
echo `expr \`expr 3 + 5\` \* 2` #注意转义
#7.test 和[ ]等价 test就是判断它后边的语句是真是假
test a = a #字符
test 1 -eq 1 #数字
test -a aaa #文件是否存在
#在单独使用时 -a代表逻辑或 -o代表逻辑与
#8.流程结构
#8.1 if单项选择
if test a = a
then
echo "真"
else
echo "假"
fi
#8.2 case
read VAR
case ${VAR} in
"1")
echo "一"
;; #相当于break
"2")
echo "二"
;;
esac
#8.3 for
for VAR in $1 $2
do
echo ${VAR}
done
for((VAR=0;VAR<10;VAR++))
do
echo ${VAR}
done
#8.4 while
while test 1
do
echo 1
done
until test -a "aaa" #条件假执行
do
echo 2
done
#9.select
select VAR in 1 2 3 4 5
do
echo ${VAR}
done
#10.函数
FUN()
{
select VAR in $1 $2 $3 $4 $5
do
echo ${VAR}
done
}
#调用
FUN $1 $2 $3 $4 $5
正则表达式
一个正则表达式包含下面一个或多个项:
-
一个字符集. 这里的字符集里的字符表示的就是它们字面上的意思.正则表达式最简单的情况就是仅仅由字符集组成,而没有其他的元字符.
-
锚. 一个锚指明了正则表达式在一行文本中要匹配的位置,例如^和$就是锚.
-
修饰符. 它们用于展开或缩小(即是修改了)正则表达式匹配文本行的范围.修饰符包括了星号,括号和反斜杠符号.
正则表达是的主要作用是用来文本搜索和字串操作。一个正则表达式匹配一个字符或是一串字符--完整的一串字符或是另外一个字符串的子串.
-
星号 -- * -- 匹配前一个字符的任意多次(包括零次)。
"1133*"匹配11 + 一个或更多的3 + 可能的其他字符: 113, 1133, 111312, 等等.
-
"13." 匹配13 + 至少一个任意字符(包括空格): 1133, 11333, 但不匹配 13 (因为少了附加的至少一个任意字符).
-
脱字符 -- ^ -- 匹配一行的开头,但依赖于上下文环境,可能在正则表达式中表示否定一个字符集的意思.
-
"^$" 匹配空行.
-
方括号 -- [...] -- 在正则表达式中表示匹配括号中的一个字符.
"[xyz]" 匹配字符x, y, 或z.
"[c-n]" 匹配从字符c到n之间的任意一个字符.
"[B-Pk-y]" 匹配从B到P 或从k到y的任意一个字符.
"[a-z0-9]" 匹配任意小写字母或数字.
"[^b-d]" 匹配除了从b到d范围内所有的字符. 这是正则表达式中反转意思或取否的一个例子。(就好像在别的情形中!字符所扮演的角色).
多个方括号字符集组合使用可以匹配一般的单词和数字模式。"[Yy][Ee][Ss]" 匹配yes, Yes, YES, yEs, 等等. "[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" 匹配社会安全码(Social Security number).
- 反斜杠字符 -- \ -- 转义 一个特殊的字符,使这个字符表示原来字面上的意思.
"\$"表示了原来的字面意思"$",而不是在正则表达式中表达的匹配行尾的意思.同样,"\\"也被解释成了字面上的意思"\".
-
转义"尖角号" -- \<...\> -- 用于表示单词的边界.
尖角号必须被转义,因为不这样做的话它们就表示单纯的字面意思而已.
"\<the\>" 匹配单词"the",但不匹配"them", "there", "other", 等等.
-
扩展的正则表达式.
-
增加了一些元字符到上面提到的基本的元字符集合里. 它们在egrep,awk和Perl中使用.
-
转义"大括号" -- \{ \} -- 指示前面正则表达式匹配的次数.(awk中没有)
要转义是因为不转义的话大括号只是表示他们字面上的意思。这个用法只是技巧上的而不是基本正则表达式的内容。
"[0-9]\{5\}" 精确匹配5个数字 (从 0 到 9的数字).
-
圆括号 -- ( ) -- 括起一组正则表达式.
-
竖线 -- | -- "或"正则操作符用于匹配一组可选的字符.
-
POSIX字符类. [:class:]
这是另外一个可选的用于指定匹配字符范围的方法。
-
[:alnum:] 匹配字母和数字.等同于A-Za-z0-9.
-
[:alpha:] 匹配字母. 等同于A-Za-z.
-
[:blank:] 匹配一个空格或是一个制表符(tab).
-
[:cntrl:] 匹配控制字符.
-
[:digit:] 匹配(十进制)数字. 等同于0-9.
-
[:graph:] (可打印的图形字符). 匹配 ASCII 码值的33 - 126之间的字符. 这和下面提到的 [:print:]一样,但是不包括空格字符.
-
[:lower:] 匹配小写字母. 等同于a-z.
-
[:print:] (可打印字符). 匹配 ASCII码值 32 - 126之间的字符. 这和上面提到的一样[:graph:],但是增多一个空格字符。
-
[:space:] 匹配空白字符 (空格符和水平制表符).
-
[:upper:] 匹配大写字母. 等同于A-Z.
-
[:xdigit:] 匹配十六进制数字. 等同于0-9A-Fa-f.
grep [[:digit:]] test.file
-
关于grep、awk、sed用法的具体介绍见https://blog.csdn.net/hhwhg123/article/details/99697265
-
关于Linux下的Cmd命令介绍见https://blog.csdn.net/hhwhg123/article/details/99705381