第十章 循环和分支

对代码块进行操作是有组织的结构化的shell脚本的关键。为了达到这个目的,循环和分支提供帮助。

10.1 循环

循环就是重复一些命令的代码块,如果条件不满足就退出循环。

for 循环

for arg in [list]
这是一个基本的循环结构。它与C的相似结构有很大不同。

for arg in [list]
docommadn(s)...
done

Example 10.1 循环的一个简单例子

#!/bin/bash
#列出所有行星
for planet in 水星 金星 地球 火星 木星 土星 天王星 海王星 冥王星
doecho $planet
done
echofor planet in "水星 金星 地球 火星 木星 土星 天王星 海王星 冥王星"
#用""把list封装起来会变为一个变量。
doecho $planet
doneexit 0

注意:每个[list]中的元素都可能包含多个参数。在处理参数组时,这是非常有用的。在这种情况下,使用set命令(见Example 11.15)来强制解析每个[list]中的元素,并且分配每个解析出来的部分到一个位置参数中。

Example 10.2 每个[list]元素带两个参数的for循环

#!/bin/bash
#还是行星
#分配行星的名字和它距太阳的距离for planet in "Mercury 36" "Venus 67" "Earth 93" "Mars 142" "Jupiter 483"
doset -- $planet   #将变量planet设置为位置参数#(例:将"Mercury 36"设置为$1="Mercury" $2="36")#"--"将防止$planet为空,或者是以一个破折号(——)开头。echo "$1   $2,000,000 miles from the sun"
doneexit 0

可以在for循环中的[list]位置放入一个变量

Example 10.3 文件信息:对包含在变量中的文件列表进行操作

#!/bin/bash
#fileinfo.shFILES="/usr/sbin/accept
/usr/sbin/pwck
/usr/sbin/chroot
/usr/bin/fakefile
/sbin/badblocks
/sbin/ypbind"   #你关心的文件列表。扔进去一个假文件:/usr/bin/fakefile
echofor file in $FILES
doif [ ! -e "$file" ];then   #检查文件是否存在echo "$file does not exist.";echocontinue   #跳出当前的循环,进入下一个fils -l $file | awk '{print $9 "   file size:" $5}'whatis `basename $file`   #文件信息#注意:whatis数据库需要提前建立好。需要用到makewhatis开启whatis数据库echo
doneexit 0

whatis

描述一个命令执行什么功能。前提是需要开启whatis数据库
开启whatis数据库:

makewhatis   #需要等待一会时间

关闭whatis数据库:

makewhatis   #whatis数据库会消耗资源,所以一般不用开启

命令格式:

whatis [ -M PathName ] Command ...

命令参数:
-M PathName 指定一个可替代的搜索路径。搜索路径由 PathName 参数指定,并且是一个 whatis 命令期望在其中找到标准手册子目录的以冒号分隔的目录列表。

使用实例:

[root@localhost ~]# whatis ls
ls                   (1)  - list directory contents
ls                   (1p)  - list directory contents
[root@localhost ~]# whatis cd
cd                   (1p)  - change the working directory
cd [builtins]        (1)  - bash built-in commands, see bash(1)

如果在for循环的[list]中有通配符(*和?),那将会产生文件名扩展,也就是file globbing。

Example 10.4 在for循环中操作文件

#!/bin/bash
#list-glob.sh
echofor file in *
dols -l "$file"   #列出所有在$PWD中的所有文件
done
#如果没有匹配到任何文件,那它将扩展成自己,为了不让这种情况发生,那就设置nullglob选项。
#如果设置nullglob,bash允许没有匹配任何文件的文件名模式扩展成一个空串,而不是他们本身
#shopt -s nullglobecho;echo
for file in [jx]*
dorm -f $fileecho "Remove file \"$file\""
doneechoexit 0

在一个for循环中忽略[list]的话,将会是循环操作$@(从命令行传递给脚本的参数列表)。一个非常好的例子,见Example A.16

Example 10.5 在for循环中省略[list]

#!/bin/bash
#使用两种方法来调用这个脚本,一种是带参数,一种不带参数for a
doecho -n "$a"
done
#没有[list],所以循环将操作$@(包括空白的命令参数列表)
echoexit 0

也可以使用命令替换来产生for循环的[list]。具体见Example 12.48,Example10.10,Example 12.43

Example 使用命令替换来产生for循环的[list]

#!/bin/bash
#for-loopcmd.sh:带[list]的for循环,[list]由命令产生NUMBERS="8 7 3 4 37.53"for number in `echo $NUMBERS`
doecho -n "$number"
doneecho
exit 0

下面是一个用命令替换来产生[list]的更复杂的例子

Example 10.7 对于二进制文件的一个grep替换

#!/bin/bash
#bin-grep.sh:在一个二进制文件中定位匹配字串
#对于二进制文件的一个grep替换与grep -a的效果相似E_BADARGS=65
E_NOFILE=66if [ $# -ne 2 ];thenecho "Usage:`basename $0` 搜索字符串 文件名"exit $E_BADARGS
fiif [ ! -f "$2" ];thenecho "File \"$2\" does not exist"exit $E_NOFILE
fiIFS="\n"   #保罗·马塞尔·科埃略·阿拉高提出的建议#不知道设置这个的作用是什么
for word in $(strings "$2" | grep "$1")
#strings命令列出二进制文件中的所有字符串,输出管道交给grep来过滤
doecho $word
done

Example 10.8 列出系统上的所有用户

#!/bin/bash
#userlist.shPASSWORD_FILE=/etc/passwd
n=1
for name in $(awk 'BEGIN{FS=":"}{print $1}' < "$PASSWORD_FILE")
#awk -F ":" '{print $1}' < "$PASSWORD_FILE"   (我比较习惯用这种)
doecho "USER #$n = $name"let " n += 1"
doneexit 0

关于用命令替换来产生[list]的最后例子

Example 10.9 在目录的所有文件中查找源字串

#!/bin/bash
#findstring.sh:在一个指定目录的所有文件中查找一个特定的字符串directory=/usr/bin
fstring="Free Software Foundation"for file in $(find $directory -type f -name '*' | sort)   #个人觉得-name参数没必要
dostrings -f $file |grep "$fstring" | sed -e "s%$directory%%"
doneexit 0

for循环输出也可以通过管道传递到一个或多个命令中

Example 10.10 列出目录中所有的符号链接文件

#!/bin/bash
#symlinks.sh:列出目录中所有的符号链接文件directory=${1-`pwd`}   #如果没有其他的特殊指定,默认为当前工作目录
echo "symbolic links in directory \"$directory\""for file in "$(find $directory -type l)"
doecho "$file"
done | sort
#严格上说,此处并不一定非要一个循环不可,因为find的结果将被扩展成一个单词
#这种方式很容易理解和说明exit 0#Jean Helou建议使用下边的方法:
echo "symbolic links in directory \"$directory\""
#当前IFS的备份。要小心使用这个值
OLDIFS=$IFS
IFS=:for file in $(find $directory -type l -printf "%p$IFS")   #-printf "%p$IFS"没看懂
doecho "$file"
done | sort

循环的输出可以重定向到文件中,我们对上边的例子做了一点修改
Example 10.11 将目录中的符号链接文件名保存到一个文件中

#!/bin/bash
#symlinks.sh:列出目录中的符号链接文件
OUTFILE=symlinks.list
directory=${1-`pwd`}echo "symbolic links in directory \"$directory\"" > "$OUTFILE"
echo "----------" >> "$OUTFILE"for file in "$(find $directory -type l)"
doecho "$file"
done | sort >> "$OUTFILE"exit 0

有一种非常像C语言的for循环的语法。这需要使用(())

Example 10.12 一个C风格的for循环

#!/bin/bash
#两种循环到10的方法
echo#标准语法
for a in 1 2 3 4 5 6 7 8 9 10
doecho -n "$a"
done   #12345678910echo;echo#现在,使用C风格的语法
LIMIT=10
for ((a=1;a<= LIMIT;a++))
doecho -n "$a"
done   #12345678910echo;echo#让我们使用C的逗号操作符,来同时增加两个变量的值
for ((a=1,b=1;a<=LIMIT;a++,b++))
doecho -n "$a-$b"
done   #1-12-23-34-45-56-67-78-89-910-10echo;echo
exit 0

参考Example 26.15,Example 26.16,Example A。6

现在来一个现实生活中使用的for循环

Example 10.13 在bash mode中使用efax(efax是收发传真的程序,我这里只手敲了一遍,没做理解测试)

#!/bin/bash#Faxing(fax必须已经被安装过了)EXPECTED_ARGS=2E_BADARGS=65if [ $# -ne $EXPECTED_ARGS ];thenecho "Usage:`basename $0` phone# text-file"exit $E_BADARGS
fiif [ ! -f "$2" ];thenecho "File $2 is not a text file"exit $E_BADARGS
fifax make $2   #从文本文件中创建传真格式的文件for file in $(ls $2.0*)   #连接转换过的文件。在变量列表中使用通配符
dofil="$fil $file"
doneefax -d /dev/ttyS3 -o1 -t "T$1" $fil   #干活的地方exit 0

while 循环

这种结构在循环的开头判断条件是否满足,如果条件一直满足,那就一直循环下去(0为退出码)。与for循环的区别是,这种结构适合用在循环次数未知的情况下。

while [condition]
docommand...
done

注意一下某种特定的while循环,比如getopts结构,好像和这里所介绍的模板有点脱节。

Example 10.14 简单的while循环

#!/bin/bash
#
var0=0
LIMIT=10while [ "$var0" -lt "$LIMIT" ]
doecho -n "$var0 "var0=`expr $var0 + 1`#var0=$(($var0+1))#var0=$((var0 + 1))#let "var0 += 1"#以上3种方法都可
done
echo
exit 0
#0 1 2 3 4 5 6 7 8 9Example 10.15 另一个while循环
#!/bin/bash
#
echo
while [ "$var1" != "end" ]
doecho "Input variable #1 (end to exit)"read var1echo "variable #1 = $var1"echo
done
exit 0

一个while循环可以有多个条件判断,但是只有最后一个才能决定是否退出循环。然而这需要一种有点不同的循环语法

Example 10.16 多条件的while循环

#!/bin/bash
#
var1=unset
previous=$var1while echo "prvious-variable = $previous"
echo
previous=$var1
doecho "Input variable #1 (end to exit)"read var1echo "variable #1 = $var1"
done
#尝试理解这个脚本的运行过程,这里还是有点小技巧的。
exit 0

与for循环一样,while循环也可以通过(())来使用C风格语法。(见Example 9.30)

Example 10.17 C风格的while循环

#!/bin/bash
#wh-loopc.sh:循环10次的while循环
LIMIT=10
a=1while [ "$a" -le $LIMIT ]
doecho -n "$a"let "a+=1"
doneecho;echo#现在,重复C风格的语法
((a = 1))   #a=1,双圆括号允许赋值两边的空格,就像C语言一样
while ((a <= LIMIT))
doecho -n "$a"((a += 1))
done
echo
exit 0

注意:while循环的stdin可以用<来重定向到文件。

while循环的stdin支持管道

until 循环

这个结构在循环的顶部判断条件,并且如果条件一直为false那就一直循环下去。(与while相反)

until [ condition-is-true ]
docommand...
done

注意:until循环的判断在循环的顶部,这与某些编程语言是不同的。

Example 10.18 until循环

#!/bin/bash
#
END_CONDITION=enduntil [ "$var1" = "$END_CONDITION" ]
doecho "Input variable #1"echo "($END_CONDITION to exit)"read var1echo "variable #1 = $var1"echo
done
exit 0

10.2 嵌套循环

嵌套循环就是在一个循环中还有一个循环,内部循环在外部循环体中。在外部循环的每次执行过程都会触发内部循环,直到内部循环执行结束。外部循环执行了多少次,内部循环就执行了多少次。当然,不论是外部循环还是内部循环的break语句都会打断处理过程。

Example 10.19 嵌套循环

#!/bin/bash
#nested-loop.sh:嵌套的for循环
outer=1   #设置外部循环计数#开始外部循环
for a in 1 2 3 4 5
doecho "Pass #outer in outer loop"echo "----------"inner=1   #重设内部循环的计数#----------------------------------  #开始内部循环for b in 1 2 3 4 5doecho "Pass $inner in inner loop"let "inner += 1"   #增加内部循环计数done#内部循环结束#----------------------------------let "outer += 1"   #增加外部循环的计数echo   #每次外部循环之间的间隔
done
#外部循环结束
exit 0

10.3 循环控制

影响循环行为的命令
break,continue
break和continue这两个循环控制的命令与其它语言的类似命令的行为是相同的
break命令将会跳出循环
continue命令将会跳过本次循环下边的语句,直接进入下一次循环

Example 10.20 break和continue命令在U型你换中的效果

#!/bin/bash
#
LIMIT=19   #上限
echo
echo "Printing Numbers 1 through 20(but not 3 and 11)"
a=0while [ $a -le "$LIMIT" ]
doa=$(($a+1))if [ "$a" -eq 3 ] || [ "$a" -eq 11 ];thencontinuefiecho -n "$a"   #在$a等于3和11的时候,这句将不会执行
doneecho;echo
echo "Printing Number 1 through 20,but something happens after 2"
#同样的循环,但是用break来代替continue
a=0
while [ "$a" -le "$LIMIT" ]
doa=$((a+1))if [ "$a" -gt 2 ];thenbreakfiecho -n "$a"
done
echo;echo
exit 0

break命令可以带一个参数。一个不带参数的break循环只能退出最内层的循环,而break N 可以退出N层循环

Example 10.21 多层循环的退出

#!/bin/bash
#break-levels.sh:退出循环
for outerloop in 1 2 3 4 5
doecho -n "Group $outerloop: "#------------------------for innerloop in 1 2 3 4 5doecho -n "$innerloop"if [ "$innerloop" -eq 3 ];thenbreakfidoneecho
done
echo
exit 0
#Group 1: 123
#Group 2: 123
#Group 3: 123
#Group 4: 123
#Group 5: 123
#当break 2时:值为:Group 1: 123

continue命令也可以带一个参数。一个不带参数的continue命令只能去掉本次循环剩余代码。而continue N 命令将会把N层循环剩余的代码都去掉,但是循环的次数不变

Example 10.22 多层循环的continue

#!/bin/bash
#
for outer in I II III IV V   #外部循环
doecho;echo -n "Group $outer: "#----------------------------for inner in 1 2 3 4 5 6 7 8 9 10   #内部循环doif [ "$inner" -eq 7 ];thencontinue 2fiecho  -n "$inner"done
done
echo;echo
exit 0
#Group I: 123456
#Group II: 123456
#Group III: 123456
#Group IV: 123456
#Group V: 123456
#当continue没有参数时:值为:
#Group I: 1234568910
#Group II: 1234568910
#Group III: 1234568910
#Group IV: 1234568910
#Group V: 1234568910

Example 10.23 在实际的任务中使用continue N(又一个没看懂的例子)

#!/bin/bash
#
#艾伯特·雷纳给出的一个例子
while true
dofor n in .iso.*do[ "$n" = ".iso.opts" ] && continuebeta=${n#.iso.}[ -r .Iso.$beta ] && continue[ -r .lock.$beta ] && sleep 10 && continuelockfile -r0 .lock.$beta || continueecho -n "$beta: " `date`run-isotherm $betadatels -alF .Iso.$beta[ -r .Iso.$beta ] && rm -f .lock.$betacontinue 2donebreak
donewhile true
dofor job in {pattern}do{job already done or running} && continue{mark job running,do job,mark job as done}continue 2donebreak
done

10.4 测试与分支(case和select结构)

case和select结构在技术上说不是循环,因为它们并不对可执行的代码块进行迭代。但是和循环相似的是,它们也依靠在代码块的顶部或是底部的条件判断来决定程序的分支。

在代码块中控制程序分支

case (in) / esac

在shell中的case同C/C++中的switch结构是相同的。它允许通过判断来选择代码块中多路径中的一条

case "$variable" in
"$condition1")command...;;
"$condition2")command...;;
esac

注意:对变量使用""并不是强制的,因为不会发生单词分离。每句测试行都已右小括号)结尾。每个条件都已两个分号结尾;;。case块的结束以esac结尾。

Example 10.24 使用case

#!/bin/bash
#测试字符串范围echo;echo "Hit a key,then hit return"
read Keypresscase "$Keypress" in
[[:lower:]]) echo "Lowercase letter";;
[[:upper:]]) echo "Uppercase letter";;
[0-9]) echo "Digit";;
*) echo "Puntuation,whitespace,or other";;
esac
exit 0

练习1:修改以上脚本,让它能够重复输入,报告每个按键,并且只有在X被键入是才结束

#!/bin/bash
#循环测试字符串范围while [ "$Keypress" != "X" ]
doecho;echo "Hit a key,then hit return"read Keypresscase "$Keypress" in[[:lower:]]) echo "Lowercase letter";;[[:upper:]]) echo "Uppercase letter";;[0-9]) echo "Digit";;*) echo "Puntuation,whitespace,or other";;esac
done
exit 0

练习1:修改以上脚本,让它能够重复输入,报告每个按键,并且只有在X被键入是才结束

#!/bin/bash
#循环测试字符串范围while true
doecho;echo "Hit a key,then hit return"read Keypresscase "$Keypress" in"X") break;;   #经测试:此判断必须要放在[[:upper:]]之前,不然会先判断为Uppercase letter[[:lower:]]) echo "Lowercase letter";;[[:upper:]]) echo "Uppercase letter";;[0-9]) echo "Digit";;*) echo "Puntuation,whitespace,or other";;esac
done
exit 0

Example 使用cse来创建菜单

#!/bin/bash
#
clear
echo "             联系人名单"
echo "          ------------"
echo "选择下列人员之一:"
echo
echo "[E]vans,Roland"
echo "[J]ones, Mildred"
echo "[S]mith, Julie"
echo "[Z]ane, Morris"
echo
read personcase $person in
"E"|"e")echoecho "Roland Evans"echo "4321 Floppy Dr"echo "Hardscrabble,CO 80753"echo "(303) 734-9874"echo "(303) 734-9892 fax"echo "revans@zzy.net"echo "Business partner & old friend";;
"J" | "j" )echoecho "Mildred Jones"echo "249 E. 7th St., Apt. 19"echo "New York, NY 10009" echo "(212) 533-2814"echo "(212) 533-9972 fax"echo "milliej@loisaida.com"echo "Ex-girlfriend"echo "Birthday: Feb. 11";;#后面的[S]和[Z]就不写了
*)echoecho "Not yet in database";;
esac
echo
exit 0

一个case的特殊用法,用来测试命令行参数

#!/bin/bash
#
case "$1" in
"") echo "Usage: ${0##*/} <filename>";exit 65;;   #没有命令行参数,或者第一个参数为空
-*) FILENAME=./$1;;  #如果传递进来的文件名参数以"-"开头,那么用./$1来代替,这样后边的命令将不会把它作为一个选项来解释
*) FILENAME=$1;;   #否则就$1
esac

这是一个更容易懂的命令行参数处理的一个例子

#!/bin/bash
#来自 Stefano Falsetto 的 "Log2Rot" 脚本的"rottlog" 包的一部分.
while [ $# -gt 0 ]   #直到你用完所有参数
docase "$1" in-d|--debug) DEBUG=1;;-c|--conf) CONFFILE="$2"shiftif [ ! -f $CONFFILE ];thenecho "Error:Supplied file doesn't exist!"exit 65fi;;esacshift  #检查剩下的参数
done

Example 10.26 使用命令替换来产生case变量

#!/bin/bash
#case-cmd.shcase $(arch) in   #arch返回机器的类型。等价于uname -m
i386) echo "80386-based machine";;
i486) echo "80486-based machine";;
i586) echo "Pentium-based machine";;
i686) echo "Pentium2+-based machine";;
*) echo ""Other type of machine";;
esac
exit 0

case结构也可以过滤globbing模式的字符串

Example 10.27 简单字符串匹配

#!/bin/bash
#match-string.shmatch_string(){MATCH=0NOMATCH=90PARAMS=2BAD_PARAMS=91[ $# -eq $PARAMS ] || return $BAD_PARAMScase "$1" in"$2") return $MATCH;;*) return $NOMATCH;;esac
}a=one
b=two
c=three
d=twomatch_string $a   #参数个数错误
echo $?  #91match_string $a $b   #不匹配
echo $?   #90match_string $b $d   #匹配
echo $?   #0
exit 0

Example 10.28 检查是否是字母输入

#!/bin/bash
#isalpha.sh:使用case结构来过滤字符串SUCCESS=0
FAILURE=1isalpha(){   #检查输入的第一个字符是不是字母表上的字符if [ -z "$1" ];then   #没有参数return $FAILUREficase "$1" in[a-zA-Z]*) return $SUCCESS;;   #以一个字母开头*) return $FAILURE;;esac
}isalpha2(){   #测试整个字符串是否都是字母表字符[ $# -eq 1 ] || return $FAILUREcase $1 in *[!a-zA-Z]*|"") return $FAILURE;;*) return $SUCCESS;;esac
}isdigit(){   #测试是否整个字符串都是数字(换句话说就是测试是否是整数变量)[ $# -eq 1 ] || return $FAILUREcase $1 in*[!0-9]*|"") return $FAILURE;;*) return $SUCCESS;;esac
}check_var(){   #测试isalpha()if isalpha "$@"thenecho "\"$*\" 以字母字符开头"if isalpha2 "$@"thenecho "\"$*\" 只包含字母字符"elseecho "\"$*\" 至少包含一个非字母字符"fielseecho "\"$*\" 以非字母字符开头"fiecho
}digit_check(){   #测试isdigit()if isdigit "$@"thenecho "\"$*\"只包含数字[0-9]"elseecho "\"$*\"至少有一个非数字字符" fiecho
}a=23asdad
b=H3ada
c=-What?
d=What?
e=`echo $b`
f=AbcDef
g=12345
h=12f45
i=12.34check_var $a
check_var $b
check_var $c
check_var $d
check_var $e
check_var $f
check_var
digit_check $g
digit_check $h
digit_check $iexit 0

select

select结构是建立菜单的另一种工具,这种结构是从ksh中引入的

select variable [ in list]
do
command...
break
done

提示用户选择的内容,比如放在变量列表中。注意:select命令使用PS3提示符[默认为(#?)],但是可以修改PS3

Example 10.29 用select来创建菜单

#!/bin/bash
#
PS3='Choosr your favorite vegetable: '   #设置提示符
echo
select vegetable in "beans" "carrots" "potatoes" "onions" "rutabagas"
doecho "Your favorite veggie is $vegetable"echo "Yuck"echobreak
done
exit 0

如果忽略了in list列表,那么select命令将使用传递到脚本的命令行参数,或者是函数参数,前提是将select写到这个函数中

与for variable [in list]结构在忽略[in list]时的行为相比较

Example 10.30 用函数中select结构来创建菜单

#!/bin/bash
#
PS3="Choosr your favorite vegetable: "
echo
choice_of(){select vegetable   #[in list]被忽略,所以select用传递给函数的参数doechoecho "Your favorite veggie is $vegetable"echo "Yuck"echobreakdone
}choice_of beans rice carrots radishes tomatoes spinachexit 0

参见Example 34.3

shell高级编程笔记(第十章 循环和分支)相关推荐

  1. shell高级编程笔记(第九章 变量重游)

    第三部分 超越基本 第九章 变量重游 如果变量使用恰当,将会增加脚本的能量和灵活性.但前提是这需要仔细学习变量的细节知识. 9.1 内部变量 $BASH 这个变量将指向Bash的二进制执行文件的位置 ...

  2. NDK 高级编程(笔记)

    Android 开发中针对 NDK 的书籍很少,<Pro Android C++ with the NDK>也是出版的比较早的一本书,有些内容可能对现在的开发并不适用.但是书中介绍的内容比 ...

  3. linux常见命令以及shell入门编程(笔记总结记录)

    linux常见命令以及shell入门编程(笔记总结记录) 文章目录 linux常见命令以及shell入门编程(笔记总结记录) 一.linux常见命令 1.不常用 2.常用 3.数据查找处理相关 1.g ...

  4. Unix环境高级编程 笔记

    Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...

  5. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是"哇"这种很吃惊的表情.其实大概三年前,那会 ...

  6. UNIX环境高级编程笔记

    1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len);   SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务:   ...

  7. UINX环境高级编程笔记 第3章 文件I/O

    UNIX环境高级编程 第三章 文件I/O 3.1 引言 3.2 文件描述符 3.3 函数open和openat 3.4 函数creat 3.5 函数close 3.6 函数lseek 3.7 函数re ...

  8. shell脚本编程笔记(二)—— 执行数学运算

    数学运算在编程中也很重要,shell对它的支持并不算好,本文整理一下shell进行数学运算的途径,各种方法的缺点. 一. expr命令 shell最开始处理数学表达式的命令,可以在命令行做算术运算,参 ...

  9. Python 高级编程笔记之类别

    目录: 子类化内建类型 访问超类中的方法-super 描述符 & 属性 元编程 主要内容: 1.子类化内建类型 # -*- coding:utf-8 -*-class Folder(list) ...

最新文章

  1. WebSocket API简介
  2. svn版本控制git(github)
  3. 详解在Linux下实现(彩色)进度条程序,并通过makefile进行编译.
  4. FileReader类型之文字读取
  5. java ee cdi_Java EE CDI程序化依赖关系消歧示例–注入点检查
  6. WPF 绑定StaticResource到控件的方法
  7. asp.net 开发注意的几点
  8. [收藏转载]明星软件工程师的十种特质
  9. Windows编程-基本图元(1)
  10. 《我的祖国》正确英译应该是《The Evercountry, Mine》
  11. 容器技术Docker K8s 43 Serverless Kubernetes(ASK)详解-ASK网络、存储、日志、监控管理
  12. 基于情感词典进行情感态度分析
  13. tushare平台介绍
  14. 【FPGA】基于bt1120时序设计实现棋盘格横纵向灰阶图数据输出
  15. 软件项目管理与过程改进 BB平台 题库整理
  16. 怎样用python获取财经网新闻
  17. 认识计算机软件的教学过程,《认识计算机》教学设计
  18. 强智教务php,强智科技教务处模拟登录
  19. NCNN+Int8+yolov5部署和量化
  20. 知识变现海哥|知识变现需要使用哪些工具

热门文章

  1. Hallucinated-IQA
  2. 淘宝天猫双十一视频代码视频播放代码怎么做如何添加视频代码播放功能自动播放点击播放按钮企业宣传广告视频播放代码生成器代码制作如何设置教程经验分享店铺首页装修
  3. 2022年全球市场宠物美容总体规模、主要生产商、主要地区、产品和应用细分研究报告
  4. python 计算方位角(根据两点的坐标计算)
  5. 这个在线代码编辑器,可以把代码分享给任何人!
  6. Unity3D——学习分享(七)太阳环绕地球项目
  7. yolov5_6.0以上的模型和6.0以下的模型不兼容问题。Can‘t get attribute ‘SPPF‘
  8. uploadify插件浏览器flash兼容
  9. 分享NFC无源墨水屏方案 无源NFC电子墨水屏方案 无源NFC墨水屏方案 NFC无源电子纸方案 NFC无电池墨水屏方案 NFC墨水屏方案
  10. 机房收费系统下机之动态显示余额和强制下机(1)