1、shell介绍
1)shell是软件系统提供给用户的操作命令行,其本质就是一个用于人机交互的一种方式,它可以是简单的命令行,也可以是复杂的UI界面。
2)shell可以作为终端命令行的形式和操作系统进行交互和可以和uboot进行交互操作。
3)无论是shell作为简单的命令行终端还是复杂的UI界面都存在解决不了的问题:例如我们需要创建1000名字不同的.txt文件,这样如果单纯的应用shell命令或操作界面都是比较复杂的。因此,就产生了可以批量操作的shell语言(脚本语言)
2、shell语言介绍
1)分类:sh , bash, csh,ksh, perl, python等脚本语言
2)一般使前面几种是较简单的,适用于系统管理相关的,而后面的perl, python适用于网络配置等相关的。
3)脚本语言的执行和c/c++ 又所不同,c/c++ 的语言执行通常是要经过编译、链接然后才能执行,但是脚本语言在写好后就可以直接执行了,是不需要对其进行编译和链接的。
4)脚本语言的执行机制主要是解释执行,其本质就是顺序结构,即行代码都被单独的解释然后再去执行这行代码。
3、编写shell代码
1)脚本的执行方法常见的又三种(都是再Liunx下直接写命令):
例如:./hello.sh
bashhello.sh
sourcehello.sh
2)shell的编写:
一般第一行都是: #!/bin/sh #这句话的意思是用/bin下的sh解释器来执行这个.sh文件。
脚本中的注释一般用:# 开头,# 只能对本行的代码起作用,如果要多行注释,需要每行的开的头都以 # 开头。
shell正文语句:
echo "hello word" #echo 本身就可以在Linux下执行并输出,这里写在shell脚本的正文里面只是方便统一执行而已。
3)shell的语法规则
1> shell的语法规则十分麻烦,很多时候空格是不能随便加的。例如:赋值的时候等号(=)两边不能随便加空格。
空格的应用注意:
1、等号两边不能加等号。例如: a=b, 不能写成 a =b.
2、中括号内部必须加空格。例如:["a"="b" ], 不能写成["a"="b"]。
3、
2> shell是弱类型语言,也就是在对变量而言是没有变量类型这一说法的。
shell中的变量定义和赋值可以同时进行,例如:a="hello" 就是直接定义了一个变量a并给它赋值了。
3> shell中对变量的引用必须在变量前面加上$,否则不会输出这个变量的值,只会输出这个变量的名字。例如:echo $a(输出hello), echo a(输出a)
4> 各种符号的应用:
符号 |
符号用法说明 |
"" |
双引号,对于shell而言,双引号是打印字符串必须的,但不是唯一的。在双引号内不能直接包含转义字符串,例如:"$a$b",这样是不能直接打印出$a$b的,因为$这个符号会被认为是对变量的引用,进而认为a,b都是一个变量。然而这两个变量并没又被定义和赋值,因此将会打印一行空白出来。如果想要打印出$这个符号,需要这样"\$a \$b",此时将会打印出$a $b这几个字符,\ 将不会被打印出来。 |
'' |
单引号,可以作为打印字符串的符号,而此时它和双引号的区别就是可以无视转义字符,例如:'$ \a $b ',这样就可以完全按照单引号内的内容打印了,打印出来的将是 $ \a $b ,原封不变。 |
`` |
反引号,(注意是键盘左上角和 ~ 在一个键位上的) |
[] |
|
() |
|
\ |
反斜杠用在""内部用于输出一些特定的字符,例如:\$, \`, \", \\。 通过在要输出的字符前面加\得以输出真正的字符,上面的例子依次输出为:$, `, ", \ 。 |
| |
管道,管道的作用就是将 | 前面个的内容输出后的内容和它后面的内容做一个处理,以得到最终要得到的那个内容。 |
5> shell的选择分支结构:
if语句:
典型格式:
if [表达式]; then # 固定格式
xxx # 需要执行的内容
else
xxx
fi #结束标记
应用方法:
[ ]内部为要判断的内容,一般可以做以下几种判断:
符号名 |
符号作用 |
-f |
判断文件是否存在 |
-d |
判断目录(文件夹)是否存在 |
"str1"="str2" |
判断字符串是否相等,注意是用一个等号 |
!= |
不等于,用于整形或字符串的比较,如果用在[]中则只能用于字符串的比较 |
< |
小于,用于整形或字符串的比较,如果用在[]中则只能用于字符串的比较 |
> |
大于,用于整形或字符串的比较,如果用在[]中则只能用于字符串的比较 |
-eq |
equal 判断数字是否相等。用于整形比较 |
-ne |
not equal 不等于 |
-gt |
greater than 大于 |
-lt |
less than 小于 |
-ge |
greater or equal 大于等于 |
-le |
less or equal 小于等于 |
-z |
zero 判断是否为空,注意,判断的变量本身也一定要是存在的,否则将不成立。 |
-n |
not zero 非空字符串 |
-o |
or 表示逻辑或 |
-a |
and 表示逻辑与 |
if语句应用举例:
判断文件是否存在:
if [ -f a.txt]; then
echo "yes"
else
echo "no"
fi
判断字符串内容
str="abc"
if [ $str="abc" ]; then
echo"yes"
else
echo"no"
fi
判断字符串是否为空
str="abc"
if [ -z $str ]; then
echo"yes"
else
echo"no"
fi
判断数字是否相等
str=121
if [ $str -eq 111 ]; then
echo"yes"
else
echo"no"
fi
if语句简写形式:
||和&&的执行原理:
||和&&的用法和C语言中的差不多,但是在shell中的功能有点不太一样。
首先它们还是按照从左向右的顺序执行的,例如 a=0 || b=0,当左边a=0成立的时候右边的b=0将不会被判断,而直接被忽略掉。只有左边不成立的时候,右边的才会被执行,&&与此相反。我们在shell中就是利用了这样的一个特性来实现if语句的功能的。
典型格式:
["$star = "1" ] && ckssl="--ssl"
解析:当star=1成立时,ckssl="--ssl"才会被执行,于是乎他就可以代替
if ["$str = "1" ]; then
ckssl="--ssl"
fi
case语句:
典型格式:
case 判断数 in
esac
echo 'Input a number between 1 to 4'
echo 'Your number is:\c'
read aNum
case $aNum in
1) echo'aNum = 1' ;;
2) echo'aNum = 2' ;;
3) echo'aNum = 3' ;;
4) echo'aNum = 4' ;;
esac
注意:结尾要加esac,每句的结尾要加;; ,shell的case语句和C语言中显著不同的一点是每句的结尾没有break ,它是默认自动跳出的。
6> shell的循环语句:
for语句:
#!/bin/bash
for x in one two three four
do
echonumber $x
done
while语句:
#!/bin/bash
myvar=1
while [ $myvar -le 10 ]
do
echo $myvar
myvar=$(( $myvar + 1))
done
until语句:
#!/bin/bash
myvar=1
until [ $myvar -gt 10 ]
do
echo $myvar
myvar=$(( $myvar + 1 ))
done
shift的应用:
shift在shell中的应用相当于是左移一位的作用,我们可以用它来做自减运算。
例如:
#!/bin/bash
while [ $# != 0 ];
do
echo "第一个参数为:$1,参数个数为:$#"
shift
done
一般shift常用在循环语句中,作为在不知道出入参数个数的情况下依次遍历每个参数然后进行相应的处理(常见Liunx启动脚本)。
break的应用:
break的使用和C语言中类似,也是用于结束循环。这不过这里如果用在case语句中的话,是用来结束整个循环的,而不是用来结束case循环的。因此,它常用于循环语句。