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

学习笔记3

时间:2022-09-18 19:34:15浏览次数:76  
标签:语句 文件 笔记 echo 学习 命令 sh 执行

一、sh脚本
创建一个文本文件mysh,包含:

I /bin/bash

comment line

echo hello
使用chmod +x mysh使其可执行
二、sh脚本与C程序
首先,Sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行 命令且为内置命令,那么Sh可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。相反,C程序必须先编译链接到一 个二进制可执行文件.然后通过主sh的子进程运行二进制可执行文件。其次,在C程序中, 每个变量必须有一个类型,例如char、int、float、派生类型(如struct)等。相反,在sh脚 本中,每个变量都是字符串。因此不需要类型,因为只有一种类型,即字符串。最后,每个 C程序必须有一个main。函数,每个函数必须定义一个返回值类型和参数(如有)。相反, sh脚本不需要main函数。在sh脚本中,第一个可执行语句是程序的入口点。
三、命令行参数
$# =命令行参数$ 1到$n的数量
$* =所有命令行参数,包括$0
此外,sh还有与命令执行相关的以下内置变量。
SS =执行sh的进程PID
$?=最后一个命令执行的退出状态(如果成功,则为0,否则为非0 )
四、sh变量
PATH、HOME、TERM等。除了内置变量外,用户还可使用 任何符号作为sh变量。可用以下方法设置或赋值:

NOTE: no white spaces allowed between tokens

如果A是一个变量,则$A是变量的值。 示例10.2:

(null if variable A is not set)

set A value

this is fun

assign "A" to B

A (B was assigned the string "A")
(B takes the VALUE of A) this is fun
五、sh中的引号
Sh有许多特殊字符,如$、/、、>、〈等。要想把它们用作普通字符,可使用 '或单引 号来引用它们。用于引用单个字符。单引号用于引用长字符串。单引号内没有替换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。
六、sh语句
sh语句包括所有Unix/Linux命令,以及可能的I/O重定向。
Is
Is > outfile date
cp fl f2
mkdir newdir cat < filename
七、sh命令
1.内置命令
・.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:将位置参数S2 $3 ...重命名为$1 S2…。
° trap [arg] [n]:接收到信号n后执行参数。
•umask [ddd]:将掩码设置为八进制数ddd的。
・wait [pid]:等待进程pid,如果没有给出pid,则等待所有活动子进程。
read命令:当sh执行read命令时,它会等待来自stdin的输入行。它将输入行划分为 几个标记,分配给列岀的变量。read的一个常见用法是允许用户与正在执行的sh进行交互, 如下面的示例所示。
echo -n "enter yes or no : " # wait for user input line from stdin
read ANS # sh reads a line from stdin
echo $ANS # display the input string
在获得输入后,Sh可能会测试输入字符串,以决定下一步做什么。
2.Linux 命令
echo命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压 缩为一个空格,除非有引号。
echo This is a line # display This is a line
echo "This is a line
# display This is a line
echo -n hi # display hi without NEWLINE
echo there # display hithere

实用命令:除了上面的Linux命令之外,sh还使用许多其他实用程序作为命令。其中 包括:
・awk:数据处理程序。
•cmp:比较两个文件。
・comm:选择两个排序文件共有的行。
•grep:匹配一系列文件的模式。
・diff:找出两个文件的差异。
•join:通过使用相同的键来连接记录以比较两个文件。
, sed:流或行编辑命令。
•sort:排序或合并文件。
•tail:打印某个文件的最后n行。
-tr: 一对一字符翻译。
・uniq:从文件中删除连续重复行。
八、命令替换
九、sh控制语句
1.If-else-fi语句
●if-else-fi语句的语法是:
if [ condition ] # NOTE: must have white space between tokens
then
statements
else # as usual, the else part is optional
statements
fl # each i£ must end with a matching fl
●实际上,if-else-fi语句通常写成:
if [ condition ]; then
statements
else
statements
fi
●作为字符串进行比较:
if [ si = s2 ] # NOTE: white spaces needed between tokens
if [ si 1= s2 ]
if [ si < s2 ] # < because < is a special char
if [ si > s2 ] etc. # > because > is a special char

●测试程序还可以测试文件操作中经常需要的文件类型和文件属性。

test whether file name exists

test whether name is a (REG) file

test whether name is a DIR

test whether name is readable; similarly for -w, -xr etc.

test whether fl, £2 are the SAME file

2.for语句
for VARIABLE in stringl string2 .・・・ stringn
do
commands
Done
3.while语句
while [ condition ]
do
commands
done
4.until-do 语句
until [ $ANS = "give upn ]
do
echo -n "enter your answer :"
read ANS
done
5.case 语句
十、I/O重定向

file stdout转向文件,如果文件不存在,将会创建文件。
» file stdout追加到文件。
<file 将文件用作stdin;文件必须存在并具有r权限。
« word 从11 here"文件中获取输入,直到只包含“word”的行。
十一、嵌入文档
十二、sh函数
sh函数的定义为:
func()
(

function code

}
十三、sh中的通配符
星号通配符:sh中最有用的通配符是,可扩展到当前目录中的所有文件。
・file
:列出当前目录中所有文件的信息。
•Is .c:列出当前目录中所有以.c结尾的文件。
?通配符:查询某文件名中的字符
示例10.15:
・file ???:有3个字符的所有文件名。
-Is
.??: 一个点号.后有2个字符的所有文件名。
[]通配符:查询文件名中一对[]中的字符。
示例10.16:
•file[ab];包含字符a或b的所有文件名。
•Is [xyz]:列出所有包含x、y或z的文件名。
ls[a-m]:列出包含a到m范围内字符的所有文件名。
十四、命令分组
在Sh脚本中,可以用{}或。对命令进行分组。
(ls;mkdir abc;ls;}:通过当前sh执行{}中的命令列表。{}命令分组的唯一用处是在相 同环境下执行这些命令,例如,为分组中的所有命令重定向1/0。
更有用的命令分组是(),由subsh (进程)执行。
(cd newdir;ls;A=value;mkdir SA):通过subsh进程执行()中的命令。subsh进程可在不 影响父sh的情况下更改其工作目录。此外,当subsh进程终止时,subsh中的任何赋值变量 都不起作用。
十五、eval 语句
sh在执行命令行之前,按以下步骤计算该命令行。
(1)参数替换:扫描命令行,将任何$乂替换为它的值,但只执行一次,即不能再次替 换任何产生的$符号。命令行变成:
cp $B 'pwd'/newdir
(2)命令替换:用替换执行'pwd'o sh将会执行结果行
cp $B /root/newdir
如果当前目录没有任何名为$日的文件,则会导致一个错误。但是,如果我们将原来的 命令行更改为
eval cp $A $(pwd)/$C
Sh将会在执行命令行之前先计算它。计算完成后,该命令行变成:
cp abc* /root/newdir
(3)通配符扩展:当sh执行该行时,它将new*展开为以abc开头的文件名。这将会把 所有以abc开头的文件名复制到目标目录中。
需要注意的是,我们总是可以通过一些额外的语句来实现与手动计算相同的效果。使用 eval可以省去一些替换语句,但也可能使代码难以理解。因此,应避免使用任何不必要的 evaL
十六、编程项目:用sh脚本递归复制文件
(1) n<2:显示用法并退出。
(2) n>2: fn必须是现有目录。
(3)n=2:将文件复制到文件,将文件复制到目录,或者将目录1复制到目录2。
(4)永远不要将文件或目录复制到它本身。此外,如果目录2是目录1的派生目录,不要进行复制。

实验截图



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

相关文章