if else
和 Java、PHP 等语言不一样,sh 的流程控制不可为空
在 sh/bash 里可不能这么写,如果 else 分支没有语句执行,就不要写这个 else。
if-elif-else 语法格式:
if else 语句经常与 test 命令结合使用
for循环
顺序输出当前列表中的数字:
顺序输出字符串中的字符:
while语句
while 循环用于不断执行一系列命令,
也用于从输入文件中读取数据;可用于读取键盘信息。
命令通常为测试条件。
使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上
$
来表示变量。while 循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量 MAN,按
<Ctrl+D>
结束循环。
运行时候除非ctrl+d,不然会一直while下去。
Linux read命令用于从标准输入读取数值。read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。
let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。
echo -n 不换行输出
echo -e 处理特殊字符
若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
a 发出警告声;
删除前一个字符;
c 最后不加上换行符号;
f 换行但光标仍旧停留在原来的位置;
换行且光标移至行首;
光标移至行首,但不换行;
插入tab;
v 与f相同;
\ 表示插入""本身;
nn 插入nnn(八进制)所代表的ASCII字符;
无限循环
无限循环语法格式:
或者把while :改为
until 循环
case
Shell case 语句为多选择语句。可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
- 取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至
;;
。- 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号
*
捕获该值,再执行后面的命令。esac
case 的语法和 C family 语言差别很大,它需要一个 esac(就是 case 反过来)作为结束标记,每个 case 分支用右圆括号,用两个分号表示 break。
下面的脚本提示输入 1 到 4,与每一种模式进行匹配:
跳出循环
未达到循环结束条件时强制跳出循环,Shell 使用两个命令来实现该功能:
break
和continue
。break命令
break 命令允许跳出所有循环(终止执行后面的所有循环)。
continue命令
它不会跳出所有循环,仅仅跳出当前循环。当输入大于 5 的数字时,该例中的循环不会结束,语句
echo "haha"
永远不会被执行。
练习
echo '' 有换行的意思
d=$((i+2))必须要双括号,里面i+2上下文才正确。现在i+2结果是一个数值。
写一个脚本
(1) 提示用户输入一个字符串;
(2) 判断:
如果输入的是 quit,则退出脚本;
否则,则显示其输入的字符串内容;
三角输出
编写 bash 脚本输出如图的三角:
新建一个 test.sh,判断 8 4 5 三个数字的最大值
或者
seq: squeue 是一个序列的缩写,主要用来输出序列化的东西
seq常见命令参数
12345678910用法:
seq
[选项]... 尾数
或:
seq
[选项]... 首数 尾数
或:
seq
[选项]... 首数 增量 尾数
以指定增量从首数开始打印数字到尾数。
-f, --
format
=格式 使用
printf
样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用: )
-w, --equal-width 在列前添加0 使得宽度相同【自动补位】
--help 显示此帮助信息并退出
--version 显示版本信息并退出
新建 test.sh 求 100 以内所有偶数之和