程序设计语言
程序设计语言的种类千差万别。但是,一般说来,基本成分不外4种。
数据成分。用以描述程序中所涉及的数据。
运算成分。用以描述程序中所包含的运算。
控制成分。用以表达程序中的控制构造。
传输成分。用以表达程序中数据的传输。
具体来说:
- 数据类型(描述了数据在内存存储区中占据的空间大小)
- 常量
- 变量
- 运算符(+ - * / ** ^ | & ! ++ ?: 增强运算符等)
- 表达式(一般有赋值、算术、逻辑、条件、强制类型转换等类型)
- 标识符(常量名、变量名、函数名、类名等。)
- 关键字(具有特定含义的标识符,不能用来作变更名、函数名等)
- 基本控制结构(顺序结构、选择结构、循环结构)
- 函数
- 面向对象程序语言需实现封装、继承和多态
shell脚本
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它接收用户命令,然后调用相应的应用程序。
Shell Script ,即Shell脚本,就是把原本需要在命令行输入的命令组成预先放入到一个文件中,方便一次性执行。很多脚本语言实际上已经超过简单的用户命令序列的指令,还可以编写更复杂的程序。
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言(shell脚本语言)。作为命令语言,它互动式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。它虽然不是 Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。
脚本语言 -> 解释器 -> 解释执行
编译语言 -> 编译器 -> 编译链接
知识点归纳
数组操作
数组定义
使用()直接定义数组
days1=(one two three four five)
或者在()中声明下标,默认从0开始
days2=([0]=’one’ [1]=’two’ [2]=’three’ [3]=’four’)
下标可以不连续
days3=([0]=’one’ [2]=’three’)
获得数组中所有值:${数组名[@]}、${数组名[]}
${数组名[@]}得到以空格隔开的元素,可以用在数组遍历中;
${数组名[]}得到的是一整个字符串
注意:${数组名}并不会获得所有值,它只会获得到第一个元素的值。即${数组名}=${数组名[0]}
数组长度:
利用”@”或“*”字符,将数组扩展成列表,然后使用”#”来获取数组元素的个数。
#!/bin/bash
days=(one two three four)
echo "数组days的元素个数为:${#days[@]}"
echo "**********"
names=()
names[1]=tom
names[2]=jack
echo "数组names的元素个数为:${#names[*]}"
遍历
(1)${数组名[@]}、${数组名[*]}均可以获得所有元素(不管是元素列表,还是一整个字符串),使用for循环遍历即可
(2)带数组下标的遍历,当需要使用到数组的下标时,可以使用${!数组名[@]}
#!/bin/bash
#数组遍历
days=(one two three four)
#for循环遍历
for day in ${days[*]} #或${days[@]}
do
echo $day
done
echo "***************"
#fou循环带下标遍历
for i in ${!days[@]}
do
echo ${days[$i]}
done
删除一个数组或数组中元素用unset命令。
unset 数组名[索引] #删除索引下的元素
unset 数组名 #删除整个数组
连接:
用()将多个数组连接在一起,()中各个数组用空格隔开。
days=(one two three four)
names=(tom jack)
days=(${days[@]} ${names[@]})
最有收获的内容
awk
awk过于强大,目前只学会了点皮毛
awk '{pattern + action}' {filenames}
尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令
运算符
内置变量
小试:用awk打印文件的行数
awk 'END{print NR}' ./case分支.sh
shell字符串操作(长度,读取,替换)
表达式 | 含义 |
---|---|
${#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 |
问题与解决思路
下面这段程序的return 语句为什么写两对括号?
1 myadd(){
2 echo "该函数计算两个数字的和"
3 echo "请输入第一个数字"
4 read a
5 echo "请输入第二个数字"
6 read b
7 return $(($a+$b))
8 }
9 myadd
10 echo "两个数字的和是$?"
双小括号 (( )) 是一个运算,作用如下:
+ ((exp))结构,扩展并计算一个算术表达式的值。若是逻辑判断,表达式exp为真则为1,假则为0。
+ 只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中。作不同进制运算时,输出结果全都自动转化成了十进制。
+ 括号内支持多个表达式用逗号分开。比如可以直接使用for((i=0;i<5;i++)),if (($i<5))等
实践内容
转义字符与echo -e
1 #! /bin/bash
2
3 echo hello world!
I am 20191206陈发强
4 echo echo -e:
5 echo -e hello world!
I am 20191206陈发强
6 echo 添加双引号:
7 echo "hello world!
I am 20191206陈发强"
8 echo echo -e 添加双引号:
9 echo -e "hello world!
I am 20191206陈发强"
Readonly关键字
1 #! /bin/bash
2
3 readonly a=1234qwer
4 echo $a
5 a=1234
6 echo $a
Unset
1 #! /bin/bash
2
3 a=1234
4 echo $a
5 unset a
6 echo unset之后的输出:
7 echo $a
字符串
无引号:
变量被替换
转义符识别
echo -e对转义字符无效
双引号:
双引号里变量被替换
echo -e 对双引号内的对转义字符有效
1 #! /bin/bash
2
3 name=Jack
4 echo 双引号:
5 echo "hello $name
Nice to meet you"
6
7 echo 没有引号:
8 echo hello $name
Nice to meet you
9
10 echo echo -e 双引号:
11 echo -e "hello $name
Nice to meet you"
12
13 echo echo -e 没有引号:
14 echo -e hello $name
Nice to meet you
单引号:
单引号字符串中的变量是无效的
两个单引号字符串相邻会自动拼接
echo -e对单引号内的对转义字符有效
1 #! /bin/bash
2
3 a=123qwe
4 echo echo -e :
5 echo -e 'hhhh
$a'
6
7 echo echo :
8 echo 'abcd
''efghi'
9 echo 'abcd
'$a'efghi'
case分支
1 #! /bin/bash
2 echo "请输入1到4之间的数字"
3 read a
4 case $a in
5 1) echo "你选择了1"
6 ;;
7 2|3)echo "你选择了2或3"
8 ;;
9 4)echo "你选择了4"
10 ;;
11 *)echo "你没有输入1到4之间的数字"
12 esac
if分支
注意空格 if [ condition ]; then
1 #! /bin/bash
2
3 echo "请输入数字a"
4 read a
5 echo "请输入数字b"
6 read b
7
8 if [ $a -eq $b ]; then
9 echo "a 等于 b"
10 elif [ $a -gt $b ]; then
11 echo "a 大于 b"
12 else
13 echo "a 小于 b"
14 fi
expr命令
1 #! /bin/bash
2 a=10
3 b=20
4
5 echo "a = $a"
6 echo "b = $b"
7
8 val=`expr $a + $b`
9 echo "a + b = $val"
10
11 val=`expr $a - $b`
12 echo "a - b = $val"
13
14 val=`expr $a * $b`
15 echo "a * b = $val"
16
17 val=`expr $a / $b`
18 echo "a / b = $val"
19
20 val=`expr $b % $a`
21 echo "b % a = $val"
let命令
1 #!/bin/bash
2 let a=5+4
3 let b=9-3
4 let c=5*4
5 let d=20/5
6 let e=20%7
7 echo $a $b $c $d $e
8
9 let a++
10 echo $a
11
12 let b--
13 let a+=b
14 echo $b $a
数组长度:
利用”@”或“*”字符,将数组扩展成列表,然后使用”#”来获取数组元素的个数。
#!/bin/bash
days=(one two three four)
echo "数组days的元素个数为:${#days[@]}"
echo "**********"
names=()
names[1]=tom
names[2]=jack
echo "数组names的元素个数为:${#names[*]}"
数组遍历
#!/bin/bash
days=(one two three four)
#for循环遍历
for day in ${days[*]} #或${days[@]}
do
echo $day
done
echo "***************"
#fou循环带下标遍历
for i in ${!days[@]}
do
echo ${days[$i]}
done
数组拼接
1 #! /bin/bash
2
3 days=(one two three four)
4 names=(tom jack)
5 days=(${days[@]} ${names[@]})
6
7 for i in ${days[@]}
8 do
9 echo $i
10 done
函数调用与返回值
1 #! /bin/bash
2
3 myadd(){
4 echo "该函数计算两个数字的和"
5 echo "请输入第一个数字"
6 read a
7 echo "请输入第二个数字"
8 read b
9 return $(($a+$b))
10 }
11 myadd
12 echo "两个数字的和是$?"
13
函数参数
1 #! /bin/bash
2
3 funParam(){
4 echo "第一个参数为 $1"
5 echo "第二个参数为 $2"
6 echo "第十个参数为 ${10}"
7 echo "第十一个参数为 ${11}"
8 echo "一共有 $# 个参数"
9 echo "作为一个字符串输出所有参数 $*"
10 }
11 funParam 1 2 3 4 5 6 7 8 9 34 73
字符串长度和索引
1 #! /bin/bash
2
3 str=0123456789abcd
4 echo "字符串str=$str"
5
6 echo 字符串的长度是:
7 echo ${#str}
8
9 echo 'echo ${str:1:4}'
10 echo ${str:1:4}
文件测试运算符
1 #!/bin/bash
2
3 file="expr.sh"
4 if [ -r $file ]
5 then
6 echo "文件可读"
7 else
8 echo "文件不可读"
9 fi
10 if [ -w $file ]
11 then
12 echo "文件可写"
13 else
14 echo "文件不可写"
15 fi
16 if [ -x $file ]
17 then
18 echo "文件可执行"
19 else
20 echo "文件不可执行"
21 fi
22 if [ -f $file ]
23 then
24 echo "文件为普通文件"
25 else
26 echo "文件为特殊文件"
27 fi
28 if [ -d $file ]
29 then
30 echo "文件是个目录"
31 else
32 echo "文件不是个目录"
33 fi
34 if [ -s $file ]
35 then
36 echo "文件不为空"
37 else
38 echo "文件为空"
39 fi
40 if [ -e $file ]
41 then
42 echo "文件存在"
43 else
44 echo "文件不存在"
45 fi