条件语句
bash 使用 0 表示真,使用非 0 表示假,它的意义在于程序的返回值是错误代码,能够解释程序为什么失败。当返回 0 时说明运行成功,当返回其他非 0 值时对应着不同的错误原因。
if 语句简单的形式如下:
if cmd
then
some cmds
else
other cmds
fi
使用 if 命令更改目录为 /tmp 的简单例子:
if cd/tmp
then
echo "here is what is in /tmp:"
ls -l
fi
if 的判断式也可以使用管道形式:
if ls | grep pdf
then
echo "found one or more pdf files here"
else
echo "no pdf files found"
对于管道命令来说,管道最后一个命令的成功与失败决定了是否采用 “true” 分支。
比较
比较时使用的一种更典型的 if 形式时使用复合命令[[或 shell 内建指令 [或 test 命令。
文件测试符
文件测试符 | 使用说明 |
---|---|
-d | 测试目录是否存在 |
-e | 测试文件是否存在 |
-r | 测试文件是否存在且可读 |
-w | 测试一个文件是否存在并且可写 |
-x | 测试各异文件是否存在并可执行 |
if [[ -e $FILENAME ]]
then
echo $FILENAME exists
fi
数值测试符
数值测试操作符 | 使用说明 |
---|---|
-eq | 检验数之间是否相等 |
-gt | 测试一个数字是否大于另一个 |
-lt | 测试一个数字是否小于另一个 |
如检验变量 $VAL 是否小于变量 $MIN:
if [[ $VAL -lt $MIN ]]
then
echo "value is too small"
fi
双圆括号
双圆括号中会假定所有的变量都是数值的,不需要使用 $ 运算符来检索值。如:
if (( VAL < 12 ))
then
echo "value $VAL is too small"
fi
循环语句
while 循环语句类似于 if ,它的判别式也可以使用单一命令或者管道来表示。
while 循环的简单写法如下:
i = 0
while (( i < 1000 ))
do
echo $i
let i++
done
当然判断式也可以是管道:
while ls | grep -q pdf
do
echo -n 'there is a file with pdf in its name here: '
pwd
cd ..
done
使用双圆括号可以实现简单的数值循环
for ((i=0; i < 100; i++))
do
echo $i
done
参数传递
for VAL in 20 3 dog peach 7 vanilla
do
echo $VAL
done
程序会把 “20”、“3”、“dog”、“peach”、“7”、“vanilla” 依次打印到屏幕上。当然 for 中的列表值也可用位置参数 $1、$2、$3 传递。
for 循环中使用的值也可以通过调用其他程序或使用其他 shell 特性生成:
for VAL in $(ls | grep pdf) {0..5}
do
echo $VAL
done
变量 VAL 将依次接收 ls 通过管道传输到 grep 的每个文件的值,该文件的文件名包含 pdf,然后接收从 0 到 5 的每个数字。
大括号
大括号可以用来生成数字序列,用法为:
{first..last..step}
语法与 python 的切片类似。
函数
bash 中函数可以这样定义:
function myfun ()
{
# body of the function goes here
}
需要注意的点:
- 除非在函数中使用 local 内建指令进行声明,否则变量的作用域是全局的。一个设置了变量 i 并且在循环中针对 i 值进行自动增长的 for 循环,可能会把代码中其他地方设置的 i 的值弄乱。
- 大括号是用来区分函数体范围的最常用的语法,但是任何 shell 的复合命令语法都是允许的。
- 在大括号中重定向输入/输出可以对函数内的所有语句执行此操作。
- 函数定义中没有声明任何参数。使用多少个以及什么样的参数是在函数调用时传递给它的。
bash 中的模式匹配
当我们需要在命令行中命名许多文件时,不需要键入每个文件的名称。 bash 提供模式匹配,可以使用模式指定一组文件。
- *:可以匹配任意数量的字符。
- ?:匹配单个字符。
- []:使用方括号中列出的任何字符进行匹配。
字符类 | 描述 |
---|---|
[:alnum:] | 字母数字 |
[:alpha:] | 字母 |
[:ascii:] | ASCII |
[:blank:] | 空格和制表符 |
[:ctrl:] | 控制字符 |
[:dight:] | 数字 |
[:graph:] | 除了控制字符和空格之外的任意字符 |
[:lower:] | 小写字母 |
[:print:] | 除了控制字符之外的任何字符 |
[:punct:] | 标点符号 |
[:space:] | 包含换行符的空白字符 |
[:upper:] | 大写字母 |
[:word:] | 字母、数字和下划线 |
[:xdigit:] | 十六进制 |
使用 shell 模式匹配时,需要注意几点:
- 模式不是正则表达式,不要混淆两者。
- 模式是与文件系统中的文件相匹配的;如果模式以路径名开头,则将对该目录中的文件进行匹配。
- 如果没有匹配上模式,shell 将会使用特殊模式匹配字符作为文件名的文字字符。也就是将会创建一个文件名包含特殊模式匹配字符的文件,当我们要删除这个文件时注意用 “\” 转义特殊模式匹配字符。
- 在引号内将不会进行模式匹配。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。