shell的结构分为三大类:顺序结构、分支结构和循环结构

1. if语句

语法格式:

if
<语句序列A>
then
<语句序列B>
fi

如果语句序列A中的最后一个命令的返回值为0,则执行语句序列B中的命令,然后继续执行fi以后的命令;如果语句序列A中的最后一个命令的返回值为非0,则跳转到fi并且继续执行fi以后的命令,注意,在这里A执行结果为0认为是真

if
  test –f funfilethen
  echo funfile exists
fi
if [ -f funfile ]; then  
    echo funfile exists
    echo hello
fi

2. if-else语句

语法格式:

if
语句序列A
then
语句序列B
else
语句序列C
fi

如果语句序列A中的最后一个命令的返回值为0,则执行语句序列B中的命令,然后继续执行fi以后的命令;如果语句序列A中的最后一个命令的返回值为非0,则执行语句序列C中的命令,然后继续执行fi以后的命令。

任何命令的返回值都可以作为判断条件,也可以嵌套if语句,但必须保证if 和 fi配对。

if [ “$X” –lt 10 ]; then
  echo X is less than 10
else
  if [ “$X” –gt 10 ]; then
    echo X is greater than 10
  else
    echo X is equal to 10
  fi
fi

也可以使用一种简写形式:elif来代替一个else if 嵌套。

3. case结构

语法结构:

case 单词 in
模式A)
语句序列A
;;
模式B)
语句序列B
;;

esac

分支选择是顺序地对单词和所提供的模式进行比较,如果一致,就执行后面的语句序列,然后跳转到esac,并执行后续的语句。典型情况下,单词是一个变量,而模式可以使用?, *等通配符。

case “$1” in
  start)
    start
    ;;
  stop)
    stop
    ;;
  *)
    echo “usage: $0 {start|stop}”
    ;;
esac

4. while语句

语法格式:

while
语句序列A
do
语句序列B
done

语句功能:依次执行语句序列A中的命令,如果语句序列A最后一个命令的返回值为0,则执行语句序列B,回到步骤1,重复上面的过程,直到语句序列A中的最后一个命令的返回值为非0。

x=1
while ((x <= 10))
do
  echo x is $x
  let x=x+1
done

这里解释一下let命令,let在shell中执行算数运算。命名的参数可以在算术表达式中直接利用名称访问,不要前面带有“$”符号。当访问命名参数时,就作为算术表达式计算它的值。算术表达式按长整数进行求值,并且不检查溢出。当然,用0作除数就产生错误。let的替代表示形式是:((算数表达式))

5. until语句

语法结构:

until
语句序列A
do
语句序列B
done

until语句和while语句只有在测试条件上是相反的,其他的都一样。

6. for语句
语法结构

for var in list
do
语句序列A
done

1.如果list中还包含有token,则转到步骤2,否则结束;2.var被设置为list中的下一个token;3.语句序列A中的命令被执行;4.返回步骤1

注意:这里var的更新是每次循环后都替换为list中的下一个变量,不同于C语言中的循环计数

echo file list:
for i in *; do
  echo $i
done

7. continue和break语句

如果在循环体中使用continue则跳出本次循环,进入下一次循环;使用break则跳出整个循环。

8. shell函数

函数是脚本内的脚本,使用函数比起使用一个新的脚本可以大大加快调用速度。

有两种函数格式:

(1)function 函数名
        {
            …
        }

(2)函数名()
        {
            …
        }

调用函数就像调用一个shell脚本或者命令一样,直接在写函数名字,如果需要,还可以跟参数。shell查找命令的顺序是:别名,关键字,函数,内部命令,脚本和可执行程序,所以函数可能屏蔽外部脚本或者程序。

可以给函数传递参数,在函数中处理和在普通脚本中处理参数基本一样,使用$1等位置参数,或者$*,$#等,但¡在函数中的$0并不表示函数名,而仍然是脚本的文件名。

start()
{
  echo “第一个参数:$1”
  echo “$0: $*”
}

调用

start a b c

如果不作特殊说明,在函数内访问的变量是整个脚本共享的变量,如果要定义只在函数内有效的局部变量,则需要使用local语句。

版权声明:本文为kadinzhu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/kadinzhu/archive/2011/04/06/2061173.html