大约3周前因为工作需要开始接触并使用shell去编程,估计因为是一个合格的开发,新入手一门语言也并没有给我造成多大的恐慌。在解决实际问题后,一直想写下来学到的知识点以便未来某一天再用到会有新的心得,无奈,直到现在才能静心下来总结。
这次接触shell, 主要通过读项目shell的源码和公司内部shell学习PPT,以及解决需求过程中网上学习等这三个途径来深入的。
一.基本语法
我接触的shell, 具体说是bash
1.##!/bin/bash开头,作用是通知系统用哪种命令解释器执行脚本,这里用bash,当bash命令解释器执行这个脚本时,#作为注释行标识,该行已经完成它的任务了,所以不影响脚本执行
2.定义变量或常量,不区分变量还是常量(等号左右两边无空格,不以分号逗号结尾但回车换行),但区分作用域(local标识局部变量)
3.脚本赋予执行权限 chmod +x test.sh 执行脚本./test.sh
4.输出语句 echo "hello,world"
例如
#!/bin/bash
str="Hello World !"
echo "Hello World ! de length is ${#str}" #13 str长度
echo "${str}" #str内容
echo ${str} #str内容
5.常用基本语法结构 if case for
例如:
#!/bin/bash
if [ 2 < 10 ]; then
echo "小于"
else
echo "大于"
fi
if [ 2 -lt 10 ]; then
echo "小于"
else
echo "大于"
fi
6.函数、方法的定义和调用
7.字符串查找字符的方法
例如
#!/bin/bash
str="pachira is a great company"
echo `expr index "$str" r` #6
echo `expr index "$str" om` #21 从1开始算起,只计算0字符,并不匹配查找m字符
8.数组
例如:
#!/bin/bash
array1[0]=123
array1[1]=abcdefg
echo ${array1} #123 打印数组【0】
echo ${array1[*]} #123 abcdefg 打印数组
echo ${array1[@]} #123 abcdefg 打印数组
length1=${#array1[@]}
length2=${#array1[*]}
length3=${#array1[1]}
echo ${length1} #2 数组长度
echo ${length2} #2 数组长度
echo ${length3} #7 数组下标识1的字符串的长度
arrayValue=${array1[1]}
echo ${arrayValue} #abcdefg
echo ${#arrayValue} #7 数组下标识1的字符串的长度
9.从键盘获取输入的参数
目前我接触的是两种方式
第一种 脚本命令执行时直接空格跟着参数(多个参数空格分开),脚本代码使用$@,$1,$2等开给变量赋值后使用
第二种 脚本代码上控制从键盘中输入read -p
例如:
#!/bin/bash
read -p "input a:" a
read -p "input b:" b
total1=$((a+b)) #必须运算过后给$后多加一层(),不然有误
declare -i total2=$a+$b
echo -e "a + b is $total1 \n"
echo -e "a + b is $total2 \n"
10.脚本调试技巧
sh [-nvx] test.sh
-n:查询脚本编译错误,但是不执行
-v:执行脚本前会把整个脚本内容先显示出来后再打印结果
-x:每执行一步脚本,会先打印出这行脚本内容后再打印结果,只将用到的脚本内容显示出来
二.关于正则
关于正则,shell并不识别\d等代替具体数字的内容,必须换成[0-9]
三.关于日期转化
判断日期与正则的关系,举例(这里的例子里的正则并不严谨,只是作为例子看)
#!/bin/bash
datestr='2015-05-1'
if echo $datestr |grep -Eq "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}" && date -d $datestr +%Y%m%d >/dev/null
then
echo 'ok'
else
echo 'err'
fi
echo "datestr is ${datestr}"
四.关于&符号
&号,跟在shell脚本命令后(或者键盘输入或者代码里某行以&结尾)是让程序或这行在后台运行,不会自己停止的。
所以脚本如果使用含有&的参数,&后数据会取不到,并且脚本执行完后也并不结束而是在后台运行。