8455澳门新_8455新葡萄娱乐【官网】

用户可以在shell脚本中敲入一系列的命令或命令语

1.1 脚本认识

  •  1 #!/bin/bash 

第一行,通常用来指定执行脚本的shell ,/bin/bash是CentOS 默认的shell  如果写到第二行,就是注释了

  •  1 #!/bin/sh 

这样写也是可以的,sh是bash的软链接,和#!/bin/bash 是没有区别的,理规范的开头使用#!/bin/bash

什么是shell?

shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到shell的回应),或非交互(执行脚本程序)的方式。
下图的黄色部分就是命令解释器shell处于的操作系统中位置形象图解。
8455澳门新 1

 

1、 查看当前linux 支持的shell 类型

一、在命令行窗口执行shell脚本时,source .所执行的脚本中,变量的作用域在当前shell窗口期,而bash、sh在shell脚本执行完了就失效了。

1.2 查看bash版本

  • 1 [root@oldboy-lesson scripts]# bash --version
    2 GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
    3 Copyright (C) 2009 Free Software Foundation, Inc.
    4 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    5  
    6 This is free software; you are free to change and redistribute it.
    7 There is NO WARRANTY, to the extent permitted by law.
    8 [root@oldboy-lesson scripts]# cat test_1.sh
    9 #!/bin/bash
    
    10 user=whoami 11 echo $user 12 [root@oldboy-lesson scripts]# sh test_1.sh 13 root 14 [root@oldboy-lesson scripts]# ./test_1.sh 15 root 16 [root@oldboy-lesson scripts]# . test_1.sh 17 root 18 [root@oldboy-lesson scripts]# source test_1.sh 19 root 20 [root@oldboy-lesson scripts]# /bin/bash test_1.sh 21 root 22 [root@oldboy-lesson scripts]# /bin/sh test_1.sh 23 root 24 [root@oldboy-lesson scripts]# /server/scripts/test_1.sh 25 root 

什么是shell脚本?

当linux命令或语句不在命令下执行(严格说,命令行执行的语句也是shell脚本),而是通过一个程序文件执行时,该程序就被称为shell脚本或shell程序,shell程序很类似DOS系统下的批处理程序(扩展名*.bat)。用户可以在shell脚本中敲入一系列的命令或命令语句组合。这些命令、变量和流程控制语句等有机的结合起来就形成了一个功能很强大的shell脚本。
下面是在windows下利用批处理程序bat开发的备份网站及数据库数据的脚本。
@echo off
set date=%date:`0,4%-%date:`5,2%-%date:`8,2%
mysqldump -uroot -poldboy -A -B > D:bak"%date%".sql
rar.exe a -k -r -s -ml D:bak"%date%".sql.rar D:bak"%date%".sql
del D:bak*.sql
rar.exe a -k -r -s -ml D:bak"%date%"htdocs.rar D:workhtdocs
示例1:清除/var/log下messages日志文件的简单命令脚本。
#把所有命令放在一个文件里堆积起来就形成了脚本,下面是一个最简单的命令堆积形成的shell脚本
#root身份运行
#清楚日志
cd /var/log
cat /dev/null > messages
echo "Logs cleaned up."
上述脚本存在如下问题:
1、如果不是root用户无法执行清理日志。
2、无流程控制语句,没有判断和逻辑。
示例2:包含命令、变量和流程控制语句的清除/var/log下messages日志文件的shell脚本。
#!/bin/bash
#清除日志脚本
LOG_DIR=/var/log
ROOT_UID=0 #$UID为0的时候,用户才具有root用户的权限
#使用root运行
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Mast be root to run this script."
exit 1
fi
cd $LOG_DIR || {
echo "Cannot change to necessary directory." >&2
exit 1 
}
cat /dev/null > messages && echo "Logs cleaned up."
exit 0
#退出之前返回0表示成功,返回1表示失败。
拓展:清空日志及文件内容的三种方法。
[root@lamp ~]# echo >test.log
[root@lamp ~]# >test.log 
[root@lamp ~]# cat /dev/null > test.log 

[root@nfs01 ~]# cat /etc/shells

dream361@master:~$ cat test.sh 
user='pwd'   当前的脚本内容
dream361@master:~$ bash test.sh  用bash执行
dream361@master:~$ echo $user  结果为空
dream361@master:~$ . test.sh  用 source 或 执行
dream361@master:~$ echo $user  结果为pwd
pwd

1.3 书写脚本

 

shell脚本在运维工作中的地位

shell脚本很擅长处理纯文本类型的数据,而linux系统中几乎所有的配置文件(如nfs、rsync、httpd、nginx、lvs等)、多数启动文件都是纯文本类型的文件。因此利用shell可以在linux系统中发挥巨大作用。

/bin/sh

二、执行一个脚本没有执行权限的脚本

1.3.1 执行脚本

 

1.3.1.1  小结:

执行脚本的方法有:sh       ./          .           source /bin/bash         /bin/sh pwd/

shell脚本语言的种类

在UNIX/LINUX中主要有两大类shell。
Bourne shell包括sh、ksh和bash。
Bourne shell (sh)
Korn shell (ksh)
Bourne Again shell (bash)
POSIX shll (sh)
C shell包括csh和tcsh。
C shell (csh)
TEXES/TOPS C shell(tcsh)
shell脚本语言是若类型语言,较为通用的shell有标准的Bourne shell(sh)和C shell(csh)。其中Bource shell(sh)已经被bash shell取代。
查看系统的shell。
[root@lamp ~]# cat /etc/shells
/bin/sh
/bin/bash #功能更强大
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

/bin/bash

  1. 用 bash、sh
  2. source 、.

  3. chmod u+x test.sh 然后就可以用 绝对路径或相对路径执行此脚本

    [root@Mmaster1 ~]# cat testSource.sh 查看此脚本内容 user='last' [root@Mmaster1 ~]# unset user 清除变量值 [root@Mmaster1 ~]# echo $user 输出为空

    [root@Mmaster1 ~]# source testSource.sh 执行赋值操作 [root@Mmaster1 ~]# echo $user 输出变量值为last last [root@Mmaster1 ~]# unset user 清除变量值 [root@Mmaster1 ~]# echo $user 输出为空 [root@Mmaster1 ~]#

     

     

1.4 继承脚本变量

  • 1 [root@oldboy-lesson scripts]# sh test_1.sh
    2 root
    3 [root@oldboy-lesson scripts]# echo $user
    4  
    5 [root@oldboy-lesson scripts]# ./test_1.sh
    6 root
    7 [root@oldboy-lesson scripts]# echo $user
    8  
    9 [root@oldboy-lesson scripts]# bash test_1.sh
    
    10 root 11 [root@oldboy-lesson scripts]# echo $user 12
    13 [root@oldboy-lesson scripts]# . test_1.sh 14 root 15 [root@oldboy-lesson scripts]# echo $user 16 root 17 [root@oldboy-lesson scripts]# source test_1.sh 18 root 19 [root@oldboy-lesson scripts]# echo $user 20 root

1.4.1.1  小结

继承:source 和 .      能继承脚本的变量,其它命令皆不能继承

常用操作系统的默认shell

Linux是bourne agaion shell(bash)。
Solaris和FreeBSD缺省的是Bourne shll(sh)。
AIX下是korn shell(ksh)。
HP-UX缺省的是POSIX shell(sh)。
查看CentOS默认shell。
第一种方法。
[root@lamp ~]# echo $SHELL
/bin/bash
[root@lamp ~]# echo $shell
bash
第二种方法。
[root@lamp ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
更改默认的shell配置文件。
[root@lamp ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

/sbin/nologin

shell脚本的建立和执行

shell**脚本的建立。
在linux系统中,shell脚本(bash shll程序)通常是在编辑器(如vi/vim)中编写,由Unix/Linux命令、bash shell命令、程序结构控制语句和注释等内容组成,推荐使用vim编辑器编写,可以事先做一个别名alias vi='vim'。
[root@lamp ~]# echo "alias vi='vim'" >>/etc/profile
[root@lamp ~]# tail -n 1 /etc/profile
alias vi='vim'
[root@lamp ~]# source /etc/profile
[root@lamp ~]# . /etc/profile
脚本开头(第一行)
一个规范的shell脚本在脚本第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在linux bash编程中一般为:
#! /bin/bash

#! /bin/sh <==255个字符以内
其中开头的"#!"字符又称为幻数,在执行bash脚本的时候,内核会根据"#!"后的解释器来确定该用哪个程序解释这个脚本的内容。注意,这一行必须在每个脚本顶端的第一行,如果不是第一行则为脚本注释行,例如下面的例子。
不加上诉第一行,默认就会使用linux默认的shell。
[root@lamp ~]# cat test.sh 
#!/bin/bash
echo "shell start"
#!/bin/bash #写到这里表示注释
#!/bin/sh
echo "shell end"
sh和bash的区别,早期的bash与sh稍有不同,它还包含了csh和ksh的特色,但大多数脚本都可以不加修改的在sh上运行。
[root@lamp ~]# ll /bin/sh
lrwxrwxrwx. 1 root root 4 Mar 10 2017 /bin/sh -> bash
[root@lamp ~]# ll /bin/bash 
-rwxr-xr-x. 1 root root 941944 Jan 12 2017 /bin/bash
sh为bash的软连接,推荐用标准写法#!/bin/bash。
注意,当使用/bin/sh执行脚本不正常的时候,可以使用/bin/bash执行。
bash**的版本
[root@lamp ~]# bash -version
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
脚本注释
在shell脚本中,跟在(#)井号后面的内容表示注释,用来对脚本进行注释说明,注释部分不会被当做程序执行,仅仅是给用户看,系统解释器是看不到的,更不会执行。注释可自成一行,也可以跟在脚本命令后面与命令在同一行。开发脚本时,如果没有注释,团队里的其他人就很难理解脚本究竟在做什么,如果时间上了自己也会忘记。因此,我们要尽量养成为所开发的shell脚本书写注释的习惯。注释书写注意规范性,尽量不用中文。
shell**脚本的执行
当shell脚本运行时,它会先查找系统环境变量ENV,该变量指定了环境文件(通常是.bashrc、.bash_profile、/etc/bashrc、/etc/profile等),然后从该环境变量文件开始执行脚本,当读取了ENV的文件后,shell会开始执行shell脚本中的内容。
特殊技巧:设置crond任务时,最好把系统环境变量在定时任务脚本中重新定义,否则,一些系统环境变量将不会被加载。
shell脚本的执行通常可以采用以下几种方式:
1、bash script-name或sh script-name(推荐使用)。
2、path/script-name或./script-name(当前路径下执行脚本,需要脚本有执行权限)。
3、source script-name或. scripts-name("."点号)。
4、sh<script-name或cat script-name|sh(同样适合bash)。
执行说明
第一种方法是当脚本文件本身没有可执行权限(即文件x位为-号)时常使用的方法,或者文件开头没有指定解释器。
第二种方法需要先将脚本文件的权限改为可执行(即文件加X位),具体方法:chmod u+x script-name或chmod 755 script-name。然后通过脚本路径就可以直接执行脚本。
第三种放法通常是使用source或"."点号读入或加载指定的shell脚本文件(如test.sh),然后,依次执行指定shell脚本文件test.sh中的所有语句。
举例说明:
[root@lamp ~]# cat >test.sh
echo 'i am shell'
输入"echo 'i am shell'"内容后按回车,然后再按ctrl+d组合键即可结束编辑。
1)通过第一种方法执行
[root@lamp ~]# cat test.sh 
echo 'i am shell'
[root@lamp ~]# sh test.sh 
i am shell
[root@lamp ~]# bash test.sh 
i am shell
2)通过第二种方法执行
[root@lamp ~]# ll test.sh 
-rw-rw-r--. 1 root root 18 Jul 24 23:20 test.sh
[root@lamp ~]# ./test.sh #使用第二种方式,"./"在当前目录下执行test.sh脚本文件,无法使用tab自动补全
-bash: ./test.sh: Permission denied 
给test.sh添加可执行权限。
[root@lamp ~]# chmod u+x test.sh 
[root@lamp ~]# ./test.sh 
i am shell
3)通过第三种方法执行
[root@lamp ~]# . test.sh 
i am shell
[root@lamp ~]# source test.sh 
i am shell
4)通过第四种方法执行
[root@lamp ~]# sh <test.sh 
i am shell
[root@lamp ~]# cat test.sh|bash
i am shell
案例:已知如下命令及返回结果,请问echo $user的返回结果为()。
[root@lamp ~]# cat test.sh 
user=`whoami`
[root@lamp ~]# sh test.sh
[root@lamp ~]# echo $user
答案:空。
[root@lamp ~]# . test.sh 
[root@lamp ~]# echo $user
答案:root 
结论:1、子shell会直接继承父shell的变量、函数等。2、如果希望父shell调用子shell的变量、函数等,用source或"."点号执行脚本。
shell**脚本开发的基本习惯
1)脚本第一行指定脚本解析器。
#8455澳门新,!/bin/sh或#!/bin/bash
2)脚本开头加版本版权等信息
#Date: 07:00 2018-07-26
#Mail:xxxxx@xxx
#Author:Created by golden
#Function:This scripts function is ...
#Version:1.3
提示:可以配置vim编辑文件时自动加上以上信息,方法是修改~/.vimrc配置文件。
3)脚本中不用中文注释
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰。
4)脚本以.sh为扩展名命名。
5)代码书写优秀习惯技巧
1、成对的符号内容尽量一次写出来,防止遗漏。
2、"[]"中括号两端要有空格,书写时即可留出空格[ ],然后在退格书写内容,先书写一对中括号,然后退一格,然后在输入两个空格,再退一格。 双中括号"[[]]"也是如此。
3、流程控制语句一次书写完,在添加内容。
if语句格式一次完成。
if 条件内容
then
内容
fi
for循环格式一次完成。
for
do
内容
done
6)通过缩进让代码更易读。

/bin/dash

/bin/tcsh

/bin/csh

上面的前三个是常用的,bash比sh要更强,有些如果执行不起来,那么就用bash增强

shell脚本优势在于处理操作系统底层的业务,php是网页程序,是一款更注重于web网页开发的脚本语言

考试题一Centoslinux系统默认的shell是()

bash

查看方法1、

[root@nfs01 ~]# echo $SHELL

/bin/bash

查看方法2、

[root@nfs01 ~]# grep root /etc/passwd

root:x:0:0:root:/root:/bin/bash

更改默认的shell

[root@nfs01 ~]# cat /etc/default/useradd

# useradd defaults file

GROUP=100

HOME=/home

INACTIVE=-1

EXPIRE=

SHELL=/bin/bash

SKEL=/etc/skel

CREATE_MAIL_SPOOL=yes

 

2、书写脚本方法如下:

脚本开头(第一行)指明解释器

#!/bin/bash

#!/bin/sh <==255个字符以内

 

注意bash的漏洞(破壳漏洞,注意升级)

 

下面是linux中常用脚本语言开头的编码写法:

#!/bin/sh

#!/bin/bash

#!/usr/bin/awk

#!/bin/sed

#!/usr/bin/tcl

#!/usr/bin/expect(sshpass,pssh)

#!/usr/bin/perl

#!/usr/bin/env python

如果脚本里面没有上面的解释器那么就用 类似 python test.txt等来执行

3、shell的执行方式

注意点,设置crond任务的时候,最好把系统环境变量在定时任务脚本重新定义,否则,一些系统环境变量将不被加载,这个问题要注意

shell脚本的执行通常采取下面几种方式

1)  bash script-name或者sh script-name (推荐使用)

2)  path /script-name或者./scripts-name  #-->注意“.”点号   《===需要脚本有执行权限

3)  source script-name 或者. script-name   #-->注意“.”点号

本文由8455澳门新发布于每日更新,转载请注明出处:用户可以在shell脚本中敲入一系列的命令或命令语

相关阅读