微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

《bash 网络安全运维》 bash 入门

条件语句

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
}

需要注意的点:

  1. 除非在函数中使用 local 内建指令进行声明,否则变量的作用域是全局的。一个设置了变量 i 并且在循环中针对 i 值进行自动增长的 for 循环,可能会把代码中其他地方设置的 i 的值弄乱。
  2. 大括号是用来区分函数体范围的最常用的语法,但是任何 shell 的复合命令语法都是允许的。
  3. 在大括号中重定向输入/输出可以对函数内的所有语句执行此操作。
  4. 函数定义中没有声明任何参数。使用多少个以及什么样的参数是在函数调用时传递给它的。

bash 中的模式匹配

当我们需要在命令行中命名许多文件时,不需要键入每个文件名称。 bash 提供模式匹配,可以使用模式指定一组文件

  1. *:可以匹配任意数量的字符。
  2. ?:匹配单个字符。
  3. []:使用方括号中列出的任何字符进行匹配。
字符类 描述
[:alnum:] 字母数字
[:alpha:] 字母
[:ascii:] ASCII
[:blank:] 空格和制表符
[:ctrl:] 控制字符
[:dight:] 数字
[:graph:] 除了控制字符和空格之外的任意字符
[:lower:] 小写字母
[:print:] 除了控制字符之外的任何字符
[:punct:] 标点符号
[:space:] 包含换行符的空白字符
[:upper:] 大写字母
[:word:] 字母、数字和下划线
[:xdigit:] 十六进制

使用 shell 模式匹配时,需要注意几点:

  1. 模式不是正则表达式,不要混淆两者。
  2. 模式是与文件系统中的文件相匹配的;如果模式以路径名开头,则将对该目录中的文件进行匹配。
  3. 如果没有匹配上模式,shell 将会使用特殊模式匹配字符作为文件名的文字字符。也就是将会创建一个文件名包含特殊模式匹配字符的文件,当我们要删除这个文件时注意用 “\” 转义特殊模式匹配字符。
  4. 在引号内将不会进行模式匹配。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐