7.1.编辑器、编译器、运行方法
(1)shell程序是文本格式的,只要是文本编辑器都可以。但我们的shell程序是在linux系统下运行的,所以换行符必须’\n’,而windows下的换行符是’\r\n’,因此在windows中的编辑器写的shell程序不能在linux下运行。则我们可以在linux系统下使用vi编辑器进行shell程序的编写调试。
(2)shell程序不涉及编译器,因为shell是解释性语言,直接编辑完就可以运行。
(3)shell程序的运行有多种方法,在此介绍三种常用的运行方法。第1种:./xx.sh,和运行二进制可执行程序方法一样,该方法要求shell程序必须有可执行权限。第2种:source xx.sh,source是linux系统下的一个命令,这个命令是用来执行脚本程序的,该方法不需要脚本具有可执行权限。第3种:bash xx.sh,bash是一个脚本程序解释器,本质上是1个可执行程序,该方法实际上是执行了bash程序,然后把xx.sh作为argv[1]传给它运行。
7.2.hello world程序和解释
(1)shell程序的第一行通常是”#!/bin/sh”,这句话以”#!”开始,后面加1个pathname,这句话表示指定shell程序执行时被哪个解释器解释执行,则该句话表示该shell程序将被当前机器中/bin目录下的sh解释器解释执行,也可写为”#!/bin/bash”来指定bash解释器解释执行该脚本程序。注意在ubuntu上面默认使用的解释器sh其实不是bash,而是dash,可使用”ls /bin/sh -l”命令查看。
(2)脚本中的注释使用#,#开头的行是注释行,如果有多行需要注释,每行前面都需要加#。
(3)shell程序中的正文是由很多行shell语句构成。
7.3.shell并不神秘
(1)shell就是把以前在命令行中键入执行的命令写成了程序。shell其实就是为了避免反复的在命令行下手工输入命令而发明的一种把手工输入步骤记录下来,然后通过执行shell脚本程序就能再次复述原来记录的手工输入过程的1种技术。
(2)shell编辑完可以直接运行,不需要编译。
7.4.shell中调用linux命令
(1)脚本编程其实就是把以前在命令行下输入的命令挪到脚本程序中去然后一次执行。
(2)直接在shell源代码中键入linux命令。练习:在当前目录下创建文件夹dir,在dir下创建a.txt。
(3)通过反引号将linux命令括起来。适用于我们的目的得到该命令的返回值即执行结果,可使用一对反引号来调用执行命令。反引号与~在同一个按键上。
7.5.shell中的变量定义和引用
(1)变量定义。shell是弱类型语言,即语言中的变量没有明确的类型。在shell编程中定义变量不需要制定类型,也没有类型这个概念。
(2)变量初始化。变量定义时可以初始化,使用=进行初始化赋值,在shell中赋值的=两边不能有空格。注意shell对语言风格要求非常严格,很多地方空格都是必须有或者必须没有,而且不能随意没有空格。
(3)变量赋值。变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给它赋值时的值。
(4)变量引用。shell中引用一个变量必须使用dollar符号,dollar符号就是变量解引用符。注意dollar符号后面跟一个字符串,该字符串会被当做变量去解析。如果这个字符串本身没有定义,执行时并不会报错,而是会把这个变量解析为空。即shell中没有被定义的变量相当于被定义并被赋值成空的变量。注意变量引用的时候可以dollar—var,也可以dollar{var}。这两种的区别是在某些情况下只能用dollar{var}而不能简单的dollar-var。
7.6.shell中无引号、单引号和双引号的区别
(1)无引号。shell中可以不加双引号或单引号直接使用字符串,并且字符串之间有空格也可以,但缺陷是不能输出”和’和其他转义字符。
(2)单引号。完全字面替换,不可包含单引号本身。
(3)双引号。dollar加变量名可以取变量的值;反引号仍表示命令替换;\dollar表示dollar的字面值,`表示`的字面值,\”表示”的字面值,\表示\的字面值,除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值。
7.7.shell中的选择分支结构
(1)shell中的if语句用法很多,我们只需掌握常用的if语句用法即可。
(2)典型if语句格式
if [表达式]; then
xxx
else
xxx
fi
(3)if的典型应用
判断文件是否存在:(-f),注意[]里面前后都有空格,不能省略;判断目录是否存在:(-d);
判断字符串是否相等:”str1” = “str2”),注意用一个等号而不是两个;
判断数字是否相等:(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)在这里eq就是equal,gt就是greater than,lt就是less than,ge就是greater or equal,le就是less or equal;
判断字符串是否为空:(-z)注意-z判断时如果变量本身没定义也是不成立,即-z认为变量没定义不等于为空。
(4)if判断式中使用”-o”表示逻辑或。
(5)逻辑与&&和逻辑或||与简写的if表达式相结合。
7.8.shell中的循环结构
(1)for循环。要求能看懂、能改即可,不要求能够完全不参考写出来,因为嵌入式开发并不需要完全重新手写shell。只有服务器运维人员,应用层系统级管理开发的才需要完全掌握shell。
(2)while循环。要注意很多格式要求,譬如while后面的[]两边都有空格,如果do放在一行的话[]后面有分号,i++的写法中有两层括号。
7.9.echo的创建和追加输入文件
(1)在shell中可直接使用echo指令创建一个文件,并且可将一些内容输入该文件中。创建文件并输入内容的关键就是>。
(2)还可使用echo指令配合追加符号>>向一个已经存在的文件末尾追加输入内容。
7.10.case语句
(1)shell中的case语句天生没有break,即shell中的case默认是匹配上哪个就执行哪个。
(2)注意case语句后面需要带;;表明语句结束。
7.11.调用shell程序的传参
(1)shell程序本身可以在调用时传参给它。在shell程序内部使用传参是使用一些特定的符号实现的,包括:dollar#表示调用该shell时传参的个数,它只考虑真正的参数个数;dollar0、dollar1、dollar2依次表示传参的各个参数。
(2)C语言中:./a.out aa bb cc;argc=4,argv[0]=./a.out;argv[1]表示第一个有效参数。
(3)shell中:source a.sh aa bb cc;dollar#=3, dollar0=bash是执行这个shell程序的解析程序的名字,dollar1是第一个有效参数的值。
7.12.while循环和case语句和传参结合
(1)shell中的break语句和C语言中的break语句均用于跳出,但是用法不同。因为shell中的case语句默认是不用break的,则break在shell中只用于跳出循环。当while语句中内嵌case语句时,case语句中的break是跳出外层的while循环的,不是用来跳出case语句的。
(2)shell中的dollar#、dollar1等内置变量的值可以通过shift指令改变。运行一次shift指令,则dollar#减少1个,原来的dollar2变成了新的dollar1,类似C语言中的左移运算符。
7.first_shell
#!/bin/sh
# 动手写第一个shell
echo "hello world."
7.shell_program
#!/bin/sh
# shell编程学习
# direct run command
#mkdir dir
#cd dir
#touch a.txt
#cd ..
# back quote run command
#MYPATH="`pwd`/include"
#echo "MYPATH = $MYPATH"
# variable define & use
#string="hello world"
#string="new string"
#echo $string
# symbol
#echo new string
#echo str'ing
#echo str"ing
#echo '''
#echo '\$'
#echo "\$"
#echo "\g"
7.shell_if
#!/bin/sh
# if的典型应用
# 判断文件a.txt是否存在,如果不存在则创建
if [ -f a.txt ]; then
echo "yes"
else
echo "no"
touch a.txt
fi
# 判断目录home是否存在,如果不存在则创建
if [ -d home ]; then
echo "yes"
else
echo "no"
mkdir home
fi
# 判断两个字符串是否相等
if [ "str1" = "str2" ]; then
echo "equal"
else
echo "not equal"
fi
# 判断数字是否相等 大于 小于 大于等于 小于等于
if [ "13" = "12" ]; then
echo "equal"
else
echo "not equal"
fi
# 判断字符串是否为空
str="dd"
if [ -z $str ]; then
echo "yes"
else
echo "no"
fi
# 演示-o进行逻辑或
if [ 12 -eq 13 -o "abc" = "abc" ]; then
echo "yes"
else
echo "no"
fi
# 逻辑与&&和逻辑或||与简写的if表达式相结合
str="abc"
[ -z $str ] || echo "not empty"
[ -z $str ] && echo "empty"
7.shell_loop
#!/bin/sh
# 循环结构演示
# for循环
for i in `ls`
do
echo $i
done
# for循环
for i in 1 2 3 4 5
do
echo $i
done
# while循环
i=2
j=11
while [ $i -lt $j ]; do
echo $i
i=$(($i + 2))
done
7.shell_echo
#!/bin/sh
# 在shell中使用指令echo
# 使用指令echo创建文件并输入内容
#echo "#include <stdio.h>
#int main(void)
#{
# return 0;
#}" > a.c
# 使用指令echo向已有文件末尾追加内容
echo "This is a test for echo!" > test.c
echo "add somethings" >> test.c
7.shell_case
#!/bin/sh
# comment
# case语句演示
var=1
case $var in
1) echo "1";;
2) echo "2";;
esac
7.shell_trans
#!/bin/sh
# comment
# 演示使用$# $0 $1进行传参
#$echo $# $0 $1 $2 $3
# 演示shift指令和$# $1的关系
echo $# $0 $1 $2 $3
shift
echo $# $0 $1 $2 $3
这篇博客介绍了Shell编程的基础知识,包括编辑器的选择、运行方法、Hello World程序、变量定义与引用、选择分支结构、循环结构、文件操作以及参数传递。讲解了如何在Linux环境下使用Shell编写和运行脚本,以及如何在脚本中调用Linux命令和定义变量。
6707

被折叠的 条评论
为什么被折叠?



