任何一门编程语言,都是分为几个部分,把每个部分学习明白了,剩下的就是靠代码量来巩固自己编程能力了。
同其他编程语言一样,shell大体分为几个部分
1、变量
2、逻辑操作
3、循环结构
4、函数
5、正则表达式
本文将简单介绍这五个部分,让你初步学会shell。至于学精shell,就需要自己多写代码,多看代码了。
一、变量
1、字符类型变量的赋值 shell里数值类型变量与字符类型变量同类,只有在使用的时候会加以区分。
变量名=值 注意:等号两边不允许有空格
var1=abc
var2=”abc”
var3=10
变量的使用 美元符加变量名
echo $var1
echo ${var2}
echo ${#var2} 获取变量的长度
2、数组
赋值:
arr_var=(1 2 e d 4 5)
或
arr_var[0]=1
arr_var[1]=2
arr_var[2]=e
arr_var[3]=d
arr_var[4]=4
arr_var[5]=5
使用:
echo ${arr_var[1]} 获取第二个数组元素 2
echo ${arr_var[3]} 获取第四个数组元素 d
echo ${#arr_var[*]} 获取数组元素的个数 6
echo ${arr_var[*]} 以清单的方式打印数组 1 2 e d 4 5
3、日期类型变量
shell里使用 date 命令获取系统时间,date可以使用一些参数来格式化输出
如:
date +%Y%m%d 打印系统当前日期: 20191202
date "+%Y%m%d %H%M%S" 打印系统当前时间: 20191202 142847
date "+%Y-%m-%d %H:%M:%S" 带一些格式符号打印系统当前时间 2019-12-02 14:28:47
使用变量获取时间:
my_date=$(date "+%Y%m%d %H%M%S") my_date 的结果是 20191202 142847
至此,shell的变量部分完毕。
3、常用字符串操作
${#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/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring
${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
例:
a=asdfghjkl
echo ${#a} 9
echo ${a:7} kl
echo ${a:2:7} dfghjkl
string=abc12342341
echo ${string#a*3} //42341 从$string左边开始,去掉最短匹配子串
echo ${string#c*3} //abc12342341 这样什么也没有匹配到
echo ${string#*c1*3} //42341 从$string左边开始,去掉最短匹配子串
echo ${string##a*3} //41 从$string左边开始,去掉最长匹配子串
echo ${string%3*1} //abc12342 从$string右边开始,去掉最短匹配子串
echo ${string%%3*1} //abc12 从$string右边开始,去掉最长匹配子串
二、逻辑操作
1、变量运算:
shell里如果想使用变量运算,需使用如下四种方式,否则,就是普通的字符串连接。
num1=10
num2=23
let plus=$num1+$num2
plus=$[ $num1 + $num2 ]
plus=$(( $num1 + $num2 ))
plus=`expr $num1 + $num2`
2、变量的比较
a、数值比较
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
以上是shell里数值比较运算符,注意是数值比较,shell比较特殊,数值在比较和运算的时候必须使用特定的写法,不然会将数值做字符串处理。在字符串里10大于23,而在数值里10小于23。
b、字符串比较
== 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
字符串比较跟其他编程语言类型,比较直观。
3、条件判断 if
具体用法和注意事项直接看例子
如例: com.sh
num1=10
num2=23
#字符串比较
if [ $num1 > $num2 ];then #if两边的中括号里侧,必须有空格。右边必须有分号,必须有then。(如果把then放在下一行可以没有分号)
echo "字符串[ $num1 ]比字符串[ $num2 ]大。"
elif [ $num1 < $num2 ];then #注意elif的写法
echo "字符串[ $num1 ]比字符串[ $num2 ]小。"
else
echo "字符串[ $num1 ]与字符串[ $num2 ]相等。"
fi #if语句块结束的时候,必须有一个对应的结束的反if,也就是必须要用 fi
#数值比较
if [ $num1 -gt $num2 ];then
echo "数值[ $num1 ]比数值[ $num2 ]大。"
elif [ $num1 -lt $num2 ];then
echo "数值[ $num1 ]比数值[ $num2 ]小。"
else
echo "数值[ $num1 ]与数值[ $num2 ]相等。"
fi
执行 sh com.sh
结果:
字符串[ 10 ]比字符串[ 23 ]大。
数值[ 10 ]比数值[ 23 ]小。
三、循环结构
for while until 三种循环
直接上例题,注意的地方在例题里有注解。
**a、for循环**
for line in a b c #for循环,变量依次被循环列表赋值,do done是循环体里的必须元素。
do
echo $line
done
**b、while循环**
a=3 # while 当。。。为真时,do something,直到为假结束循环,do done必不可少。
while ((a < 12))
do
echo $a
a=$[$a + 1]
done
**c、until循环**
a=12 # until 当。。。为假时,do something,直到为真结束循环,do done必不可少。
until ((a < 8))
do
echo $a
a=$[$a - 1]
done
四、函数
shell里函数创建方法:
function 函数名(){
函数体
}
或 直接写函数名,省略function关键字
函数名(){
函数体
}
例:
add(){ #创建函数
sum=$[$1 + $2] # $1 $2为函数的第一个参数和第二个参数
echo $sum
}
add 1 3 # 调用函数 传参 1 3 结果打印 4
add 2 7 # 调用函数 传参 2 7 结果打印 9
五、正则表达式
正则表达式就是描述一段文本的匹配规则,这个在很多编程语言里都有应用。
如下是对正则的一些用法举例:
grep -v -E ‘^$’ test_exp1.dat
#去掉空行
grep -E ‘(xiao){3}’ test_exp1.dat
#找出包含连续三次xiao字符的行
grep -E ‘^I’ test_exp1.dat
#找出以I开头的行
grep -E ‘^’ test_exp1.dat
#找出包含字符^的行
grep -E ‘^^’ test_exp1.dat
#找出以字符^开头的行
grep -E ‘0[0-9]{2}-[0-9]{8}’
#找出匹配010-12345678这样的类似包含区号及电话号的合法电话号码。
正则还有很多功能,这里只列举一些功能来描述正则的用法,他在awk和sed里都有很广泛的应用,在变量匹配的地方也会使用到正则。
希望本文对你学习shell有所帮助。