Linux 系统编程 第二章 补充与进阶 2.1 Linux 常用命令 补充:根目录结构
目录名称
内容
/bin
用户可执行文件,如ps
ls
ping
等
/sbin
系统管理所用的可执行文件
/etc
所有程序需要的配置文件
/dev
设备文件
/proc
虚拟的文件系统,包含系统进程的相关信息
/var
变量文件,如系统日志、数据库文件等
/tmp
系统和用户创建的临时文件
/usr
用户程序
/home
用户个人文档
/boot
引导加载程序的相关文件
/lib
系统库
/opt
可选的附加应用程序
/mnt
临时安装目录,用于挂载文件系统
/media
可移动媒体设备目录,用于挂载 CD-ROM 等设备的临时目录
/srv
服务器特定服务的数据
一、文件系统相关命令 列出内容
查看当前目录
创建目录 1 2 mkdir bin mkdir -p /tmp/me/test
切换工作目录 1 2 3 cd /usr/local cd .. cd -
删除空目录
拷贝 1 2 3 cp /etc/passwd ~/Desktop cp -r /tmp/test /root cp -rp /tmp/t1 /tmp/t2 /root
删除 1 2 3 rm a.c rm -f /tmp/log.txt rm -rf /tmp/test
二、文件处理命令 创建文件 1 2 touch a.cpptouch /tmp/errlog.txt
查看文件内容 1 2 cat /etc/passwdcat -n /etc/passwd
分屏查看文件
取首尾 n 行内容 1 2 head -n 10 /etc/passwdtail -n 15 /etc/passwd
统计文本 1 2 3 4 5 wc /etc/passwd wc -l /etc/passwd wc -w /etc/passwd wc -m /etc/passwd wc -c /etc/passwd
创建链接 1 2 ln hello.c hello.hl ln -s hello.c hello.sl
创建命名管道
三、权限管理命令 修改权限 1 2 3 4 5 chmod 421 testfile chmod -R 660 testdir chmod u+r testfile chmod g+w testfile chmod o+x testfile
补充:读写执行权限对于文件和目录的含义
权限
对文件的含义
对目录的含义
读权限
可以查看文件内容
可以列出目录内容
写权限
可以修改文件内容
可以在其中创建文件
可执行权限
可以执行文件
可以进入目录
修改文件所有者 1 chown xiaoxingou test1 /tmp/test2
修改文件所属组 1 chgrp group1 text1 /tmp/text2
四、搜索相关命令 查找文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 find /etc -name init find /etc -name init\* find /etc -name init??? find /etc -size +100M find /etc -size 60K find /etc -size -5G find ~ -user abc find ~ -group abc find /etc -atime -5s find /etc -atime -20m find /etc -ctime +6h find /etc -mtime +10d find /etc -mtime -4w find ~ -name test \* -a -type f find ~ -type d -o -type l
查看命令所在目录及别名信息
查看命令所在位置及帮助文档路径
文本搜索(过滤) 1 2 3 4 5 6 7 8 9 10 11 12 grep root a.txt grep -c root a.txt grep -i RoOt a.txt grep -n root a.txt grep -v root a.txt grep -E "123.[45]" a.txt grep -E -v "^123" a.txt grep -E "^[Rr]oot" a.txt grep -E "r..t" a.txt grep -E "w\{2,\}" a.txt grep -E "w\{3,5\}" a.txt grep -n -E "^$" a.txt
五、帮助命令 查看文档 1 2 3 4 man man man ls man 2 write man 3 sem_init
获取简介
查看详细信息
六、用户管理命令 添加用户
修改密码
查看登录用户信息
查看登录用户详细信息
查看历史登录信息
切换用户 1 2 3 4 5 6 su su root su - su - root su somebody su - somebody
七、压缩与解压缩命令 压缩 1 2 3 4 gzip testfile zip testfile.zip testfile zip -r testdir.zip testdir
解压缩 1 2 3 gunzip test.gz unzip test.zip
归档 1 2 tar -zcf testdir testdir.tar.gz tar -zxvf testdir.tar.gz testdir
八、网络相关命令 发送信息
广播
测试网络连通性 1 2 ping baidu.com ping -c 5 baidu.com
查看和设置网卡信息
查看网络信息 1 2 3 4 5 6 7 8 9 netstat netstat -ltun netstat -an netstat -rn
九、系统相关命令 打印当前时间
打印日历 1 2 3 cal cal 10 2003 cal 2020
关机 1 2 3 shutdown -h now shutdown -h +10 shutdonw -h 23:30
立即关机
立即重启
2.2 vim 编辑器 一、vim 的四种模式及其切换
二、普通模式 光标移动
输入
操作
h 或 [退格] 或 [左箭头]
左移一个字符
j 或 [下箭头]
下移一行
k 或 [上箭头]
上移一行
l 或 [空格] 或 [右箭头]
右移一个字符
w
移到下一个单词开头
W
移到下一个单词开头,忽略一些标点
b
移到上一个单词开头
B
移到上一个单词开头,忽略一些标点
+ 或 [Enter]
移到下一行第一个非空白字符处
-
移到上一行第一个非空白字符处
fc
移到同一行下一个字符 c 处
Fc
移到同一行上一个字符 c 处
tc
移到同一行下一个字符 c 前
Tc
移到同一行上一个字符 c 前
;
配合 f 或 t 使用,重复一次
,
配合 f 或 t 使用,反向重复一次
上述输入均可配合数字使用,先输入一个数字 n,再输入该内容,表示重复操作 n 次。
输入
操作
0 或 ^
移到行首
$
移到行末
gg
移到文件头
G
移到文件尾部
H
移到屏幕最顶端一行
M
移到屏幕中间一行
L
移到屏幕最底端一行
翻屏
输入
操作
control + f
下翻一屏
control + b
上翻一屏
control +d
下翻半屏
control + u
上翻半屏
control + e
向下滚动一行
control + y
向上滚动一行
n%
滚动到文件 n% 的位置
zz
将当前行移动到屏幕中央
zt
将当前行移动到屏幕顶端
zb
将当前行移动到屏幕底端
文本快速操作 复制
输入
操作
y
复制可视化模式下选中的内容
yy / nyy / yny
复制当前行 / 复制 n 行
y^
复制当前到行首的内容
y$
复制当前到行末的内容
yh / ynh / nyh
复制左边字符 / 复制左边 n 个字符
yl / nyl / ynl
复制右边字符 / 复制右边 n 个字符
yw / nyw / ynw
复制当前单词 / 复制 n 个单词
yG
复制到文件尾部
剪切(删除)
输入
操作
d
剪切可视化模式下选中的内容
dd / ndd / dnd
剪切当前行 / 剪切 n 行
d^
剪切当前到行首的内容
d$
剪切当前到行末的内容
x / dl / nx / ndl / dnl
剪切右边字符 / 剪切右边 n 个字符
X / dh / nX / ndh / dnh
剪切左边字符 / 剪切左边 n 个字符
dw / ndw / dnw
剪切当前单词 / 剪切 n 个单词
dG
剪切到文件尾部
粘贴
输入
操作
p
粘贴至光标后
P
整行的复制粘贴到上一行 / 非整行的复制粘贴到光标前
撤销与重做
输入
操作
u
撤销
U
撤销当前行最近所有修改
control + r
重做
二、命令模式 查找
命令
操作
:/something
在光标后面的文本中查找 something
:?something
在光标前面的文本中查找 something
n
查找下一个
N
查找上一个
:nohl
关闭高亮
替换
命令
操作
:s/old/new[/i]
用 new 替换当前行第一个 old [忽略大小写]
:s/old/new/g[i][c]
用 new 替换当前行所有 old [忽略大小写] [每次替换前询问]
:n1, n2s/old/new/g[i][c]
用 new 替换 n1 行到 n2 行所有 old [忽略大小写] [每次替换前询问]
:%s/old/new/g[i][c]
用 new 替换所有 old [忽略大小写] [每次替换前询问]
:n1, n2s/^/xxx/g
在 n1 行到 n2 行的行首插入 xxx
:%s/^/xxx/g
在每一行行首插入 xxx
:n1, n2s/$/xxx/g
在 n1 到 n2 行行末插入 xxx
:%s/$/xxx/g
在每一行行末插入 xxx
三、可视化模式
在普通模式下
在可视化模式下,光标移过的地方就会被选中,选中后,有类似于普通模式的快捷操作。操作完毕返回普通模式。
输入
操作
y
复制选中内容
Y
复制选中行,哪怕某行没有被完全选中
d
剪切选中内容
D
剪切选中行,哪怕某行没有被完全选中
c
删除选中文本并进入插入模式
C
删除选中行并进入编辑模式,哪怕某行没有被完全选中
>
增加缩进
<
减少缩进
~
大小写转换
:write filename
将选中内容写入文件
2.3 gcc 编译器 基本的编译选项
1 gcc -E hello.c -o hello.i
1 gcc -S hello.c -o hello.s
1 gcc -c hello.c -o hello.o
1 gcc hello.c -o hello -save-temps
1 gcc -o test test.c myfunc.o -Iinclude
由编译过程中的一个或若干个、一种或若干种中间文件,可以生成-o
选项后的目标文件,只要该文件处于编译阶段的更下游。
静态库
1. 编写静态库源代码和测试程序 1 2 3 4 5 #ifndef _FOO_H_ #define _FOO_H_ extern void foo () ;#endif
1 2 3 4 #include "foo.h" #include <stdio.h> void foo () { printf ("foo\n" ); }
1 2 3 4 #include <stdio.h> #include "foo.h" int main () { printf ("Hello World!\n" ); foo(); return 0 ; }
2. 编译并生成静态库 1 gcc -c bin/foo.c -Iinclude -o obj/foo.o
1 ar rcs lib/libfoo.a obj/foo.o
3. 链接静态库 1 2 gcc src/main.c -static lib/libfoo.o -o bin/main
1 2 gcc src/main.c -static -Llib -lfoo -o bin/main
动态库 1. 编写动态库源代码和测试程序 1 2 3 4 5 #ifndef _BAR_H_ #define _BAR_H_ extern void bar () ;#endif
1 2 3 4 #include "bar.h" #include <stdio.h> void bar () { printf ("bar\n" ); }
1 2 3 4 #include <stdio.h> #include "bar.h" int main () { printf ("Hello World!\n" ); bar(); return 0 ; }
2. 编译并生成动态库 1 gcc src/bar.c -shared -fPIC -o lib/libbar.so
3. 指明动态库的位置 1 2 export LD_LIBRARY_PATH=$(pwd )/lib
1 2 gcc src/main.c -Llib -lbar -Wl,-rpath=`pwd `/lib -o bin/main
1 2 sudo cp lib/libbar.so /usr/bin
4. 链接动态库 1 2 gcc src/main.c lib/libbar.so -o bin/main
补充:静态库与动态库的区别
静态库封装了函数,链接时会把对应的代码嵌入到可执行文件中。静态库的编译速度较快,但每个与静态库链接的程序,都有库中一部分函数代码的拷贝,且在运行时每一份拷贝都要占用相应的物理内存。此外,库的版本升级,就意味着所有用到该库的程序都需要重新链接,非常麻烦。
动态库在链接时并不拷贝代码,而是在目标文件中记录一条引用信息,在程序运行时才根据该信息由动态链接器去定位对应代码的位置并执行,使得可执行程序的体积明显减小。其次,每个动态库在物理内存中只有一份副本,调用它的程序会在各自的虚存中映射同一份副本,节省了内存空间。此外,动态库便于库的版本更新。
2.4 make 工具 make 工具是维护程序项目的便捷手段,它通过一个文本文件去描述项目文件之间的依赖性,通过执行make命令在项目内容修改后进行必要的重编译。 此处仅举一简例说明。
项目结构
源代码 1 2 3 4 #include "fun1.h" #include "fun2.h" int main () { fun1(); fun2(); return 0 ; }
1 2 3 4 5 #ifndef _FUN1_H_ #define _FUN1_H_ extern void fun1 () ;#endif
1 2 3 4 #include "fun1.h" #include <stdio.h> void fun1 () { printf ("fun1\n" ); }
1 2 3 4 5 #ifndef _FUN2_H_ #define _FUN2_H_ extern void fun2 () ;#endif
1 2 3 4 #include "fun2.h" #include <stdio.h> void fun2 () { printf ("fun2\n" ); }
编写 Makefile,指明文件之间的依赖性 一般地,Makefile 中的通用格式为
1 2 3 [目标文件]: [依赖文件 1] [依赖文件 2] ... # 空格分开 [由依赖文件产生目标文件的命令]
make
按照 GNUmakefile、makefile、Makefile 的顺序查找文件。如果描述依赖性的文件为其他名字,应用-f
参数指出:make -f othername
。
本例中的 Makefile 内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 GCC_FLAGS=-c -Wall main: main.o fun1.o fun2.o # 最终目标依赖三个 .o 文件 gcc -Wall main.o fun1.o fun2.o -o main main.o: src/main.c gcc $(GCC_FLAGS) src/main.c -Iinclude -o main.o fun1.o: src/fun1.c gcc $(GCC_FLAGS) src/fun1.c -Iinclude -o fun1.o fun2.o: src/fun2.c gcc $(GCC_FLAGS) src/fun2.c -Iinclude -o fun2.o .PHONY : clean # PHONY 声明 clean 是一个伪目标,此处用于删除 .o 中间文件clean: rm -rf *.o
执行make
执行make
,编译构建项目
执行make clean
,删除中间文件。由于已经声明 clean 是一个伪目标,make
将不去理会目录中有无名为 clean 的文件,也不考虑是否需要更新或生成该文件,而是直接执行其后的rm
命令。
2.5 Shell 编程 (一)Shell 概述 一、Shell 的两重含义
Shell 是一个命令行解释器 ,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序。用户可以用 Shell 来启动、运行、挂起、终止、编写程序。
Shell 是一种编程语言 ,是解释执行的脚本语言 。
二、Shell 的分类
Bourne Shell:Unix 从 1979 年开始使用 Bourne Shell,其文件后缀为 .sh。
C Shell:主要在 BSD 版的 Unix 系统中使用,其语法与 C 语言类似而得名。
Shell 的两种主要语法类型为 Bourne 和 C,互不兼容。前者包括 sh、ksh、bash、psh、zsh 等;后者包括 csh 和 tcsh 等。
bash 与 sh 兼容,现行 Linux 默认使用 bash 作为 Shell。
三、Shell 脚本的执行方式
编写脚本,如vim test.sh
。脚本内容可以理解为一条条命令的集合。
修改权限,如chmod 777 test.sh
。
执行脚本,如./test.sh
或sh test.sh
。
(二)echo与格式化输入输出 一、echo 打印字符串,自动换行 1 2 3 4 echo helloecho "hello" echo 'hello'
启用或关闭转义 1 2 echo -e "\aabc\bd\"\$\c" echo -E "\aa\\bc\bd\"\$\c"
取消自动换行
打印变量的值 1 2 3 4 5 6 7 8 9 #! /bin/bash # 此句说明使用的 Shell 是 bash echo $SHELL echo $PATH name=Tom echo $name echo "My name is $name ." echo "\$name = $name "
打印命令执行结果 1 2 3 4 5 #! /bin/bash echo `ls ` echo `pwd `" is the working directory." echo `cat /etc/passwd | grep root`
二、printf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #! /bin/bash printf "Hello World\n" printf `cat /etc/passwd | grep root` echo printf `pwd `" is the working directory.\n" ID=10000 name=Tom height=175.4 printf $ID echo printf "ID: $ID , name: $name , height: $height \n" printf "*ID: %-10d, name: %-10s, height: %-10.2f*\n" $ID $name $height
(三)Bash 常见功能 一、历史命令与命令补全
history
命令用来查看历史命令
-c
选项可以清空历史命令
-w
选项可以将缓存中的命令写入历史命令保存文件
调用历史命令
上下箭头可以调用历史命令
!n
可以查看第 n 条历史命令
!!
可以查看上一条命令
!串
可以查看最后一条以该串开头的历史命令
补全:输入命令或文件名后按 Tab 可以补全
二、命令别名
设置或查看别名
命令执行顺序
第一顺位:用绝对路径或相对路径表示的命令
第二顺位:用别名表示的命令
第三顺位:bash 的内部命令
第四顺位:按照$PATH
环境变量定义的目录,顺序查找到的第一个命令
三、重定向 标准输出重定向
命令
功能
命令 > 文件
以覆盖方式将命令正确输出写入文件
命令 >> 文件
以追加方式将命令正确输出写入文件
标准错误重定向
命令
功能
错误命令 2> 文件
以覆盖方式将命令错误输出写入文件
错误命令 2>> 文件
以追加方式将命令错误输出写入文件
同时重定向正误输出
命令
功能
命令 > 文件 2>&1
以覆盖方式同时将正确输出和错误输出写入文件
命令 >> 文件 2>&1
以追加方式同时将正确输出和错误输出写入文件
命令 &> 文件
以覆盖方式同时将正确输出和错误输出写入文件
命令 &>> 文件
以追加方式同时将正确输出和错误输出写入文件
命令 > 文件1 2>> 文件2
以覆盖方式将正确输出写入文件1,以追加方式将错误输出写入文件2
四、多命令执行
格式
功能
命令1; 命令2
顺序执行命令,命令间无关联
命令1 && 命令2
当命令1执行正确,命令2才会执行
命令1 || 命令2
当命令1执行错误,命令2才会执行
(四)变量 一、变量及其分类 1. 环境变量 1 2 3 4 5 6 7 8 echo $PATH echo $HOME echo $SHELL echo $USER echo $PWD echo $TERM echo $HOSTNAME
2. 系统变量
此类变量属于系统预定义变量,只能用$
引用,不能修改。
名称
含义
$0
当前脚本的名称
$1 $2 ... $9 ${10} ...
当前脚本的第 n 个参数
$*
当前脚本的所有参数(从 1 开始)
$#
当前脚本的参数个数(不包括脚本名称)
$?
命令或程序执行完的状态
$$$$
程序本身的 PID 号
$!
运行的最后一个进程的 PID 号
3. 用户自定义变量
定义变量 变量名=值
撤销变量 unset 变量名
定义常量 readonly 变量名=值
。此类变量不能修改值,也不能unset
查看当前 Shell 中的所有变量 set
命令
定义变量的规则
用户自定义环境变量
命令 export 变量名=变量值
,此种做法只能临时设置,重启终端后就会失效。
为系统引入自定义环境变量
在 /etc/profile 中增加一行export 变量名=变量值
保存退出,source /etc/profile
二、算数与逻辑运算 1. 运算符 支持四则运算、取模运算、自增自减、逻辑运算、比较运算、移位运算、位运算、赋值运算。特别,支持单目的+ -
运算和幂运算**
。
2. 整数运算
(())
运算命令,在前面加上$
获取结果
1 2 3 4 5 6 7 8 9 #! /bin/bash A=$((1 + 2 )) B=$((4 ** 2 )) C=$((--A)) D=$(($A + $B + $C )) E=$((A * B * C)) echo D=$D echo E=$E
1 2 3 4 5 6 7 8 9 #! /bin/bash A=5 B=10 echo $((A < B)) echo $((A >= B)) echo $((A != B)) echo $(($((A ** 3 )) > $((B << 3 ))))
1 2 3 4 5 6 7 8 #! /bin/bash A=100 B=200 echo $((A - B, A * 2 , B - A * 5 )) MIN=$((A < B ? A : B)) echo MIN=$MIN
let
运算命令
1 2 3 4 5 6 7 8 #! /bin/bash A=1 B=2 let "A += A + 1" let "B <<= 2" let "C = (A + B) * 3 -2" echo $C
3. expr
表达式 1 2 3 4 5 6 7 8 9 10 11 #! /bin/bash A=2 B=3 echo `expr \( $A \* 3 \) '*' \( $B + 1 \)` C=`expr \( $A << 2 \) % $B` # 相当于 C=$(((A << 2 ) % B)) echo "C = $C "
4. 浮点运算的 bc 工具
bc 是 Linux 内置的计算器,支持浮点运算。在终端执行命令bc
,即可进入该计算器;输入quit
然后回车即可退出。对于浮点运算,其精度由名为scale
的变量控制,默认是 0。改变其值,即可改变小数位数。
在脚本中的使用
运算较简单时
1 2 3 4 5 6 #! /bin/bash readonly PI=3.14159R=2 S=`echo "scale=3; $PI * $R * $R " | bc` printf "S = %.3f\n" $S
运算较复杂时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #! /bin/bash A=14.5 B=5 C=32.4 D=`bc << EOF # 追加 EOF 表示一次运算的开始 scale = 4 a = $A / $B b = $C / $B a + b EOF ` echo $D
(五)控制流
常见的条件判断
判断字符串是否相等
判断整数的关系
运算符
含义
-lt
小于
-le
小于等于
-eq
相等
-gt
大于
-ge
大于等于
-ne
不等于
判断文件权限
运算符
含义
-r
有读权限
-w
有写权限
-x
有执行权限
判断文件类型
运算符
含义
-e
文件存在
-f
文件存在且为普通文件
-d
文件存在且为目录
一、条件判断语句if
格式 1
1 2 3 if [ condition ]; then fi
格式 2
1 2 3 4 5 if [ condition ]; then else fi
格式 3
1 2 3 4 5 6 7 if [ condition1 ]; then elif [ condition2 ]; then else fi
例 测试常见的条件判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #! /bin/bash if [ $# -ne 5 ]; then echo "usage: $0 num str1 str2 file1 file2" exit 1 fi if [ ]; then echo "no condition is true" else echo "no condition is false" fi if [ 80 -lt $1 -a $1 -le 100 ]; then echo "80 < \$1 <= 100" elif [ 60 -lt $1 ] && [ $1 -le 80 ]; then echo "60 < \$1 <= 80" else echo "\$1 <= 60" fi if [ $2 = $3 ]; then echo "$2 = $3 " else echo "$2 != $3 " fi if [ -x $4 ]; then echo "$4 is executable" else echo "$4 is not executable" fi if [ -e $5 ]; then echo "file $5 exists" else echo "file $5 does not exist" fi
二、条件分支语句case
格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 case $name in "val 1" ) ;; "val 2" ) ;; "val 3" ) ;; *) ;; esac
例 case
语句的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #! /bin/bash if [ $# -ne 1 ]; then echo "usage: $0 num" exit 1 fi case $1 in "1" ) echo "Can't get up to work..." ;; "4" ) echo "Crazy Thursday!!" ;; "5" ) echo "Finally comes Weekends!!" ;; *) echo "Nothing to say" ;; esac
三、循环语句for
格式 1
1 2 3 for item in list/array; do done
格式 2
1 2 3 for ((初始化循环变量; 循环条件; 修改循环变量)); do done
例 两类for
循环的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #! /bin/bash if [ $# -eq 0 ]; then echo "usage: $0 arg1 arg2 ..." exit 1 fi i=1 for e in $*; do echo "$i : $e " i=$((i + 1 )) done i=1 for e in $@ ; do echo "$i : $e " i=$((i + 1 )) done i=1 for e in "$*" ; do echo "$i : $e " i=$((i + 1 )) done i=1 for e in "$@ " ; do echo "$i : $e " i=$((i + 1 )) done SUM=0 for ((i=1 ; i <= 100 ; i++)); do SUM=$((SUM + i)) done echo "SUM = $SUM "
对于案例一,可以如下解释
1 2 3 for e in "arg1 arg2 arg3" "arg4" "arg5 arg6" "arg7" ; do echo $e done
对于默认情况下都是数组的$*
和$@
前者加上引号后即成为内含有空格的单个字符串,放在for
循环中相当于列表中只有一个元素
后者仍为一个有多个元素的数组
四、循环语句while
格式
1 2 3 while [ condition ]; do done
例 计算三位数的水仙花数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #! /bin/bash i=100 while [ $i -lt 1000 ]; do ii=$i i1=$((ii % 10 )) ((ii /= 10 )) i2=$((ii % 10 )) ((ii /= 10 )) sum =$((i1 ** 3 + i2 ** 3 + ii ** 3 )) if [ $sum -eq $i ]; then echo $i fi ((i++)) done
五、循环语句until
格式
1 2 3 until [ condition ]; do done
例 计算阶乘(不考虑大数)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #! /bin/bash if [ $# -ne 1 ]; then echo "usage: $0 num" exit 1 fi i=1 ANS=1 until [ $i -gt $1 ]; do ANS=$((ANS * i)) i=$((i + 1 )) done echo "ANS = $ANS "
break
和continue
这两条控制语句用法同 C。此外,可以在其后跟上一个数字 n,表示连续跳出 n 重循环或从 n 重之外的循环继续执行。