时间:2018-06-13
姓名:魏文应
一、shell 的基本格式要求
-
文件命名:为了容易辨认,我们一般以
.sh
作为文件后缀,比如:test.sh。 -
指定shell:shell解释器有很多种,其中有一种叫bash,写脚本时,要在开头的地方告诉脚本,使用哪个shell解释器,比如:
#! /bin/bash
(必须在脚本的最前面,#! 加上 shell 的绝对路径,不写的话会使用系统默认的shell)。
二、shell的执行方式
这里我有一个测试脚本
#!/bin/bash
#author : panda
# change-date:2016-11-05
# --------------------------------------------
########脚本测试开始##############
echo "What is your name?"
read person
echo "Hello, $person"
sleep 2
date
sleep 2
a="game over"
echo "$person,$a"
##########脚本测试结束###########
假设我这个脚本文件名叫 test.sh,可以使用下面几种方式中的一种,来执行这个test.sh脚本:
- 使用bash解释器:
bash test.sh
。 - 使用sh解释器:
sh test.sh
。 - 赋予可执行权限(chmod u+x test.sh):
./tesh.sh
。 - 使用source命令(source是在当前bash环境下,读取并执行FileName中的命令):
source test.sh
。
三、shell 脚本中的变量
-
变量的赋值:
A=hellow
(等号之间不能有空格)。 -
将命令赋值给变量:
A=`date`
(这时TEST相当于命令date)。 -
打印变量内容:
echo $A
。 -
将命令赋值给变量:
A=$(ls -l)
(echo $A 相当于 ls -l)。 -
变量传递:
# 这时相当于B=hellow A=hellow B=$A
-
利用变量和字符串,组成新的字符串:
MYDIR=/home/wwy echo ${MYDIR}/test
-
给变量赋值多个单词,需要用引号 :
A="hellow world" # 或者用单引号 A='hellow world' name=world # 特殊符号含义保留,下面这句打印结果为:hellow world A="hellow $name" # 单引号就是明面上的意思,下面这句打印结果为:hellow $name A='hellow $name'
四、设置永久变量
如果在 /usr/local/test/ 下,有一个可执行文件 test.sh,你想像系统中正常的命令(比如ls、man、cd等)一样使用 test.sh,则在用户的home目录下,打开 vim .bashrc
,在后面加入下面语句:
export PATH=/usr/local/test:$PATH
这句话的意思是,将 /usr/local/test 这个目录加入用户环境变量中。这样,/usr/local/test 这个目录下的可执行文件,就可以像正常命令一样使用了。
五、位置变量
shell中,有一种叫位置变量。比如test.sh这个脚本,有下面代码:
#!/bin/bash
# $author:wwy
echo "---------------------"
echo "Shell :";
echo "$0";
echo "$1";
echo "$2";
echo "$1";
echo "$3";
比如,我们使用shell执行 sh test.sh 7 8 9
,那么,sh 解释器就认为, test.sh 就是 $0,7就是 $1,8就是 $2,9就是 $3。这就是在命令行外面,传参给脚本。如果是大于9,需要用中括号扩起来 [ ]
,比如 $[10]
、$[11]
、$[12]
等。
六、特殊变量
符号 | 参数 |
---|---|
$* | 以一个单字符串,显示向脚本传递的所有参数 |
$# | 传递到脚本的参数个数 |
$@ | 与 $* 相同,但是使用时加引号,并在引号中返回每个参数,如 "$@" 用「"」 括起来的情况、以 "$1" "$2" … "$n" 的形式输出所有参数 |
$$ | 这个程序的PID |
$? | 显示最后命令的退出状态;0表示没有错误,其他任何值表明有错误 |
$! | 上一个后台进程的ID |
下面是测试代码:
#!/bin/bash
echo "======================================="
echo '用 $+数字 代表相应的参数:'
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
echo "======================================="
echo
echo "======================================="
echo '用 $0 表示sh的第0个参数,也就是脚本名:'
echo $0
echo "======================================="
echo
echo "======================================="
echo '用 $* 列出所有参数:'
echo $*
echo "======================================="
echo
echo "======================================="
echo '用 $# 统计参数个数: '
echo $#
echo "======================================="
echo
echo "======================================="
echo '用 $@ 列出所有参数(和$*)'
echo "$@"
echo "======================================="
echo
echo "======================================="
echo '用 $? 表示最后一个命令退出时的状态(0表示没有错误):'
echo "$?"
echo "======================================="
echo
echo "======================================="
echo '用 $$ 表示当前进程的PID:'
echo "$$"
echo "======================================="
echo
echo "======================================="
echo '用 $! 表示上一个后台进程ID:'
echo "$!"
echo "======================================="
七、运算符
运算符 意义
++ -- 递增及递减,可前置也可以后置
+ - ! ~ 一元运算的正负号 逻辑与取反
+ — * / % 加减乘除与余数
< <= > >= 比较大小符号
== != 相等 不相等
>> << 向左位移 向右位移
& ^ | 位的与 位的异或 位的或
&& || 逻辑与 逻辑或
? : 条件判断
++a
和 a++
:比如:
# ++a 是自加,后赋值
# 比如下面这个,a先自加1,再把自加后的a赋值给echo。
# 这时 echo 看到a的值为a=2
a=1
echo $((++a))
# a++是先赋值,后自加
# 比如下面这个,a先把值赋值给echo,这时echo看到a的值为a=1
# 然后a再自加1变成a=2
a=1
echo $((a++))
八、read命令
read
: 从键盘读入数据。比如 read a b c
,然后你在键盘输入三个参数,这三个参数分别赋值给a,b,c。
read还可以带参数:
参数 | 说明 | 举例 |
---|---|---|
-s | 隐藏输入字符,比如输入密码时效果 | read –s passwd |
-t | 设置输入时间,超时自动退出 | read –t 2 test |
-r | 允许输入包含反斜杠 | read –r line |
-n | 限制输入长度 | read –n 2 test |
-p | 打印一些信息 | read -p "请输入你的准考证号: " ID |
九、expr命令
expr是整数运算命令,返回整数运算结果:
返回相加结果:expr 3 + 5
, 结果为7。
没有空格的情况下,返回过程: expr 3+5
,结果为 3+5。
乘号需要转义字符:expr 3 \* 5
。
计算字符串长度:expr length "hellow world"
。
结果作为输入: expr `expr 5 + 11` / 2
。
网友评论