1. 前言
前面我们学习了Linux相关的命令,接下来我们将进入真正的主题——shell脚步编程。
2. 直接执行命令
首先创建一个shell文件并用Vim编辑器打开
vim 01.sh
这时候已经进入命令模式,键盘点击i进入编辑模式,我们简单的输出当前时间和当前用户:
#!/bin/bash
date
who
第一行表示这是Shell中的bash,即Bourne Again Shell,Shell中的一种。我们按Esc退出编辑模式进入命令模式,再按shift + z z退出命令模式,这时候没有执行的权限,我们需要授予其执行的权限
chmod u+x 01.sh
最后命令行输入
./01.sh
执行后的结果为:
Thu Dec 21 18:07:25 CST 2017
root pts/0 2017-12-21 16:27 (111.196.87.96)
3. 创建变量
#!/bin/bash
n=10
s="I Love You"
echo $n
echo $s
这里的n和s都是变量,echo是输出命令,但是可以引号内部有空格,如果s=I Love You
就会出错,因为中间有空格。此例输出结果为:
10
I Love You
还可以这样进行拼接
echo "$s very much"
输出结果为:
I Love You very much
这时候,有人就要问了,那我要怎样输出s,就可以这样:
echo "\$s"
4. 将命令的结果作为变量的值
curTime=`date`
echo $curTime
其中**是键盘左上方波浪线下面的字符,**
是键盘左上方波浪线下面的字符,``表示内部是命令,此例是将date命令的结果作为变量curTime的值了,输出结果为:
Thu Dec 21 19:44:51 CST 2017
除了这种做法,还可以:
curTime=$(date)
echo $curTime
输出结果是完全一样的。
5. 输出重定向
将ls -la命令生成的结果输出到text文件中
ls -la > text
输入重定向
wc < text
将text文本中的内容输入,wc命令是输出文本的行数、单词数、字节数。
6. 数学运算
1. 基本整数运算
a=10
b=40
c=$(expr $b / $a)
echo "c=$c"
输出结果为:
c=4
其中expr命令表示此处是数学运算,expr只能进行整数运算。此处的还可以这样表示:
d=$[$b / $a]
结果是一样的。
2. 浮点数运算
由于expr只支持整数运算,对于浮点数运算,我们需要用到bc命令
e=$(echo "scale=4; $a / $b" | bc)
echo "e=$e"
这里bc是bc命令,scale是自带的内建变量,表示精确到小数点后几位,|是管道的意思,前面命令的输出结果作为后面命令的输入,此处命令行输出结果为:.2500
7. 内联输入重定向
f=$(bc << EOF
scale=4
temp=($a * $b)
temp / 4
EOF
)
echo "f=$f"
输出结果为:100.0000
8. 命令执行退出的状态
0 成功
127 没有找到命令
1 未知错误
126 命令不可执行
查看上一次命令的执行状态
echo $?
在shell脚步中,自己指定退出的状态
exit 状态码
只有if命令的退出状态码为0,才会执行then部分
if 命令
then
命令
fi
举个例子:
#!/bin/bash
testuser=zhangpan
if grep $testuser /usr
then
echo "ok"
ls -a /usr/$testuser/
elif ls -d /usr/$testuser/
then
echo "主目录存在"
else
echo "$testuser not exist"
fi
9. test数值比较
test命令的复杂写法:
#!/bin/bash
#test命令,如果条件成立,test命令以状态为0退出,if条件成立
if test $var
then
echo "test条件成立"
else
echo "test条件不成立"
fi
test命令的简单写法:
#!/bin/bash
a=10
b=5
#test命令的简单写法[]
if [ $a -gt $b ]
then
echo "$a more than $b"
else
echo "$a smaller than $b"
fi
10. test字符串比较
11.test文件比较
#!/bin/bash
mydir=/usr/zhangpan
#-d检查目录是否存在
if [ -d $mydir ]
then
echo "$mydir exist"
ls $mydir
else
echo "$mydir not exist"
fi
[ -d mydir :将/usr/zhangpan目录中的文件全部展示到控制台,当然也可以先转到目录下,再展示:
cd $mydir
ls
其他的有关命令:
-d filename:如果filename为目录,则为真
-e filename:如果filename存在,则为真
-f filename:如果filename为常规文件,则为真
-r filename:如果filename可读,则为真
-w filename:如果filename可写,则为真
-x filename:如果filename可执行,则为真
12.多个条件
多个条件并列:
[] && []
例如:
#!/bin/bash
#多个条件
mydir=/usr/zhangpan
if [ -d $HOME ] && [ -w $mydir ]
then
cd $mydir
touch text.c
else
echo "no such file"
fi
13.任意数学表达式或赋值
任意数学表达式或赋值用双小括号
((数学表达式或赋值语句))
case命令
#!/bin/bash
testusr=zhangpan
case $testusr in
jack)
echo "$testusr is exist";;
zhangpan)
echo "$testusr is exist";;
*)
echo "no usr is exist";;
esac
这个命令相信不用我做过多的介绍,大家就能明白其中的含义。
case命令的基本模式如下:
case var in
pattern1) 命令1;;
pattern2) 命令2;;
*) 默认命令;;
esac
for循环
#!/bin/bash
for item in Teacher Student Master
do
echo $item
done
for命令的基本模式如下:
for var in list
do
命令
done
如果集合中的元素有单引号或者双引号,可用转义符号进行转换,如双引号转义:
for item in Teacher\"s Student Master
集合可用list变量表示:
#!/bin/bash
list="Teacher Student Master"
for item in $list
do
echo $item
done
上面集合的分隔符是空格,如果是逗号的话,需要用IFS字段分隔符:
#!/bin/bash
list="Teacher,Student,Master"
IFS=$,
for item in $list
do
echo $item
done
while循环
#!/bin/bash
a=10
while [ $a -gt 5 ]
do
echo "$a"
a=$[ $a - 1 ]
done
循环打印出10大于5的数,while循环的基本模式如下:
while test command
do
命令
done