标签:shell脚本入门
shell是一个命令解释器,它的操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种二样的操作系统的输出结果,输出屏幕返回给用户
对话的方式可以是:
交互式方式:从键盘输入命令,通过/bin/bash 解析,可以立即得到shell的回应
非交互式方式:脚本
shell是英文是贝壳的意思,命令解释器shell像一个贝壳一样包住系统核心
shell执行的命令分为两种方式:
内置命令:如讲过的cd . pwd exit 和echo 等命令,当用户登录系统后,shell以及内置命令就被系统载入到内存,并且一直运行着。
一般命令:如ls,磁盘上的程序文件à调入内存à执行命令
当linux命令或语句不在命令行下执行(严格说,命令行也是shell),而是通过一个程序文件执行时,改程序就被称为Shell脚本或shell程序
用户可以在shell脚本中敲入一系列的命令及命令语句组合。这些命令,变量和流程控制语句等有机的结合起来久形成一个功能强大的shell脚本
我们需要先想明白几个问题:
1) 日志文件在哪?
/var/log/messages
2) 用什么命令可以清空文件?
> 重定向
3) 写一个简单的shell脚本。
#!/bin/bash
cd /var/log/
>messages
4) 怎样执行脚本?[root@kaile ~]# sh /server/scripts/clear.sh
5) 有没有考虑到:
· 有没有脚本放在统一的目录
/server/scripts目录下
· 权限:用哪个用户执行文件
需要对用户做判断
· 清空错文件怎么办,该如何办?
· 错误提示:有没有成功知不知道?
· 脚本的通用性
[root@kaile ~]# mkdir -p /server/scripts #要有规范的存放脚本目录
[root@kaile ~]# vim /server/scripts/clear.sh
[root@kaile ~]# cd /server/scripts/
[root@kailescripts]# cat /server/scripts/clear.sh
#!/bin/bash #指定解释器
LOG_DIR=/var/log #设置变量
if [ "$UID" == "0" ];then UID等于然后执行下面的命令
cd $LOG_DIR
>message
echo "Logclear yes"
fi
~
清空日志的三种方法:
echo >test.log
>test.log
cat /dev/null>test.log
#清空内容,保留文件
· Shell就是命令解释器。==>翻译官
· Shell脚本==>命令放在脚本里
Shell脚本擅长处理纯文本类型的数据,而Linux中几乎所有的配置文件,日志文件等都是纯文本类型文件。
推荐使用vim编辑器编辑脚本,可以事先做个别名。
[root@kailescripts]# echo "aliasvi=vim">>/etc/profile
[root@kailescripts]# source /etc/profile
规范的Shell脚本第一行会指出由哪个程序(解释器)来执行脚本中的内容。在linux bash编程中一般为:
#!/bin/bash
或
#!/bin/sh
其中开头的“#!”又称为幻数,在执行Shell脚本的时候,内核会根据“#!”后的解释器来确定哪个程序解释脚本中的内容。注意:这一行必须在每个脚本顶端的第一行,如果不是第一行则为脚本注释行。
[root@kaile scripts]
# ll /bin/sh
lrwxrwxrwx.
1 rootroot
4 Dec
2320:
25 /bin/sh -> bash
#sh是bash的软链接,推荐标准写法#!/bin/bash
可以看一下系统自带的脚本的写法
head -1 /etc/init.d/*
[root@kailescripts]# bash --version
GNU bash,version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 FreeSoftware Foundation, Inc.
License GPLv3+:GNU GPL version3or later <http://gnu.org/licenses/gpl.html>
This is freesoftware; you are free to changeand redistribute it.
There isNOWARRANTY, to the extent permitted by law.
如果是比较老的系统,需要注意shell的版本太低,有漏洞,需要升级shell
[root@kailescripts]# yum -y update bash
#验证方法
[root@kailescripts]# env x=‘(){ :;};echo be careful‘ bash -c"echo this is a test"
thisis a test
如果返回2行
be careful
thisis a test
这样的结果的话,请尽快升级
#!/bin/sh
#!/bin/bash
#!/usr/bin/awk
#!/bin/sed
#!/usr/bin/tcl
#!/usr/bin/expect
#!/usr/bin/perl
#!/usr/bin/env python
如果脚本开头不指定解释器,就要用对应的解释器执行脚本。例如bashtest.sh和python.test.py
要求:养成一个好习惯,开头加上相应的解释器标识。
在Shell脚本中,跟在#后面的内容表示注释。注释部分不会被执行,仅给人看。注释可以自成一行,也可以跟在命令后面,与命令同行。要养成写注释的习惯,方便自己与他人。
最好不用中文注释,因为在不同字符集的系统会出现乱码。
1)bash scripts-name或sh script-name(推荐使用)
这种方法是当脚本本身没有可执行权限时常使用的方法。
2)path/script-name 或./scripts-name(全路径或当前路径执行脚本)
这种方法首先需要给脚本文件可执行权限。
3)sourcescripts-name或.scripts-name #注意“.”点号,且点号后有空格。
source 或.在执行这个脚本的同时,可以将脚本中的函数和变量加载到当前Shell。不会产生子shell。又有点像nginx的include功能。
1)开头指定脚本解释器
2)开头加版本版权等信息,可配置~/.vimrc文件自动添加
3)脚本不要用中文注释,尽量用英文注释
4)脚本以.sh为扩展名
5)放在统一的目录
6)代码书写优秀习惯
a,成对的内容一次性写出来,防止遗漏,如[],‘‘,""等
b,[]两端要有空格,先输入[]退格,输入2个空格,再退格写。
c,
流程控制语句一次书写完,再添加内容。
if条件
then
内容
fi
d,通过缩进让代码易读
f,脚本中的引号都是英文状态下的引号,其他字符也是英文状态。
好的习惯可以让我们避免很多不必要的麻烦,提高工作效率。
变量就是用一个固定的字符串(也可能是字符数字等的组合),替代更多更复杂的内容,这个内容里可能还会包含变量和路径,字符串等其他内容。变量的定义是存在内存中。
x=1
y=2
x变量 一个=赋值 ==相等
定义变量三种方法
自定义变量
read 变量
参数变量
变量分为两类:
1)环境变量(也可称为全局变量);可以在创建他们的Shell及派生出来的子shell中使用。环境变量又可以分为自定义环境变量和bash内置的环境变量。
2)局部变量(普通变量):只能在创建他们的shell函数或shell脚本中使用,还记得前面的$user我们创建的一般都是普通变量。
· 环境变量用于定义Shell的运行环境,保证Shell命令的正确执行,Shell通过环境变量来确定登录用户名,命令路径,终端类型,登录目录等,所有的环境变量都是全局变量,可用于所有子进程中,包括编辑器,shell脚本和各类应用。但crond计划任务除外,还需要重新定义环境变量。
· 环境变量可以在命令行中设置,但用户退出时这些变量值也会丢失,因此最好在用户家目录下的.bash_profile文件中或全局配置/etc/bashrc,/etc/profile文件或者/etc/profile.d/目录中定义。将环境变量放入profile文件中,每次用户登录时这些变量值都将被初始化。
· 通常,所有环境变量均为大写。环境变量应用于用户进程前,都应该用export命令导出。例如:exportclear=1
· 有一些环境变量,比如HOME,PATH,SHELL,UID,USER等,在用户登录之前就已经被/bin/login程序设置好了。通常环境变量定义并保存在用户家目录下的.bash_profile或/etc/profile文件中。
3.3.1
#显示环境变量[root@kailescripts]# echo $HOME
/root
[root@kailescripts]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@kailescripts]# echo $SHELL
/bin/bash
[root@kailescripts]# echo $UID
0
[root@kailescripts]# echo $USER
root
[root@kailescripts]# env #查看系统环境变量
HOSTNAME=kaile
SELINUX_ROLE_REQUESTED=
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=500
SSH_CLIENT=192.168.197.149592 22
SELINUX_USE_CURRENT_RANGE=
OLDPWD=/root
SSH_TTY=/dev/pts/1
LC_ALL=C
USER=root
#中间省略部分内容....
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/server/scripts
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
CVS_RSH=ssh
SSH_CONNECTION=192.168.197.149592 192.168.197.133 22
LESSOPEN=||/usr/bin/lesspipe.sh%s
G_BROKEN_FILENAMES=1
_=/bin/env
3.3.3
#当前终端变量[root@kailescripts]# echo $PS1
[\u@\h \W]\$
定义局部变量
局部变量在用户当前的shell生存期的脚本中使用。例如,局部变量clear取值为clear098,这个值只在用户当前shell生存期中有意义。如果在shell中启动另一个进程或退出,局部变量clear值将无效。
普通字符串变量定义
变量名=value
变量名=‘value’
变量名=“value”
shell中变量名及变量内容的要求
· 一般是字母,数字,下划线组成,且以字母开头。如clear,kaile23,clear-training。变量的内容,可以使用单引号或双引号印起来,或不加引号。
· 虽然变量可以以下划线开头,但类似这种变量都是比较特殊的,都是系统自己用的。我们尽量少用。
[root@kaile scripts]# _123=eeee
[root@kaile scripts]# echo $_123
eeee
普通字符串变量定义测试
[root@kaile scripts]# a=192.168.1.2
[root@kaile scripts]# b=‘192.168.1.2‘
[root@kaile scripts]# c="192.168.1.2"
[root@kaile scripts]# echo "a=$a"
a=192.168.1.2
[root@kaile scripts]# echo "b=$b"
b=192.168.1.2
[root@kaile scripts]# echo "c=${c}"
c=192.168.1.2
[root@kaile scripts]# a=192.168.1.2-$a
[root@kaile scripts]# b=‘192.168.1.2-$a‘
[root@kaile scripts]# c="192.168.1.2-$a"
[root@kaile scripts]# echo "a=$a"
a=192.168.1.2-192.168.1.2
[root@kaile scripts]# echo "b=$b"
b=192.168.1.2-$a
[root@kaile scripts]# echo "c=${c}"
c=192.168.1.2-192.168.1.2-192.168.1.2
把一个命令做为变量
[root@kailescripts]# ls
clear.sh clear_log.sh
[root@kaile scripts]# CMD=`ls`
[root@kailescripts]# echo $CMD
clear.shclear_log.sh
[root@kailescripts]# CMD1=$(pwd)
[root@kailescripts]# echo $CMD1
/server/scripts
变量名=`ls` <==反引号
变量名=$(ls)
小结:
1)CMD=ls
的ls两侧的符号是键盘tab键上面的,不是单引号。
2)在变量名前加$,可以取得此变量的值,使用echo或printf命令可以显示变量的值,$A和$(A)写法不同,效果一样,推荐后面的写法。
3)${WEEK}DAY若变量和其他字符组成新的变量就必须给变量加上大括号{}.
4)养成将所有字符串变量用双引号括起来使用的习惯,减少编程遇到的怪异错误。“$A”和“${A}”
1. 变量名只能由字母,数字,下划线组成,且以字母开头。
2. 规范的变量名写法定义:见名知意
a,ClearAge=1 <==每个单词首字母大写
b,clear_age=1 <==每个单词之间用“-”
c,clearAgeSex=1<==驼峰语法:首个单词字母小写,其余单词首字母大写
3. =号的知识,a=1中的等号是赋值的意思,比较是不是相等为“==”
4. 打印变量,变量名前接$符号,变量名后接字符的时候,要用大括号括起来
[root@kaile ~]# word="big"
[root@kaile ~]# echo ${word}ger
bigger
[root@kaile ~]# echo $wordger
1. 注意变量内容引用方法,一般为双引号,简单连续字符可以不加引号,希望原样输出,使用单引号。
2. 变量内容是命令,要用反引号``或者$()把变量括起来使用
Shell脚本可以提高我们日常工作的效率 。
学好一门编程语言 多练 多敲 多思考 再练 在思考 。。。。。
本文出自 “啊凯” 博客,请务必保留此出处http://kaile.blog.51cto.com/12459560/1918675
标签:shell脚本入门
原文地址:http://kaile.blog.51cto.com/12459560/1918675