shell编程基础

313 阅读1分钟

基本语法

解释器

#!/bin/bash
#!/bin/sh
#!/usr/bin/env bash

变量

定义变量

定义变量时,变量名不加美元符号,规则如下

  • 命名只能使用英文字母,数字和下划线,首字母不能以数字开头
  • 中间不能有空格,可以使用下划线
  • 不能使用标点符号
  • 不能使用bash的关键字

使用变量时只要在变量名前家美元符号即可

使用readonly命令可以将变量定义为只读

使用unset命令可以删除变量

#!/bin/sh

VERSION=1.0.1
readonly VERSION
echo "hello world $VERSION"
unset VERSION

字符串

单引号

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量时无效的
  • 单引号字符串中不能出现单引号

双引号

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

数组

在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

array_name=(value0 value1 value2 ...)
或者
array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

读取数组

#获取某项
${array_name[n]}

#获取数组总所有元素
echo ${array_name[@]} 

获取数组的长度

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

shell流程控制

和Java、PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法):

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // 不做任何事情
}

在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个else。

if else

condition 和方括号([ ])之间必须有空格,否则会有语法错误。

if [ condition1 ]
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

以下实例判断两个变量是否相等:

a=10
b=20
if [ $a == $b ] #  或者 if test a -eq b
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi


输出结果:a 小于 b

shell中的test命令用于检查条件是否成立,它可以进行数值、字符、文件三方面的测试

数值测试

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

字符串测试

参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串长度伪则为真
-n 字符串 字符串长度不伪则为真

文件测试

参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真

for循环

in列表可以包含替换、字符串和文件名。

in列表是可选的,如果不用它,for循环使用命令行的位置参数。

for i in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

while 语句

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

while(( condition ))
do
    command
done

until 循环

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

until 语法格式:

until condition
do
    command
done

condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

结果:
0
1
2
3
4
5
6
7
8
9

case

Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

跳出循环

break命令允许跳出所有循环(终止执行后面的所有循环)。

continue它不会跳出所有循环,仅仅跳出当前循环。