ch10学习笔记

  1. 程序设计语言
  2. shell脚本
  3. 知识点归纳
  4. 最有收获的内容
  5. 问题与解决思路
  6. 实践内容

程序设计语言

程序设计语言的种类千差万别。但是,一般说来,基本成分不外4种。

数据成分。用以描述程序中所涉及的数据。
运算成分。用以描述程序中所包含的运算。
控制成分。用以表达程序中的控制构造。
传输成分。用以表达程序中数据的传输。

具体来说:

  1. 数据类型(描述了数据在内存存储区中占据的空间大小)
  2. 常量
  3. 变量
  4. 运算符(+ - * / ** ^ | & ! ++ ?: 增强运算符等)
  5. 表达式(一般有赋值、算术、逻辑、条件、强制类型转换等类型)
  6. 标识符(常量名、变量名、函数名、类名等。)
  7. 关键字(具有特定含义的标识符,不能用来作变更名、函数名等)
  8. 基本控制结构(顺序结构、选择结构、循环结构)
  9. 函数
  10. 面向对象程序语言需实现封装、继承和多态

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中, 从位置$position开始提取子串
$ 在$string中, 从位置$position开始提取长度为$length的子串
$ 从变量$string的开头, 删除最短匹配$substring的子串
$ 从变量$string的开头, 删除最长匹配$substring的子串
$ 从变量$string的结尾, 删除最短匹配$substring的子串
$ 从变量$string的结尾, 删除最长匹配$substring的子串
$ 使用$replacement, 来代替第一个匹配的$substring
$ 使用$replacement, 代替所有匹配的$substring
$ 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
$ 如果$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!\nI am 20191206陈发强
  4 echo echo -e:
  5 echo -e hello world!\nI am 20191206陈发强
  6 echo 添加双引号:
  7 echo "hello world!\nI am 20191206陈发强"
  8 echo echo -e 添加双引号:
  9 echo -e "hello world!\nI 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\nNice to meet you"
  6 
  7 echo 没有引号:
  8 echo hello $name\nNice to meet you
  9 
 10 echo echo -e 双引号:
 11 echo -e "hello $name\nNice to meet you"
 12 
 13 echo echo -e 没有引号:
 14 echo -e hello $name\nNice to meet you

单引号:
单引号字符串中的变量是无效的
两个单引号字符串相邻会自动拼接
echo -e对单引号内的对转义字符有效

  1 #! /bin/bash
  2 
  3 a=123qwe
  4 echo echo -e :
  5 echo -e 'hhhh\n\t$a'
  6 
  7 echo echo :
  8 echo  'abcd\n''efghi'
  9 echo  'abcd\n'$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

posted @ 2021-09-26 22:27  191206  阅读(68)  评论(0编辑  收藏  举报