首页 > 其他分享 >学习笔记3

学习笔记3

时间:2023-09-24 14:55:46浏览次数:37  
标签:语句 文件 笔记 echo 学习 命令 sh 执行

第10章 sh编程——教材知识点归纳

这一章课本为我们介绍的是sh编程内容,sh是一种脚本,是一种可以实现在linux中批量执行命令的文件。

10.1~10.2 sh脚本、sh脚本和C程序

sh是Linux下进行批处理的脚本,我觉得它类似于windows下的bat脚本。可见sh脚本的逻辑和C语言等程序设计语言有很多相似之处,教材将它与C语言进行了对比学习。虽然相似,但根本上是不同的,因为sh是脚本,是一个解释程序,而C语言却是能生成机器码的程序设计语言。
sh的执行和参数对应:

mysh   a  b  c  d
$0    $1 $2 $3 $4

10.3 命令行参数

使用sh命令时和运行程序时一样可以使用参数,如:
mysh one two three
其中有:
$#为命令行参数从$1到$n的数量。
$*为所有命令参数。
$S为执行sh命令的PID。
$?为最后一个命令执行的退出状态。

教材示例:

10.4 sh变量

sh中也可以设置变量,A是一个变量,那么$A就代表A的值。
给变量赋值:使用A="xxx"即可。
B=A将B分配(assign)到A。
B=$A意为给B赋予A的值。
echo $A输出显示A的值

10.5~10.6 sh中的引号、sh语句

sh中想要将如$/*><等的特殊字符用作普通字符,用\来引用他们。类似C语言的转义。
sh包含所有Unix/Linux命令,以及可能的I/O重定向。

10.7 sh命令

10.7.1 sh内置命令

sh有一些内置命令,这些命令由sh执行,不创建新进程。这是教材上的常用sh内置命令。

.file:			读取并执行文件
break[n]:		从最近的第n个嵌套循环中退出。
cd [dirname]:		更换目录。
continue [n]:		重启最近的第n个嵌套循环。
eval [arg…]:		计算一次参数并让sh执行生成的命令。
exec [arg...]:		通过这个sh执行命令, sh将会退出。
exit [n]:		使sh退出,退出状态为n。
export [var ...]:	将变量导出到随后执行的命令。
read [var ...]:		从stdin中读取一行并为变量赋值。
set [arg ...]:		在执行环境中设置变量。
shift:			将位置参数$2 $3重命名为$1 $2
trap [arg] [n]:		接收到信号n后执行参数。
umask [ddd]:		将掩码设置为八进制数ddd的。
wait [pid]:		等待进程pid,如果没有给出pid,则等待所有活动子进程。

10.7.2 Linux命令

这些命令原是Linux本来的命令,非常常用的有echo命令、expr命令、管道命令等。

echo命令:echo就是打印(显示)其后面的内容,多个空格压缩为一个。
expr命令:sh变量都是字符串,无法改为数值,但expr命令可以实现转换、运算和回转换。
如:

I=123
I=I+1

执行后,I的值是字符串"I+1",但如果使用下面的命令执行后:

I=123
I=$(expr $I + 1)

变量I的值就变成了字符串"124"
管道命令:管道命令作为过滤器,如cat file | grep word就是从file中找到含有word的内容。
此外还有些别的实用命令,总结在此:

awk:	    数据处理程序。
cmp:	    比较两个文件。
comm:	    选择两个排序文件共有的行。
grep:	    匹配一系列文件的模式。
diff:	    找出两个文件的差异。
join:	    通过使用相同的键来链接记录以比较两个文件。
sed:	    流或行编辑命令。
sort:	    排序或合并文件。
tail:	    打印某个文件最后n行。
tr:	    一对一字符翻译。
uniq:	    从文件中删除连续重复行。

10.8命令替换

$A会替换为A的值,$(cmd)就是cmd执行后的内容的值。

10.9控制语句

条件语句

if [condition1];  then
  statements
elif  [condition2];  then
  statements
else
  statements
fi

循环语句
for语句:

for VARIABLE in str1 str2 ... strn
  do
    commands
  done

每次循环,for后面都要接收其后面的一个变量值

while语句

while [condition]
  do
    commands
  done

此外,还有continue/break语句,其用法和C语言类似,continue开始下一个迭代,break跳出循环。

10.10~10.11 I/O重定向

可以将输入输出流进行重定向

>file	stdout转向文件,如果文件不存在,将会创建文件。
​>>file	stdout追加到文件。
​<file	将文件用作stdin;文件必须存在并具有r权限。
​<<word 	从“here”文件中获取输入,直到只包含word的行。

10.12 sh函数

sh的函数和C等高级语言的写法类似。函数必须在任何可执行语句之前定义,没有函数原型

func()
{
  # function code
}

10.13~10.15 sh中的通配符、命令分组、eval语句

sh中的通配符

*是通配符,可以配位所有字符。
?可以配对对应数量的字符。
[xyz]配对中括号内的字符。

sh命令分组

类似于C语言,sh脚本可用{}()进行命令分组。{}中语句在相同的环境下执行,()在subsh进程中执行,不影响sh的工作目录。

eval语句

eval是sh一个内置命令,对其后的参数进行一次计算。
a="cat file.txt"时,直接写$a会出错,而eval $a就可以执行a。

10.16 调试sh脚本

用-x选项进行调试。如:
bash -x mysh

实践内容过程、问题解决过程

用sh脚本递归复制文件

参考了书上的方法和思想,实现了sh脚本递归复制文件。
代码如下:

cpf2f()
{
	if [ ! -e $1 ]; then
		echo "没有找到文件:"$1
		return 1
	fi
	if [ $1 -ef $2 ]; then
		echo "错误操作:复制给自己"
		return 1
	fi
	if [ -L $1 ]; then
		echo "复制"$1"..."
		link=$(readlink $1)
			ln -s $link $2
			return 0
	fi
	echo "复制$1给$2"
	cp $1 $2 2> /dev/null
}
cpf2d()
{
	newfile=$2/$(basename $1)
	echo "复制$1给路径$2"
	cpf2f $1 $newfile
}
cpd2d()
{
	echo "复制路径$1给路径$2"
	cp -r $1 $2
}

if  [ "$#" != "3" ];  then
  echo "参数数目错误"
elif  [ "$1" == "cpf2f" ];  then
  cpf2f $2 $3
elif  [ "$1" == "cpf2d" ];  then
  cpf2d $2 $3
elif  [ "$1" == "cpd2d" ];  then
  cpd2d $2 $3
else
  echo "错误使用"
fi

测试截图

复制文件到文件



复制文件到文件夹:


复制文件夹到文件夹:



遇到问题和解决方法

1.编写代码的过程遇到了问题,发现sh文件的标准还是很严格的。注意到有时不同的表示具有不同的意义,与C语言也有很多不同。在if语句中,要注意中括号后和前面都需要有空格才能实现相应的功能。
2.编写完代码后发现不能直接执行,查资料原来是sh文件没有执行权限。需要用chmod更改权限,增加执行权限。具体为:chmod +x mycp.sh

chatgpt截图










标签:语句,文件,笔记,echo,学习,命令,sh,执行
From: https://www.cnblogs.com/xiaoquancheng/p/17725979.html

相关文章

  • 学习笔记3
    知识点归纳无论是Python、C、Java还是其他编程语言,程序设计语言通常都有一些共同的必备要素和技能。这些要素和技能在shell脚本中也可以找到对应,尽管shell脚本是一种脚本语言,与通用编程语言有些不同,但也具备类似的元素和技能。以下是一些必备的要素和技能:语法编写规范的代码:......
  • 学习笔记3
    知识点归纳一门程序设计语言的必备要素和技能可以总结为以下几点:语法:掌握语言的基本语法规则,包括变量的声明和赋值、控制结构(条件语句、循环语句等)、函数和类的定义等。数据类型:了解语言提供的不同数据类型,如整数、浮点数、字符串、数组、列表、字典等,并能灵活地运用它们。......
  • 学习笔记三
    一、任务详情自学教材第10章,提交学习笔记(10分)大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如何呈现出来的?知识点归纳以及自己最有收获的内容(3分)问题与解决思路(2分)实践内容与截图,代码链接(3分)...(知......
  • 学习笔记3
    第十章sh编程1.一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如何呈现出来的?-要素:数据类型、常量、变量、运算符、表达式、标识符、关键字、数组、基本控制结构、函数、输入和输出、解释器和编译器-技能:数据结构分析和设计算法分析和设计系统......
  • 《信息安全系统设计与实现》第三周学习笔记
    《信息安全系统设计与实现》第三周学习笔记第十章sh编程sh脚本sh脚本是一个包含sh语句的文本文件,命令行解释程序sh要执行该语句。例如创建一个文本文件mysh,包含:#!/bin/bash#commentlineechohello用chmod+xmysh使其可执行sh脚本与C程序sh是一个解释......
  • x86汇编学习
    sal为算术左移,保持符号位不变。shl为逻辑左移,为无符号左移,最高位直接被次高位覆盖。对应的右移分别为sar,shr。参考[https://blog.csdn.net/deniece1/article/details/](https://blog.csdn.net/deniece1/article/details/103274744#汇编语言中sal(算术左移指令)和shl(逻辑左移指......
  • Oracle process/session/cursor/tx/tm的简单学习
    Oracleprocess/session/cursor/tx/tm的简单学习Oracle的部署模式Oracle安装时有专用模式和共享模式的区别共享模式(Sharedmode):在共享模式下,会话可以同时读取数据库的数据,多个会话可以并发地进行读取操作。这意味着多个会话可以共享相同的数据快照,并且彼此之间不会阻塞。......
  • 学习笔记1
    知识点ubuntulinux的使用unix/linux常用命令ls:lsdirname:列出CWD或目录的内容cddirname:更改目录pwd:打印CWD的绝对路径名touchfilename:更改文件名时间戳(如果文件不存在,则创建文件)catfilename:显示文件内容cpsrcdest:复制文件mvsrcdest:移动或重命名......
  • 学习笔记2
    第九章I/O库函数一.知识点归纳(一)I/O库函数与系统调用系统调用函数:open()、read()、write()、lseek()、close()I/O库函数:fopen()、fread()、fwrite()、fseek()、fclose()二者区别:在系统调用程序中,文件描述符fd是一个整数。在库I/O程序中,fp是一个文件流指针。系统调用ope......
  • 高级系统架构师学习(八)嵌入式系统
    一、嵌入式系统概述基本概念1、将可配置与可裁剪的软硬件集成于一体的专用计算机系统,需要满足应用对功能、可靠性、成本、体积和功耗等方面的严格要求。2、指嵌入各种设备及应用产品内部的计算机系统。它主要完成信号控制的功能。体积小、结构紧凑,可作为一个部件埋藏于......