Linux系统编程学习笔记(5)-基本shell脚本编程

什么是shell

shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令,通俗一点讲,我们平时在终端输入的各种命令,这就是shell程序,而某些时刻,一句一句的输入命令,执行命令过于繁琐,或者有时需要连续执行n多次同样的命令,这就可以吧很多天shell语句存放在一个文件中,类似于C语言,按照一定的逻辑或者次序依次执行shell命令,这样的文件就叫做脚本,逻辑就叫做shell脚本语言,这里只记录部分简单的用法。

shell的语法

在了解语法之前,首先应了解shell的执行方式,这里不做过多的介绍,在老版本的Unix与Linux中,sh作为shell命令的执行方式,近几年bash已经逐渐取代的sh,编写脚本时,脚本文件起始处必须要有以下代码:

#!/bin/bash

或者是

#!/bin/sh

没有这两条命令shell程序将无法执行。
同时注意,在编写完成shell脚本后,需要对脚本增加可执行权限才可以以”./”的形式执行脚本。

变量

shell脚本中,使用变量之前不需要对变量进行声明(与C语言有很大差距),在使用变量时自动声明,且默认情况下,所有变量都被看作字符串加以储存。若想读取变量值,要在变量前增加”$”。shell程序会在需要时吧数值型字符串转换为对应的数值以对它们进行操作。下面举一个简单的例子,编辑脚本文件test.sh:

#!/bin/bash

test=hello
echo test

chmod +x test.sh
程序将输出:

test

若将test.sh修改为如下:

#!/bin/bash

test=hello
echo test

程序将输出输出

hello

修改为下面时:

#!/bin/bash

test=5+7
echo $test

程序将输出:

5+7

另外,引号的使用在shell脚本中也有很大作用,在变量值中有空格时,字符串必须使用双引号括起, 表达式前使用”\”会起到与单引号同样的效果,例子如下:

#!/bin/bash

test="hello body"
echo $test
echo "$test"
echo '$test'
echo \$test
echo Enter some text
read test
echo '$test' now equals $test

结果为

hello body
hello body
$test
$test
Enter some text

此时会等待用户从终端输入,输入hai后结果为:

hello body
hello body
$test
$test
Enter some text
hai
$test now equals hai

read会等待用户输入,并将用户输入的值保存到read后面的变量当中。

访问参数变量

在shell脚本中,可以使用 1, 2分别显示参数,使用 @来显示所有的参数,例子如下:

#!/bin/bash

test="hello"

echo $test

echo "the progaram $0 is runnning"
echo "the first param is $1"
echo "the second param is $2"
echo "total param is $*"
exit 0

执行完成后结果如下

hello
the progaram ./test.sh is runnning
the first param is every
the second param is one
total param is every one

值得注意的时,在对变量进行赋值时,等号两边都不能加入空格。

条件

判断条件命令为test命令,他可以检查一个文件是否存在,两个字符串是否相等,两个表达式是否相等。最简单的检查一个检查一个文件是否存在的脚本程序如下:

if test -f 123.txt
then
...
fi

具体的判断方式如下:
判断字符串:

  • string1 = string2 两个字符串相同则结果为真
  • string1 != string2 两个字符串不同则结果为真
  • -n string 字符串不空则结果为真
  • -z string 如果字符串为空则结果为真

算数比较:

  • exp1 -eq exp2 如果两个表达式相等则结果为真
  • exp1 -ne exp2 如果两个表达式不等则为真
  • exp1 -gt exp2 如果1大于2则为真
  • exp1 -ge exp2 如果1大于等于2则为真
  • exp1 -lt exp2 如果1小于2则为真
  • exp1 -le exp2 如果1小于等于2则为真
  • !exp 如果表达式为假则结果为真,反之亦然

文件条件测试:

  • -d file 如果文件是一个目录则为真
  • -f file 如果文件时一个普通文件则结果为真
  • -g file 如果文件的set-group-id位被设置则结果为真
  • -r file 如果文件可读则结果为真
  • -s file 如果文件大小不为0则结果为真
  • -u file 如果文件的set-user-id位被设置则结果为真
  • -w file 如果文件可写则结果为真
  • -x file 如果文件可执行则结果为真

条件控制结构

如何使用上述判断语句呢,与其他基本语言类似,shell有一组自己的控制结构可以对各种条件进行使用与判断
1. if语句:

if condition
then
  statments
else
  statments
fi

或者是这样:

if condition
then
  statments
elif
  statments
else
  statments
fi

2.for语句

for viriable in values
do
  statements
done

例子:

for foo in bar fud 43
do
  echo $foo
done

3. while语句:

while condition do
  statements
done

4. until语句:

until condition
do
  statements
done

函数

首先从一个基本的例子了解函数的使用方法

#!/bin/sh
foo(){
  local sample="local variable"
  echo "Fun foo is executing"
  echo $sample_test
  return 0
}

foo

foo_return="$(foo)"
echo $foo_return

if foo 
then
  echo "false"
else
  echo "true"
fi
exit 0

其中,foo_return=”$(foo)”可以抓取函数foo中echo的值,并且函数通过return返回值。
local用于在函数内申请局部变量,局部变量在函数退出时失效。

常用shell命令

  • break 用于跳出for,while,until循环
  • : 空命令,用于简化条件逻辑,相当于true,while : 相当于实现了一个无限循环
  • contine 用于跳出此循环执行下一次循环
  • eval 对参数进行求值
  • export 将作为它参数的变量导出到子shell中,并使之在子shell中有效。
  • printf 在终端打印信息
  • set 为shell设置参数变量,将输出结果分离
  • expr expr命令将它的参数当做一个表达式来求值。常见用法是执行简单的数学运算。类似于$((…))

eval命令的例子

#!/bin/sh
foo=10
x=foo
eval y=$foo
echo $y
exit 0

printf 变量的例子(与C语言类似)

printf "%s\n" hello

set变量的例子:

echo the data is $(date)
set $(date)
echo The month is $2
exit 0

expr命令

x=$(expr $x + 1)

$((…))扩展

x=0
while test "$x" -ne 10
do
 echo $x
 x=$(($x+1))
done
exit 0

猜你喜欢

转载自blog.csdn.net/qq_34561506/article/details/78620200