《Unix/Linux系统编程》第三周学习笔记
2022/9/17 5:16:22
本文主要是介绍《Unix/Linux系统编程》第三周学习笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
《Unix/Linux系统编程》第三周学习笔记
sh编程
sh脚本
#! /bin/bash # comment line echo hello
- chmod +x mysh使其可执行 sh脚本的第一行通常以#!组合开始,通 常称为shebang。当主sh见到shebang时,会读取脚本所针对的程序名并调用该程序。shebang允许主sh调用适当 版本的sh来执行脚本。如果未指定shebang,它将运行默认的sh,即Linux中的/bin/bash。 当bash执行mysh脚本时,将会打印hello。
sh脚本于C语言程序
sh
:sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行 命令且为内置命令,那么Sh可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。C程序
:C程序必须先编译链接到一个二进制可执行文件.然后通过主sh的子进程运行二进制可执行文件。
命令行参数
在sh脚本中,可以通过位置参数$0、$1、$2等访问命令行参数。前10个命令行参数可以作为$0~$9被访问。其他参数必须称为${10}~${n},其中n>10o可以通过稍后显示 的shift命令査看它们。通常,$0是程序名本身,$1到$n是程序的 参数,在sh中,可用内置变量$#和$*计数并显示命令行参数。
$# = 命令行参数$1到$n的数量 $* = 所有命令行参数,包括$0,此外,,sh还有与命令执行相关的以下内置变量。 $S = 执行sh的进程PID $? = 最后一个命令执行的退出状态(如果成功,则为0,否则为非0 )
#! /bin/bash echo \$# = $# echo \$* = $* echo $1 $9 $10 echo $1 $9 %{10} shift #replace $1,$2with $2,$3 echo $1 $9 ${10}
sh变量
sh
有许多内置变量,如PATH、HOME、TERM等。除了内置变量外,用户还可使用 任何符号作为sh变量。未赋值的sh变量是NULL字符串。赋值方式
:variable = string
#! /bin/bash echo A echo $A A="this is fun" echo $A B=A # B和等于号必须要贴贴 b = a是不行的 echo $B B=$A echo $B
sh中的引号
Sh
有许多特殊字符,如$
、/
、*
、>
、〈
等。要想把它们用作普通字符,可使用'
或单引号来引用它们。'
用于引用单个字符。单引号用于引用长字符串。单引号内没有替换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换
#! /bin/bash A=XYZ echo \$A echo '$A' echo "see $A"
sh语句
sh语句
包括所有Unix/Linux命令,以及可能的I/O重定向
#! /bin/bash ls ls > outfile date cp fl f2 mkdir newdir cat < filename
运行如下
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
:将位置参数S2 $3 ...重命名为$1 S2…。trap[arg][n]
:接收到信号n后执行参数。umask[ddd]
:将掩码设置为八进制数ddd的。wait[pid]
:等待进程pid,如果没有给出pid,则等待所有活动子进程。read命令
:当sh执行read命令时,它会等待来自stdin的输入行。它将输入行划分为几个标记,分配给列岀的变量。read的一个常见用法是允许用户与正在执行的sh进行交互。
#! /bin/bash echo -n "enter yes or no:" read ANS echo $ANS
linux 命令
- echo命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压 缩为一个空格,除非有引号。
#! /bin/bash echo This is a line echo "This is a line" echo -n hi #-n 不换行 echo there
expr命令
:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值。expr命令间接更改sh变量的值(数值)
expr string1 op string2
#! /bin/bash i=123 echo $i i=$i+1 echo $i i=123 i=$(expr $i + 1) echo $i
管道命令
:在sh脚本中经常使用管道作为过滤器。
#! /bin/bash ps -ax | grep httpd cat file | grep word
-实用命令
:除了上面的linux命令之外,sh还有使用很多其他实用程序作为命令。
awk
:数据处理程序。cmp
:比较两个文件。comm
:选择两个排序文件共有的行。grep
:匹配一系列文件的模式。diff
:找出两个文件的差异。join
:通过使用相同的键来连接记录以比较两个文件。sed
:流或行编辑命令。sort
:排序或合并文件。tail
:打印某个文件的最后n行。tr
: 一对一字符翻译。uniq
:从文件中删除连续重复行。
命令替换
$A
会被替换成A的值。$(cmd)
先运行cmd命令将成果替换成$(cmd)的值。
#! /bin/bash echo $(date) echo $(ls /home/hzx)
sh控制语句
sh
:是一种编程语言,支持许多执行控制语句,类似于c语言中的语句
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 stringl COMP string2 OR [ stringl COMP string2 】 #比较两个字符串
文件比较
if [ -e name ] # test whether file name exists if [ -f name ] # test whether name is a (REG) file if [ -d name ] # test whether name is a DIR if [ -r name ] # test whether name is readable; similarly for -w, -xr etc. if [ f1 -e f2 ] # test whether fl, £2 are the SAME file
if-elif-else-fi
if [ conditionl ]; then commands elif [ condition2 ]; then commands # additional elif [ conditions ]; then etc. else commands fi
复合条件
:与在C语言中一样,sh也允许在复合条件中使用&& (AND)和||(0R), 但是语法比C语言更加严格。条件必须用一对匹配的双括号[[和]]括起来。
[
: test string1 COMP string2 OR [ string1 COMP string2]
sh中
0
:表示TRUE
非零
:表示FASLE
#! /bin/bash read ANS echo $ANS if [ "$ANS" -eq "20201310" ] then echo "you have printed 20201310" else echo "you haven't printed 20201310" fi
for 语句
for VARIABLE in stringl string2 .... stringn do commands done
#! /bin/bash for ANS in 20201310 20201311 do if [ "$ANS" -eq "20201310" ]; then echo hello20201310 elif [ "$ANS" -eq "20201311" ]; then echo hello20201311 fi done
while 语句
while [ condition ] do commands done
#! /bin/bash i=20201310 while [ $i != 20201315 ] do echo $i i=$(expr $i + 1) done
until-do 语句
until [ $ANS = "give upn ] do echo -n "enter your answer :" read ANS done
#! /bin/bash i=20201301 until [ $i = 20201310 ] do echo "$i is best" i=$(expr $i + 1) done
case 语句
case $variable in patternl) commands;; # note the double semicolons ;; pattern2) command;; patternN) command;; esac
#! /bin/bash read i echo $i case $i in 20201310) echo you live in 415;; 20201303) echo you live in 415;; 20201327) echo you live in 415;; 20201319) echo you live in 415;; esac
continue和break 语句
- 与C语言一样
continue
:重启最近循环的下一个迭代。break
:退出循环。
i/o重定向
>file
//stdout转向文件,如果文件不存在,将会创建文件。
>>file
//stdout追加到文件。
<file
//将文件用作stdin;文件必须存在并具有r权限。
<<word
//从"here"文件中获取输入,直到只包含“word”的行。
嵌入文档
- 以指示输出命令从stdin获取输入,将其回显到stdout,直到遇到预先安排的关键字。
#! /bin/bash echo << A A cat << DONE DONE
sh 函数
#! /bin/bash TestFile() { if [ "$1" -eq "20201310" ]; then echo "$1 is best" fi } for i in 20201310 20201315 20201320 20201325 do TestFile $i done
sh 中的通配符
file*
:列出当前目录中所有文件的信息。
Is *.c
:列出当前目录中所有以.c结尾的文件。
[]通配符
:查询某文件名中的字符
file ???
:有3个字符的所有文件名。
Is*.??
: 一个点号.后有2个字符的所有文件名。
[]通配符
:查询文件名中一对[]中的字符。
命令分组
- 在Sh脚本中,可以用{}或。对命令进行分组。
(ls;mkdir abc;ls;}
:通过当前sh执行{}中的命令列表。{}命令分组的唯一用处是在相 同环境下执行这些命令,例如,为分组中的所有命令重定向1/0。 - 更有用的命令分组是(),由subsh (进程)执行。
(cd newdir;ls;A=value;mkdir SA)
:通过subsh进程执行()中的命令。subsh进程可在不 影响父sh的情况下更改其工作目录。此外,当subsh进程终止时,subsh中的任何赋值变量 都不起作用。
eval 语句(不太理解)
调试sh
问题:
- 1.为什么sh文件第一行是 #!/bin/bash?
推荐链接:https://blog.csdn.net/iot_flower/article/details/69055590 - 2.什么叫做 嵌入文档?
推荐链接:https://blog.csdn.net/wangweixaut061/article/details/7337852 - 3.eval起什么样的作用?机理是什么?
推荐链接:https://www.cnblogs.com/huzhiwei/archive/2012/03/14/2395956.html
这篇关于《Unix/Linux系统编程》第三周学习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-18git仓库有更新,jenkins 自动触发拉代码怎么配置的?-icode9专业技术文章分享
- 2024-12-18Jenkins webhook 方式怎么配置指定的分支?-icode9专业技术文章分享
- 2024-12-13Linux C++项目实战入门教程
- 2024-12-13Linux C++编程项目实战入门教程
- 2024-12-11Linux部署Scrapy教程:新手入门指南
- 2024-12-11怎么将在本地创建的 Maven 仓库迁移到 Linux 服务器上?-icode9专业技术文章分享
- 2024-12-10Linux常用命令
- 2024-12-06谁看谁服! Linux 创始人对于进程和线程的理解是…
- 2024-12-04操作系统教程:新手入门及初级技巧详解
- 2024-12-04操作系统入门:新手必学指南