Shell脚本进阶一

随着课程的进度,对shell脚本进行进行全面的总结

之前一直没有系统的学习过编程,这次在马哥培训,希望花更多的时间和精力在Shell脚本上,总体计划是根据Shell学习的进度不段的更新,把更多的总结和学习进阶体会和进步分享给大家,也对自已是一个鞭策。

脚本,英文script,原意是剧本,在shell中,本质上就是各种Linux命令的堆砌,按实际的需求,结合命令控制流程和条件判断,本质上,脚本可以提高工作效率,按照王老师所说,在Linux里命令操作,最大可接受的重复次数是2次,超过2次都应该考虑用脚本来代替手工的重复性工作。Shell脚本的主要用途有

  1. 自动化常用命令
  2. 执行系统管理和故障排除
  3. 创建简单的应用程序
  4. 处理文本或文件

在进一步学习脚本之前,我们必须对变量这一概念有明确的了解。变量即命名的内存空间,变量类型确定了数据的存储格式和长度,主要分为字符,数值,日期,布尔等,shell默认变量类型为字符类型,除非作事先的申明,如给变量A赋值10就是字符类型

[root@CentOS6 script]# A=10

[root@CentOS6 script]# echo $A

10

如果要明确变量是整数10,就必须declare -i B=10。

一、变量类型

变量的类型决定了存储空间的不同,如同样是上述的字符串变量A和整数B的值都是10,字符10要占用2byte,因为在ASCCI中,每个字符占1byte即8bit,而对于变量B来说,十进制数字10转换为进进制是1010,只需要4bit,但是计算机中最小存储单元是1byte,所以变量B占用2byte的空间。

日期型的变量占用存储空间的差别会更大,如果用ASCII来存储日期2013/12/31,不包括分隔符/,需要8byte存储空间。计算机存储日期是计算从1970/1/1到指定日期的天数,这样2^24足够存储这样的天数,即存储天数只占用3byte空间。

布尔变量可以实现逻辑运算,包括,与、或、异或三种,数值逻辑和电逻辑具有相同之处,如与运算类似电路的串联,或运算类似电路的并联,数值逻辑异或相同为假,不同为真,电转换为磁之后的同极排斥,异极吸引。

二、Bash变量类型

主要分为本地变量,局部变量,环境变量,特殊变量,位置变量。

1. 本地变量

顾名思义,作用域为整个bash进程,赋值语句VARNAME=VALUE

2. 局部变量

作用域为当前代码段,赋值语句local VARNAME=VALUE

3. 环境变量

作用域为当前shell进程及子进程,赋值语句export VARNAME=VALUE。脚本在执行时会启动子shell进程,命令行中启动的脚本会继承当前shell的环境变量。注意:系统自动执行的脚本(非命令行启动)需要自我定义需要的各环境变量

4. 特殊变量

$?变量表示命令执行的状态结果0表示正确执行,1-255表示错误执行,其中1,2,127为系统预留的错误执行状态结果。

$0表示位置变量中的脚本本身

$*传递给脚本的所有参数,全部参数合为一个字符串(需要结合双引号””)

$@传递给脚本的所有参数,每个参数为独立字符串(需要结合双引号””)

$#表示脚本参数个数

$$表示当前运行bash的进程PID

 

5. 位置变量

$1,$2,$……表示在脚本代码中调用通过命令行传递给它的参数

 

三、变量赋值、查看及撤销

1. 变量赋值

普通变量赋值用=,如VARNAME=VALUE

环境变量赋值:export VARNAME=VALUE 或declare -x VARNAME=VALUE

一个变量赋多个值:ANIMALS=pig;animals=$ANIMALS:goat

环境变量赋多个值:export PATH=/usr/local/mysql:$PATH

2. 变量引用

$name ${name}

3. 显示变量

显示普通变量echo $VARNAME

显示所有环境变量:evn,printenv,export, declare -x

4. 删除变量

unset VARNAME

注意:但凡操作变量本身而不是变量的值就不需要加$

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/96904

(0)
上一篇 2018-04-23 08:32
下一篇 2018-04-23 08:51

相关推荐

  • 转载:Markdown 简明语法手册

    markdown 简明语法手册

    Linux笔记 2018-04-14
  • LVM创建级管理

    linux LVM 存储 磁盘

    Linux笔记 2018-05-13
  • 第一周作业

    1、描述计算机的组成及其功能。
    2、按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。
    3、描述Linux的哲学思想,并按照自己的理解对其进行解释性描述。
    4、说明Linux系统上命令的使用格式;详细介绍ifconfig、echo、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相应的示例来阐述。
    5、如何在Linux系统上获取命令的帮助信息,请详细列出,并描述man文档的章节是如何划分的。
    6、请罗列Linux发行版的基础目录名称命名法则及功用规定

    1、描述计算机的组成及其功能:
    计算机由五大部件组成:控制器、运算器、存储器、输入设备、输出设备。
    控制器 :控制计算机各个部件,以实现不同的功能。
    运算器 :执行各种算数运算、逻辑运算,以及对数据的加工。
    存储器 :存放各种数据、指令。
    输入设备 :人机交互的途径,如键盘、鼠标等输入数据的设备。
    输出设备 :人机交互的途径,如显示器、打印机等输出数据的设备。

    2、按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。
    Redhat :使用人群数量大,稳定性非常好,适合当服务器。
    Fedora :基于Redhat,由Redhat桌面版发展而来。
    CentOS :RHEL的复制品。
    Debian :社区类Linux典范,三个分支:Stable(一般只用于服务器),testing,Unstable(用于桌面用户)
    Ubuntu :基于Debian开发,加强桌面系统,是Linux桌面系统使用最多的发行版。
    Slackware:基于SLS的发行版,以其简洁、安全、稳定、高效著称。
    S.u.S.E :以Slackware为基础开发,软件包齐全,桌面系统也还可以。
    Gentoo:最年轻的发行版本,吸取所有发行版的优势诞生,最完美的发行版之一。

    3、描述Linux的哲学思想,并按照自己的理解对其进行解释性描述。
    1)一切皆文件:
    Linux中,一切的东西都可以用文件来表示,如:字符设备、块设备。
    2)由众多单一目的的小程序,一个程序只实现一个功能,多个程序组合完成复杂任务。
    复杂任务也是通过多个简单程序组合,保证高效性。
    3)文本文件保存配置信息。
    Linux对于所有系统的配置都在配置文件中,任何一个编辑工具都能修改。
    4)尽量避免与用户交互
    脚本语言丰富,易于实现自动化进程。

    4、说明Linux系统上命令的使用格式;详细介绍ifconfig、echo、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相应的示例来阐述。
    ~]# COMMAND [OPTION] PATH
    ifconfig:查看网络各种信息、配置网络接口,这个命令已过时,现在用ip addr、ip link。
    [root@localhost ~]# ifconfig
    eno16777736: flags=4163 mtu 1500
    inet 192.168.171.107 netmask 255.255.255.0 broadcast 192.168.171.255
    inet6 fe80::20c:29ff:fef0:ee12 prefixlen 64 scopeid 0x20

    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    lo: flags=73 mtu 65536
    inet 127.0.0.1 netmask 255.0.0.0
    inet6 ::1 prefixlen 128 scopeid 0x10

    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    [root@localhost ~]# ifconfig lo down
    [root@localhost ~]# ifconfig
    eno16777736: flags=4163 mtu 1500
    inet 192.168.171.107 netmask 255.255.255.0 broadcast 192.168.171.255
    inet6 fe80::20c:29ff:fef0:ee12 prefixlen 64 scopeid 0x20

    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    echo:display a line of text,回显,可用于标准输入。
    -n:不输出尾随换行符
    -e:启用反斜杠转义的解释
    -E:不启用反斜杠转义的解释(默认)
    [root@localhost ~]# echo hahaha
    hahaha
    [root@localhost ~]# echo -n hahah
    hahah[root@localhost ~]#
    [root@localhost ~]# echo -e “\n” hahaha

    hahaha
    [root@localhost ~]#
    tty:显示终端机连接标准输入设备的文件名称。
    [root@localhost ~]# tty
    /dev/pts/0
    startx:初始化一个X window
    export:用于设置或显示环境变量。
    -f  代表[变量名称]中为函数名称。
    -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
    -p  列出所有的shell赋予程序的环境变量。
    [root@localhost /]# export MYENV=666
    [root@localhost /]# export -p
    declare -x HISTCONTROL=”ignoredups”
    declare -x HISTSIZE=”1000″
    declare -x HOME=”/root”
    declare -x HOSTNAME=”localhost.localdomain”
    declare -x LESSOPEN=”||/usr/bin/lesspipe.sh %s”
    declare -x LOGNAME=”root”
    ……
    declare -x MAIL=”/var/spool/mail/root”
    declare -x MYENV=”666″
    declare -x OLDPWD=”/root”
    declare -x PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin”
    declare -x PWD=”/”
    ……
    declare -x SHELL=”/bin/bash”
    declare -x SHLVL=”1″
    declare -x SSH_CLIENT=”192.168.171.35 55854 22″
    declare -x SSH_CONNECTION=”192.168.171.35 55854 192.168.171.107 22″
    declare -x SSH_TTY=”/dev/pts/1″
    declare -x TERM=”xterm”
    declare -x USER=”root”
    declare -x XDG_RUNTIME_DIR=”/run/user/0″
    declare -x XDG_SESSION_ID=”10″
    [root@localhost /]# export -n MYENV
    [root@localhost /]# export -p
    declare -x HISTCONTROL=”ignoredups”
    declare -x HISTSIZE=”1000″
    declare -x HOME=”/root”
    declare -x HOSTNAME=”localhost.localdomain”
    declare -x LESSOPEN=”||/usr/bin/lesspipe.sh %s”
    declare -x LOGNAME=”root”
    ……
    declare -x MAIL=”/var/spool/mail/root”
    declare -x OLDPWD=”/root”
    declare -x PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin”
    declare -x PWD=”/”
    ……
    declare -x SHELL=”/bin/bash”
    declare -x SHLVL=”1″
    declare -x SSH_CLIENT=”192.168.171.35 55854 22″
    declare -x SSH_CONNECTION=”192.168.171.35 55854 192.168.171.107 22″
    declare -x SSH_TTY=”/dev/pts/1″
    declare -x TERM=”xterm”
    declare -x USER=”root”
    declare -x XDG_RUNTIME_DIR=”/run/user/0″
    declare -x XDG_SESSION_ID=”10″
    pwd:显示当前工作目录
    [root@localhost ~]# pwd
    /root
    history:用于显示指定数目的指令;
    -c :清空当前历史命令;
    -a :将历史命令缓冲区中命令写入历史命令文件中;
    -r :将历史命令文件中的命令读入当前历史命令缓冲区;
    -w :将当前历史命令缓冲区命令写入历史命令文件中;
    [root@localhost ~]# history
    1 nm-connection-editor
    2 cd
    3 systemctl restart network
    4 ping baidu.com
    5 history
    [root@localhost ~]# history -c
    [root@localhost ~]# history
    1 history
    [root@localhost ~]#
    shutdown、poweroff、reboot:关机、重启命令;
    hwclock:显示调整硬件时钟命令;
    –set –date=:修改硬件时间;
    –systohc:设置硬件时间为当前系统时间;
    –hctosys:设置系统时间为当前硬件时间;
    [root@localhost ~]# hwclock
    Mon Aug 20 09:20:45 2018 -0.241275 seconds
    [root@localhost ~]# hwclock –set –date=’2018-01-01 01:01:01′
    [root@localhost ~]# hwclock
    Mon Jan 1 01:01:04 2018 -0.083944 seconds
    [root@localhost ~]# hwclock –systohc
    [root@localhost ~]# hwclock
    Mon Aug 20 09:22:32 2018 -0.287440 seconds
    date:查看修改系统时间。
    [root@localhost ~]# date
    Mon Aug 20 09:40:50 CST 2018
    [root@localhost ~]# date “+现在时间是Y-%m-%d %H-%M-%S”
    现在时间是2018-08-20 09-42-35
    [root@localhost ~]# date -s “20111111 11:11:11”
    Fri Nov 11 11:11:11 CST 2011
    5、如何在Linux系统上获取命令的帮助信息,请详细列出,并描述man文档的章节是如何划分的。
    help/man/info
    help命令用于显示shell内部命令的帮助信息。help命令只能显示shell内部的命令帮助信息。而对于外部命令的帮助信息只能使用man或者info命令查看。
    man:
    -f:同’whatis’;
    1 Executable programs or shell commands
    2 System calls (functions provided by the kernel)
    3 Library calls (functions within program libraries)
    4 Special files (usually found in /dev)
    5 File formats and conventions eg /etc/passwd
    6 Games
    7 Miscellaneous (including macro packages and conventions), e.g. man(7),groff(7)
    8 System administration commands (usually only for root)
    9 Kernel routines [Non standard]
    6、请罗列Linux发行版的基础目录名称命名法则及功用规定
    Linux发行版遵循FHS标准:Filesystem Hierarchy Standard(文件系统层次化标准)
    [root@localhost ~]# ls /
    bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
    [root@localhost ~]# tree -L 1 /
    /
    |– bin -> usr/bin (一般用户使用的命令)
    |– boot (放置内核及引导程序文件)
    |– dev (硬盘、分区、键盘、鼠标、USB、tty等的所有设备文件)
    |– etc (系统所有的配置文件)
    |– home (普通用户家目录)
    |– lib -> usr/lib (库文件)
    |– lib64 -> usr/lib64 (64位库文件)
    |– media (软盘、光盘、DVD等挂载点)
    |– mnt (临时挂载点)
    |– opt (第三方协力软件)
    |– proc (将进程和内核信息以文件形式存放的目录)
    |– root (管理员用户家目录)
    |– run (运行时的变量信息,本次系统运行的系统信息)
    |– sbin -> usr/sbin (存放系统管理可执行文件)
    |– srv (一些网络服务启动收所需要的数据目录)
    |– sys (与proc类似,是虚拟文件系统,硬件装置信息等)
    |– tmp (文件临时存放目录,可设置重启之后清空)
    |– usr (只读用户的次要层次,包括大部分应用程序)
    `– var (存储经常变动的数据的目录,如缓存、日志)

    Linux笔记 2018-08-20
  • 第六周学习

    Linux学习第六周

    2018-08-04
  • 进程管理工具及计划任务

    进程管理工具 kill命令: 向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头 (可省略),不区分大小写 显示当前系统可用信号: kill –l,trap -l 常用信号:man 7 signal 1) SIGHUP: 无须关闭进程而让其重读配置文件 2) SIGINT: 中止正在运行的进程;相当于Ctrl+c 3) SIGQ…

    Linux笔记 2018-05-06