20天会学bash shell script(一)
什么是shell script?
shell script. 就是一系列的shell 命令组成的文本文件。该文件时可执行的。类似于MS-DOS 下的批处理文件。
为什么需要shell script?
1、shell script. 可以看做是我们自己定义的命令,强大,灵活。
2、可以节省任务操作的时间,让机器来完成琐碎的事。
3、自动化系统日常管理巡检任务,把减轻SA 的工作负担,提高工作效率。
书写执行shell script. 前的准备工作。
1、熟悉bash shell 的常用命令。
2、熟悉或者会使用一种文本编辑工具,vi,vim....。
3、在自己的home 目录下创建一个bin 目录用于对shell script. 进行集中存放。
4、把该目录添加进环境变量PATH。
[linux@zeng ~]$ mkdir bin #创建bin 目录。
[linux@zeng ~]$ vim .bash_profile# 把该目录写入登录文件中,以便每次登录的时候读取生效。
#往该文件中添加的内容。
PATH=$PATH:$HOME/bin
export PATH
[linux@zeng ~]$ source .bash_profile#使该文件在当前shell 环境中生效,而不需要logout再 login.
6、明确shell 环境中执行的命令的查找顺序。
1、在命令执行前会最先进行输入输出流的重定向。
2、使用绝对路径执行的命令,比如/bin/cat.
3、别名(alias)。
4、参数的扩展,命令的替换,算数表达式求值。
5、shell 函数。
6、内置(built in)命令.
7、hash tables.
8、PATH 变量中查找到的第一个命令。
9、查找失败,返回命令没有找到(command not found)
7、英语不会太烂。
第一个shell script。
我使用vim 编辑了一个名称是test01.sh 的文件。
[linux@zeng bin]$ cat test01.sh
#!/bin/bash
#
#My first shell script.
#
echo "Hello world!"
这里有几点需要说明。
1、使用.sh 作为shell script. 的后缀是一个好习惯。这样可以让你很容易知道文本的性质和内容。
2、第一行 #!/bin/bash 告诉shell 应该用什么程序来解释脚本命令。
3、# 用作注解解释器(在这里是bash)不会解释执行该行的内容。当程序比较庞大复杂的时候
添加注释是一种很好的实践,以便日后你能够看的懂自己写的脚本。或者方便同事维护你的
脚本。
4、echo "Hello world!" 是程序的主体。这条语句的功能的打印 Hello world!。
执行脚本。
直接使用bash sh 来执行shell script. 这样你可以不需要给脚本赋予可执行权限(x).
[linux@zeng bin]$ bash test01.sh
Hello world!
[linux@zeng bin]$ sh test01.sh
Hello world!
想像执行普通的命令一样执行脚本。应该赋予脚本相应的可执行权限x.
[linux@zeng bin]$ test01.sh
-bash: /home/linux/bin/test01.sh: Permission denied
赋予所有的用户(owner,group,other)可执行权限x。
[linux@zeng bin]$ chmod a+x test01.sh
[linux@zeng bin]$ test01.sh
Hello world!
上面执行shell script. 的时候都会新开一个子shell 在子shell 中执行,执行完毕后返回到父 shell。
所有对shell 环境的执行不会影响(带回到)父 shell.如果想让脚本在现行shell 中执行可以使用
.(dot)或者source.(我这个脚本不会影响shell 环境,所以无所谓在哪里执行。这里只是为了说明
shell script. 执行的方式的类型和区别。)
[linux@zeng bin]$ . test01.sh
Hello world!
[linux@zeng bin]$ source test01.sh
Hello world!
注:这也会刚才为什么我可以不logout 而让~/.bash_profile 生效的原因。
使用绝对路径执行shell script. ,明确的告知执行的路径。避免某些时候由于shell 命令查找执行
顺序引起的错误。
[linux@zeng ~]$ ~/bin/test01.sh
Hello world!
退出状态
怎么知道一个命令(shell script. )执行成功没有?可以通过查询shell 环境变量$?。
1、返回0 表示刚才的命令已经成功执行。
2、返回非0 表示刚才的命令没有执行成功。
[linux@zeng ~]$ echo $?
0
[linux@zeng ~]$ pw
-bash: pw: command not found
[linux@zeng ~]$ echo $?
127
我们可以再shell script. 中运用退出状态。用来验证shell script. 的执行情况。
[linux@zeng ~]$ cat ~/bin/test01.sh
#!/bin/bash
#
#My first shell script.
#
echo "Hello world!"
exit 0
[linux@zeng ~]$ test01.sh
Hello world!
[linux@zeng ~]$ echo $?
0
也可以自定义退出状态。
[linux@zeng ~]$ cat ~/bin/test01.sh
#!/bin/bash
#
#My first shell script.
#
echo "Hello world!"
exit 10
[linux@zeng ~]$ test01.sh
Hello world!
[linux@zeng ~]$ echo $?
10
shell 中的变量
为了处理数据或者信息,必须把他们先存储在RAM中。RAM被分割为很多小小的可寻址单元。
每一个单元通过一个唯一的内存地址来标识。这些内存单元用来存储程序需要处理的数据。可以
通过变量名来标识内存地址。在shell 中有两类变量。
1、系统变量,由linux 系统自身创建与维护。这类变量使用大写字母定义。
2、用户定义的变量(UDV),由用户创建于维护。这类变量使用小写字母定义。
需要掌握的重要的系统变量:
1、SHELL 使用的shell 类型。
[linux@zeng ~]$ echo $SHELL #使用echo 查看某个系统变量,记得要添加dolar 符号。
/bin/bash
2、HOME 用户登录时的主(home)目录。
[linux@zeng ~]$ printenv HOME #使用printenv 查看某个系统变量。
/home/linux
3、PATH shell 命令执行时查找的路径。
[linux@zeng ~]$ printenv PATH
/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/linux/bin
4、USER 当前会话登录的用户名。
[linux@zeng ~]$ printenv USER # 使用su 却换用户以后该值会变成新的用户的用户名。
linux
5、PS1 用户的提示符。
[linux@zeng ~]$ echo $PS1
[\u@\h \W]\$
注:不要顺便的修改系统变量,对系统变量的修改可能导致一些问题。前请先明确两点,
为了满足什么而修改?怎么修改(修改的对不对)?
变量的命令规则与用户变量的定义
变量必须以字母或者下划线开头,后面可以接字符或者数字,下划线。
用户变量定义的语法格式:
变量名=值
对应变量的命令与变量定义同时还要
注意一下几点:
1、在shell 中变量名
是区分大小写的。也就是说var 不等于VAR。
2、用户变量定义是“值右名左”,变量在右,值在左。
[linux@zeng ~]$ var=10
[linux@zeng ~]$ echo $var
10
[linux@zeng ~]$ 10=var
-bash: 10=var: command not found
3、给变量赋值的时候在等号的两边都是没有空格的,以下变量的定义因为空格的存在出现错误。
[linux@zeng ~]$ var =10
-bash: var: command not found
[linux@zeng ~]$ var= 10
-bash: 10: command not found
[linux@zeng ~]$ var = 10
-bash: var: command not found
4、如果定义变量的时候不给变量赋值,变量的值是null。
[linux@zeng ~]$ var=
[linux@zeng ~]$ echo $var
5、变量值的打印使用 echo $变量名,变量的访问使用 $变量名。
echo 与printf
echo 命令用来打印文本信息或者变量的值。语法格式:
echo [SHORT-OPTION]... [STRING]...
重要的选项:
-n 不换行。默认echo 是换行的。
-e使字符串中的特殊
(转义或者叫逃逸)
字符生效。常用转义字符有:
\a 警告铃声 \b 退一位 \c 不换行 \n 换行 \r 回行首 \t 水平Tab
\\ 表示反斜杠 \f 换页 \v 垂直Tab键 \0xxx 16进制表示的ASII字符
\xHH 8进制表示的ASII字符
[linux@zeng ~]$ echo -e "I love oracle database\nalso linux operating system."
I love oracle database
also linux operating system.
printf 比echo 更加的强大,主要的用途是依据给定的格式显示参数的内容。
常用的格式化字符串有:
%s 字符串 %c 字符 %d 整数 %f 浮点数 %q 将特殊字符用\转义 %b 让转义字符生效。
printf 默认是不换行的,语法格式:printf FORMAT [ARGUMENT]...
[linux@zeng ~]$ printf %b "I\tlove\tlinux.\n"
I love linux.
注:格式化参数通过也用双引号包起来。
[linux@zeng ~]$ printf "%b" "I\tlove\tlinux.\n"
I love linux.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26110315/viewspace-720317/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26110315/viewspace-720317/