1、shell脚本其实是一类语言而不是一个语言,常用shell语言:sh、bash、python等。
2、执行shell程序 source xx.sh(source是linux的一个命令)
3、shell程序的第一行一般都是: #!/bin/sh
这行话以#!开始,后面加上一个pathname,的意思就是指定shell程序执行时被哪个解释器解释执行
/bin/sh意思就是这个shell将来被当前机器中/bin目录下的sh可执行程序执行
4、shell是弱类型语言。在shell编程中定义变量不需要制定类型,也没有类型这个概念。
5、shell中赋值的=两边是不能有空格的,每句话结束也不加分号。
6、变量引用。shell中引用一个变量必须使用$符号
$符号后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会报错,
而是把这个变量解析为空。也就是说在shell中没有被定义的变量其实就相当于是一个定义并赋值为空的变量。
7、shell中使用字符串可以不加双引号,直接使用。而且有空格时也可以,但是缺陷是不能输出 "或者 其他转义字符。
shell中也可以使用单引号来表示字符串,也是直接使用的,不能输出转义字符。
举例说明:
var="hello"
echo var 打印var
echo $var 打印hello
echo "hello\"" 打印hello\
echo 'hello\"' 打印hello\"
var="hello"
echo $varyou 什么都不打印
echo ${var}you 打印helloyou
8、关于shell中调用linux命令
(1)直接执行
(2)反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),
这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令。
举例:
PWD=`pwd`
echo $PWD
执行结果:
/mnt/hgfs/winshare/uboot
MYPATH="`pwd`/include"
MYPATH2='`pwd`/include'
echo "MYPATH = $MYPATH"
echo "MYPATH2 = $MYPATH2"
执行结果:
MYPATH = /mnt/hgfs/winshare/uboot/include
MYPATH2 = `pwd`/include
9、典型if语言格式
if [表达式]; then
xxx
yyy
zzz
else
xxx
ddd
uuu
fi
判断文件是否存在。(-f),注意[]里面前后都有空格,不能省略。
判断目录是否存在 (-d)
判断字符串是否相等("str1" = "str2"),注意用一个等号而不是两个(=只能判断字符串是否相等,不能用来判断数字)
判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)
举例说明:
if [ -f a.c ];then
echo "yes"
else
echo "no"
touch a.c
fi
第一次执行:no
第二次执行:yes
判断字符串是否为空(-z)注意-z判断时如果变量本身没定义也是不成立(也就是说-z认为没定义不等于为空)
if [ -z $str ];then
echo "yes"
else
echo "no"
fi
执行结果:no
str=""
if [ -z $str ];then
echo "yes"
else
echo "no"
fi
执行结果:yes
str="123"
if [ -z $str ];then
echo "yes"
else
echo "no"
fi
执行结果:no
9.1 if判断式中使用“-o”表示逻辑或
举例说明:
if [ 11 -eq 2 -o "123" = "qqq" ]; then
echo "yes"
else
echo "no"
fi
执行结果:no
if [ 11 -eq 2 -o "qqq" = "qqq" ]; then
echo "yes"
else
echo "no"
fi
执行结果:yes
10、逻辑与&&和逻辑或||与简写的if表达式相结合
[ -z $str ] || echo "fei kong"
执行结果:fei kong
11、循环结构
11.1 for
for i in 1 2 3 4 5
do
echo $i
done
执行结果:
1
2
3
4
5
11.2、while循环
要注意很多格式要求,譬如:while后面的[]两边都有空格,[]后面有分号分号(如果do放在一行的话),
i++的写法中有两层括号。
i=1
j=5
while [ $i -lt $j ];do
echo $i
i=$(($i + 1))
done
执行结果:
1
2
3
4
12、echo的创建和追加输入文件
(1)在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中。
创建文件并输入内容的关键就是>。
(2)还可以使用echo指令配合追加符号>> 向一个已经存在的文件末尾追加输入内容。
echo "test" > a.txt #在当前目录下创建一个a.txt文件 再将""中的内容写到这个文件中
echo "追加的内容" >> a.txt #往一个已经存在的文件中追加输入内容
13、case语句
(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异
(2)不需要带break
(3)具体格式如下
var=2
case $var in
1) echo "1" ;;
2) echo "2" ;;
esac
14、shell传参
$#表示调用该shell时传参的个数。($#计数时只考虑真正的参数个数)
$0、$1、$2·····则依次表示传参的各个参数。
C语言:./a.out aa bb cc argc = 4, argv[0] = ./a.out, argv[1]是第一个有效参数····
shell:source a.sh aa bb cc $# = 3, $0是执行这个shell程序的解析程序的名字
(例如我们使用bash则$0就是bash),$1是第一个有效参数的值,$2是第2个有效参数的值·····
15、shell中的$# $1等内置变量的值不是不可变的,而是可以被改变,被shift指令改变。
shift指令有点像左移运算符,把我们给shell程序的传参左移了一个移出去了,
原来的$2变成了新的$1,原来的$#少了1个。
举例说明:
echo $# $1
shift
echo $# $1
运行:
source a.sh aa bb cc
结果:
3 aa
2 bb
2、执行shell程序 source xx.sh(source是linux的一个命令)
3、shell程序的第一行一般都是: #!/bin/sh
这行话以#!开始,后面加上一个pathname,的意思就是指定shell程序执行时被哪个解释器解释执行
/bin/sh意思就是这个shell将来被当前机器中/bin目录下的sh可执行程序执行
4、shell是弱类型语言。在shell编程中定义变量不需要制定类型,也没有类型这个概念。
5、shell中赋值的=两边是不能有空格的,每句话结束也不加分号。
6、变量引用。shell中引用一个变量必须使用$符号
$符号后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会报错,
而是把这个变量解析为空。也就是说在shell中没有被定义的变量其实就相当于是一个定义并赋值为空的变量。
7、shell中使用字符串可以不加双引号,直接使用。而且有空格时也可以,但是缺陷是不能输出 "或者 其他转义字符。
shell中也可以使用单引号来表示字符串,也是直接使用的,不能输出转义字符。
举例说明:
var="hello"
echo var 打印var
echo $var 打印hello
echo "hello\"" 打印hello\
echo 'hello\"' 打印hello\"
var="hello"
echo $varyou 什么都不打印
echo ${var}you 打印helloyou
8、关于shell中调用linux命令
(1)直接执行
(2)反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),
这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令。
举例:
PWD=`pwd`
echo $PWD
执行结果:
/mnt/hgfs/winshare/uboot
MYPATH="`pwd`/include"
MYPATH2='`pwd`/include'
echo "MYPATH = $MYPATH"
echo "MYPATH2 = $MYPATH2"
执行结果:
MYPATH = /mnt/hgfs/winshare/uboot/include
MYPATH2 = `pwd`/include
9、典型if语言格式
if [表达式]; then
xxx
yyy
zzz
else
xxx
ddd
uuu
fi
判断文件是否存在。(-f),注意[]里面前后都有空格,不能省略。
判断目录是否存在 (-d)
判断字符串是否相等("str1" = "str2"),注意用一个等号而不是两个(=只能判断字符串是否相等,不能用来判断数字)
判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)
举例说明:
if [ -f a.c ];then
echo "yes"
else
echo "no"
touch a.c
fi
第一次执行:no
第二次执行:yes
判断字符串是否为空(-z)注意-z判断时如果变量本身没定义也是不成立(也就是说-z认为没定义不等于为空)
if [ -z $str ];then
echo "yes"
else
echo "no"
fi
执行结果:no
str=""
if [ -z $str ];then
echo "yes"
else
echo "no"
fi
执行结果:yes
str="123"
if [ -z $str ];then
echo "yes"
else
echo "no"
fi
执行结果:no
9.1 if判断式中使用“-o”表示逻辑或
举例说明:
if [ 11 -eq 2 -o "123" = "qqq" ]; then
echo "yes"
else
echo "no"
fi
执行结果:no
if [ 11 -eq 2 -o "qqq" = "qqq" ]; then
echo "yes"
else
echo "no"
fi
执行结果:yes
10、逻辑与&&和逻辑或||与简写的if表达式相结合
[ -z $str ] || echo "fei kong"
执行结果:fei kong
11、循环结构
11.1 for
for i in 1 2 3 4 5
do
echo $i
done
执行结果:
1
2
3
4
5
11.2、while循环
要注意很多格式要求,譬如:while后面的[]两边都有空格,[]后面有分号分号(如果do放在一行的话),
i++的写法中有两层括号。
i=1
j=5
while [ $i -lt $j ];do
echo $i
i=$(($i + 1))
done
执行结果:
1
2
3
4
12、echo的创建和追加输入文件
(1)在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中。
创建文件并输入内容的关键就是>。
(2)还可以使用echo指令配合追加符号>> 向一个已经存在的文件末尾追加输入内容。
echo "test" > a.txt #在当前目录下创建一个a.txt文件 再将""中的内容写到这个文件中
echo "追加的内容" >> a.txt #往一个已经存在的文件中追加输入内容
13、case语句
(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异
(2)不需要带break
(3)具体格式如下
var=2
case $var in
1) echo "1" ;;
2) echo "2" ;;
esac
14、shell传参
$#表示调用该shell时传参的个数。($#计数时只考虑真正的参数个数)
$0、$1、$2·····则依次表示传参的各个参数。
C语言:./a.out aa bb cc argc = 4, argv[0] = ./a.out, argv[1]是第一个有效参数····
shell:source a.sh aa bb cc $# = 3, $0是执行这个shell程序的解析程序的名字
(例如我们使用bash则$0就是bash),$1是第一个有效参数的值,$2是第2个有效参数的值·····
15、shell中的$# $1等内置变量的值不是不可变的,而是可以被改变,被shift指令改变。
shift指令有点像左移运算符,把我们给shell程序的传参左移了一个移出去了,
原来的$2变成了新的$1,原来的$#少了1个。
举例说明:
echo $# $1
shift
echo $# $1
运行:
source a.sh aa bb cc
结果:
3 aa
2 bb