什么是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脚本中,可以使用
#!/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