当前位置: 首页 > news >正文

专业外贸网站建设公司做信息图网站

专业外贸网站建设公司,做信息图网站,中铁建设集团招聘信息,光谷做网站推广价格前言 为什么学 Shell Shell 脚本语言是实现 Linux/UNIX 系统管理及自动化运维所必备的重要工具#xff0c; Linux/UNIX 系统的底层及基础应用软件的核心大都涉及 Shell 脚本的内容。每一个合格 的Linux 系统管理员或运维工程师#xff0c;都需要能够熟练地编写 Shell 脚本语言… 前言 为什么学 Shell Shell 脚本语言是实现 Linux/UNIX 系统管理及自动化运维所必备的重要工具 Linux/UNIX 系统的底层及基础应用软件的核心大都涉及 Shell 脚本的内容。每一个合格 的Linux 系统管理员或运维工程师都需要能够熟练地编写 Shell 脚本语言并能够阅读系统及各类软件附带的 Shell 脚本内容。只有这样才能提升运维人员的工作效率适 应曰益复杂的工作环境减少不必要的重复工作从而为个人的职场发展奠定较好的基础 什么是 shell Shell 是一个命令解释器它在操作系统的最外层负责直接与用户对话把用户的输入解释给操作系统并处理各种各样的操作系统的输出结果输出屏幕返回给用户。 这种对话方式可以是 交互的方式从键盘输入命令通过 /bin/bash 的解析可以立即得到 Shell 的回应[rootmico ~]# echo hello hello [rootmico ~]# pwd /root [rootmico ~]# 非交互的方式: 脚本什么是Shell脚本 Linux命令、变量和流程控制语句等有机的结合起来并以程序文件形式执行该程序称为shell脚本。Shell脚本语言是弱类型语言无须定义变量的类型即可使用 shell脚本擅长处理纯文本类型的数据而linux中几乎所有的配置文件日志都是纯文本类型文件。脚本语言的种类 编译型语言 定义指用专用的编译器针对特定的操作平台操作系统将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码具有操作数指令、及相应的格式这个过程叫做编译./configure make makeinstall 编译好的可执行性文件.exe可在相对应的平台上运行移植性差但运行效率高。典型的编译型语言有 C语言、C等。另外Java语言是一门很特殊的语言Java程序需要进行编译步骤但并不会生成特定平台的二进制机器码它编译后生成的是一种与平台无关的字节码文件*.class移植性好的原因这种字节码自然不能被平台直接执行运行时需要由解释器解释成相应平台的二进制机器码文件大多数人认为Java是一种编译型语言但我们说Java即是编译型语言也是解释型语言也并没有错。 解释型语言 定义指用专门解释器对源程序逐行解释成特定平台的机器码并立即执行的语言相当于把编译型语言的编译链接过程混到一起同时完成的。解释型语言执行效率较低且不能脱离解释器运行但它的跨平台型比较容易只需提供特定解释器即可。常见的解释型语言有 Python同时是脚本语言与Ruby等。 脚本语言 定义为了缩短传统的编写-编译-链接-运行edit-compile-link-run过程而创建的计算机编程语言。特点程序代码即是最终的执行文件只是这个过程需要解释器的参与所以说脚本语言与解释型语言有很大的联系。脚本语言通常是被解释执行的而且程序是文本文件。 典型的脚本语言有JavaScriptPythonshell等。 其他常用的脚本语句种类 PHP是网页程序也是脚本语言。是一款更专注于 web 页面开发前端展示的脚本语言例如Dedecms,discuz。PHP 程序也可以处理系统日志配置文件等php 也可以调用系统命令。Perl 脚本语言。比 shell 脚本强大很多语法灵活、复杂实现方式很多不易读团队协作困难但仍不失为很好的脚本语言存世大量的程序软件。MHA 高可用 Perl 写的Python不但可以做脚本程序开发也可以实现 web 程序以及软件的开发。近两年越来越多的公司都会要求会 Python。Shell脚本与 php/perl/python 语言的区别和优势 shell 脚本的优势在于处理操作系统底层的业务 linux 系统内部的应用都是 shell 脚本完成因为有大量的 linux 系统命令为它做支撑。2000 多个命令都是 shell 脚本编程的有力支撑特别是grep、awk、sed 等。例如一键软件安装、优化、监控报警脚本常规的业务应用shell 开发更简单快速符合运维的简单、易用、高效原则。PHP、Python 优势在于开发运维工具以及 web 界面的管理工具web 业务的开发等。处理一键软件安装、优化报警脚本。常规业务的应用等 php/python 也是能够做到的。但是开发效率和复杂比用 shell 就差很多了。 系统中的shell 查看系统环境 [rootmico ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [rootmico ~]# uname -r 3.10.0-862.11.6.el7.x86_64 [rootmico ~]# getenforce Disabled [rootmico ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (dead)Docs: man:firewalld(1) [rootmico ~]# 查看系统中的命解释器 [rootmico ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh [rootmico ~]# 常用操作系统的默认shell Linux是Bourne Again shellbashSolaris和FreeBSD缺省的是Bourne shellshAIX下是Korn ShellkshHP-UX缺省的是POSIX shellsh[rootmico ~]# echo $SHELL /bin/bash 查看系统的 Bash 版本 [rootVM_42_34_centos /]# head -1 /etc/init.d/network #! /bin/bash [rootVM_42_34_centos /]# head -1 /etc/init.d/netconsole #!/bin/bash bash版本 [rootmico ~]# bash -version GNU bash 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. 许可证 GPLv3: GNU GPL 许可证版本3或者更高 http://gnu.org/licenses/gpl.html这是自由软件您可以自由地更改和重新发布。 在法律允许的范围内没有担保. bash 破壳漏洞 使用 命令 env x() { :;}; echo be careful bash -c echo this is a test 如果返回结果为一行则为正常 [rootmico ~]# env x() { :;}; echo be careful bash -c echo this is a test this is a test #解决办法 升级当前的bash版本yum install update bash bash 和 sh 的区别 早期的bash和sh稍有不同还包含了csh和ksh的特色但大多数脚本都可以不加修改地在sh上运行 [rootVM_42_34_centos ~]# ll /bin/bash -rwxr-xr-x 1 root root 964544 4月 11 2018 /bin/bash [rootVM_42_34_centos ~]# ll /bin/sh lrwxrwxrwx 1 root root 4 8月 10 2018 /bin/sh - bash 说明sh为bash的软链接一般情况下脚本开头使用“#!/bin/bash”和#!/bin/sh是没有区别的但更规范的写法是在脚本开头使用“#!/bin/bash” 下面的Shell脚本是系统自带的软件启动脚本的开头部分 sh与bash 的关系 [rootmico ~]# ll /bin/sh lrwxrwxrwx 1 root root 4 8月 10 2018 /bin/sh - bash /bin与 /user/bin 的关系 [rootmico ~]# ll /bin -d lrwxrwxrwx 1 root root 7 8月 10 2018 /bin - usr/bin 脚本书写规范 脚本统一存放目录 [rootmico ~]# mkdir -p /server/scripts/ [rootmico ~]# cd /server/scripts/ 选择解释器 脚本第一行指出由哪个程序解释器来执行脚本中的内容#!/bin/bash或#!/bin/sh255个字符以内 注意格式 ↓ 其中开头的#!字符又称为幻数在执行bash脚本的时候内核会根据#!后的解释器来确定该用那个程序解释这个脚本中的内容。 [rootmico scripts]# head -1 /etc/init.d/*/etc/init.d/functions # -*-Shell-script-*- /etc/init.d/netconsole #!/bin/bash /etc/init.d/network #! /bin/bash /etc/init.d/README You are looking for the traditional init scripts in /etc/rc.d/init.d, 编辑脚本使用vim 使用 .vimrc 文件将下面的信息添加到 .vimrc 文件中能够快速的生成开头的注释信息 autocmd BufNewFile *.py,*.cc,*.sh,*.java exec :call SetTitle()func SetTitle()if expand(%:e) shcall setline(1,#!/bin/bash)call setline(2, ##############################################################)call setline(3, # File Name: .expand(%))call setline(4, # Version: V1.0)call setline(5, # Author: mico)call setline(6, # Created Time : .strftime(%F %T))call setline(7, # Description:)call setline(8, ##############################################################)call setline(9, )endif endfunc 使用后的效果 #!/bin/bash ############################################################## # File Name: scripts_tmp.sh # Version: V1.0 # Author: mico # Created Time : 2019-07-09 10:12:27 # Description: ############################################################## 在Shell脚本中跟在#后面的内容表示注释。注释部分不会被执行仅给人看。注释可以自成一行也可以跟在命令后面与命令同行。要养成写注释的习惯方便自己与他人。 最好不用中文注释因为在不同字符集的系统会出现乱码。(字符集为zh_CN.UTF-8,为中文)。 文件名规范 名字要有意义并且结尾以 .sh 结束并不是必须 开发的规范和习惯小结 放在统一的目录脚本以 .sh 为扩展名开头指定脚本解释器。开头加版本版权等信息可配置 ~/.vimrc 文件自动添加。脚本不要用中文注释尽量用英文注释。代码书写优秀习惯 成对的内容一次性写出来防止遗漏如[ ]、 、 等[ ] 两端要有空格先输入[ ],退格输入 2 个空格再退格写。流程控制语句一次书写完再添加内容。(if 条件 ; then 内容;fi)通过缩进让代码易读。脚本中的引号都是英文状态下的引号其他字符也是英文状态。shell脚本的执行 当 Shell 脚本运行时会先查找系统环境变量 ENV该变量指定了环境文件加载顺序通常是 /etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc ,在加载了上述变量文件后Shell就开始执行脚本中的内容。 Shell 脚本是从上至下、从左至右依次执行每一行的命令及语句的。即执行完了一个命令后再执行下一个如果在 Shell 脚本中即脚本嵌套 时就会先执行子脚本的内容完成后再返回父脚本继续执行父脚本内后序的命令及语句。 通常情况下在执行 Shell 脚本时会向系统内核请求启动一个新进程以便在该进程或只能怪执行脚本的命令以及子Shell 脚本。 执行脚本的办法 执行脚本的四种方法 1sh/bash scripts.sh 当脚本本身没有可执行权限时使用的方法或脚本文件开头没有指定解释器时需要使用分方法。 2首先chown x 然后./scripts.sh或.path/scripts.sh 在当前路径下执行脚本脚本需要有执行权限通过绝对路径或相对路径直接执行脚本 3source scripts.sh 或 . (空格) scripts.sh 这种方法通常是使用 source 或 . 读入或加载指定的 shell 脚本文件不需要执行权限然后依次执行指定 shell 脚本中的所有语句。这些语句将在当前 shell 脚本的进程中运行其他几种模式都会启动新的进程执行子脚本。source 或 . 命令的功能是在当前 Shell 中执行 source 或 . 加载并执行的相关脚本文件中的命令及语句而不是产生一个子 Shell 来执行文件中的命令。说明. 或 source 命令的功能相同都是读入脚本并执行脚本中的命令。 4sh script-name 或 cat scripts-name|sh 效率低 同样适用于bash不过这种用法不常见。 source 与 . 点 的作用 soucre命令 [rootmico ~]# help source |head -2 source: source 文件名 [参数]在当前 shell 中执行一个文件中的命令。 . (点) [rootmico ~]# help . |head -2 .: . 文件名 [参数]在当前 shell 中执行一个文件中的命令。 sh于source的区别 对比用 source 执行脚本文件执行过程不另开进程脚本文件中设定的变量在当前shell中可以看到 用 sh/bash 执行脚本文件是在当前进程另开子进程来执行脚本命令脚本文件中设定的变量在当前shell中不能看到。 例如 [rootVM_42_34_centos trsky]# echo userdirpwd testsource.sh [rootVM_42_34_centos trsky]# cat testsource.sh userdirpwd [rootVM_42_34_centos trsky]# sh testsource.sh [rootVM_42_34_centos trsky]# echo $userdir[rootVM_42_34_centos trsky]# source testsource.sh [rootVM_42_34_centos trsky]# echo $userdir /home/trsky [rootVM_42_34_centos trsky]# 由案例可知使用 source 或 . 执行的脚本中的变量值会传递到当前的 Shell 下因为使用 source 或 . 执行脚本不会开启新的进程而是在统一进程下完成脚本中所有指令的执行。 [rootmico scripts]# sh mico_test.sh Hello World! [rootmico ~]# echo $Mico Mico # sh 新建一个Shell窗口新建一个进程执行一个文件中的命令。[rootmico scripts]# source mico_test.sh Hello World! [rootmico scripts]# echo $mico Hello World! 面试题 问 sh test.sh 后 echo $user 返回的结果_空 ? [rootoldboy scripts]# cat test.sh #!/bin/bash userwhoami Shell的变量 Shell变量的特性 Shell为弱类型语言所以在默认情况下在Bash Shell中是不会区分变量类型的。但Shell可以通 declare 显示定义变量的类型。 什么是变量 变量可以分为两类环境变量全局变量和普通变量局部变量 环境变量也可称为全局变量可以在创建他们的Shell及其派生出来的任意子进程shell中使用环境变量又可分为自定义环境变量和Bash内置的环境变量普通变量也可称为局部变量只能在创建他们的Shell函数或Shell脚本中使用。普通变量一般是由开发者用户开发脚本程序时创建的。特殊变量Shell中定义变量名以及为变量内容赋值要求 变量名一般由字母、数字、下划线组成可以由字母或下划线开头 把一个命令的结果作为变量的内容赋值的方法 变量名ls变量名$(ls)环境变量 使用 env/declare/set/export -p 命令查看系统中的环境变量这三个命令的的输出方式稍有不同。 [rootmico scripts]# env XDG_SESSION_ID1 HOSTNAMEmico TERMlinux SHELL/bin/bash HISTSIZE1000 SSH_CLIENT10.0.0.1 5537 22 SSH_TTY/dev/pts/0 USERroot ~~~ 输出一个系统中的环境变量 [rootmico ~]# echo $LANG zh_CN.UTF-8 自定义环境变量 设置环境变量export 和 declare 设置环境变量的3种方法 export 变量名value变量名value; export 变量名declare -x 变量名value自定义全局变量的实例 [rootVM_42_34_centos ~]# cat /etc/profile|grep Mico export Micomico [rootVM_42_34_centos ~]# source /etc/profile [rootVM_42_34_centos ~]# echo $MIco[rootVM_42_34_centos ~]# echo $Mico mico [rootVM_42_34_centos ~]# env|grep Mico Micomico [rootVM_42_34_centos ~]# 让环境变量永久生效的常用设置文件 用户环境变量配置# 用户的环境变量设置比较常见的是用户家目录下的.bashrc 和 .bash_profile [rootmico ~]# ls /root/.bashrc /root/.bashrc [rootmico ~]# ls /root/.bash_profile /root/.bash_profile [rootmico ~]# 全局环境变量的配置 常见的全局环境变量的配置文件如下/etc/profile /etc/bashrc /etc/profile.d/ 如果要在登陆后初始化或显示加载内容则将脚本文件放在/etc/profile.d/下即可无需执行权限 设置登录提示的两种方式 在/etc/motd里增加提示的字符串[rootmico ~]# vim /etc/motd [rootmico ~]# cat /etc/motd Welcome to Linux. 在/etc/profile.d/目录下添加脚本[rootmico profile.d]# cat /etc/profile.d/mico.sh #!/bin/bash ############################################################## # File Name: /etc/profile.d/mico.sh # Version: V1.0 # Author: mico # Created Time : 2019-07-01 10:00:06 # Description: ############################################################## echo Hello, you are studing Linux 登录后出现 Connection established. To escape to local shell, press CtrlAlt].Welcome to Linux. Hello, you are studing Linux [rootmico ~]# 显示与取消环境变量 通过 echo 或 prinf 打印环境变量#常见的系统环境变量 $HOME:用户登录时进入的目录 $UID:当前用户的UID(用户标识),相当于 id-u $PWD:当前工作目录的绝对路径名 $SHELL:当前Shell $USER:当前yonghu ... 打印或删除环境变量 #打印环境 printf $Home\n echo $PWD 使用unset取消环境变量#删除环境变量 unset PWD 普通变量 本地变量在用户当前的Shell生存期的脚本中使用。例如本地变量OLDBOY取值为bingbing这个值在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出本地变量值将无效 普通变量的定义 变量名value //解释变量名 变量名value //不解释变量名 变量名value //解释变量名 定义普通变量实践 [rootmico ~]# a1 [rootmico ~]# b2 [rootmico ~]# c3 [rootmico ~]# echo $a 1 [rootmico ~]# echo $b 2 [rootmico ~]# echo ${c} 提示$变量名表示输出变量可以用$c和${c}两种用法 【小结】连续普通字符串内容赋值给变量不管用什么引号或者不用引号它的内容是什么打印变量就输出什么 export命令 [rootmico ~]# help export export: export [-fn] [名称[值] ...] 或 export -p 为 shell 变量设定导出属性。 标记每个 NAME 名称为自动导出到后续命令执行的环境。如果提供了 VALUE 则导出前将 VALUE 作为赋值。 export命令的说明 当前shell窗口及子shell窗口生效在新开的shell窗口不会生效生效需要写入配置文件定义变量 [rootmico scripts]# CSLNmico [rootmico scripts]# export CSLN11 # 当前窗口查看 [rootmico scripts]# echo $CSLN mico [rootmico scripts]# echo $CSLN1 1 # 编写测试脚本 [rootmico scripts]# vim quanju.sh #!/bin/bash echo $CSLN echo $CSLN1 # 使用sh执行 [rootmico scripts]# sh quanju.sh 1 # 使用source 执行 [rootmico scripts]# source quanju.sh mico 1 环境变量相关配置文件 /etc/proflie/etc/bashrc~/.bashrc~/.bash_profile/etc/proflie.d/ # 目录四文件读取顺序CentOS6和7都一样 ① /etc/profile ② ~/.bash_profile ③ ~/.bashrc ④ /etc/bashrc 系统运行Shell的三种方式 1 通过系统用户登陆后默认运行的shell 2 非登录交互式运行Shell 3 执行脚本运行非交互式Shell 文件读取过程示意图 验证四文件读取顺序的方法 sed -i 1a echo $(date %T-%s) /etc/profile1 /tmp/mico /etc/profile sed -i $a echo $(date %T-%s) /etc/profile2 /tmp/mico /etc/profile sed -i 1a echo $(date %T-%s) /etc/bashrc1 /tmp/mico /etc/bashrc sed -i $a echo $(date %T-%s) /etc/bashrc2 /tmp/mico /etc/bashrc sed -i 1a echo $(date %T-%s) ~/.bashrc1 /tmp/mico ~/.bashrc sed -i $a echo $(date %T-%s) ~/.bashrc2 /tmp/mico ~/.bashrc sed -i 1a echo $(date %T-%s) ~/.bash_profile1 /tmp/mico ~/.bash_profile sed -i $a echo $(date %T-%s) ~/.bash_profile2 /tmp/mico ~/.bash_profile 环境变量的知识小结 变量名通常要大写。变量可以在自身的Shell及子Shell中使用。常用export来定义环境变量。执行env默认可以显示所有的环境变量名称及对应的值。输出时用“$变量名”取消时用“unset变量名”。书写crond定时任务时要注意脚本要用到的环境变量最好先在所执行的Shell脚本中重新定义。如果希望环境变量永久生效则可以将其放在用户环境变量文件或全局环境变量文件里。环境变量 环境变量一般是指用export内置命令导出的变量用户定义shell的运行环境。保证shell命令的正确执行。Shell通过环境变量来确定登录用户名、命令路径、终端类型、登录目录等。如果需要永久保存环境变量可在用户家目录下的.bash_profile或.bashrc非用户登录模式特有例如远程登录SSH)文件中或者全局配置/etc/bashrc(非用户登录模式特有如远程SSH或/etc/profile文件中定义。在将环境变量放入上述的文件之后每次用户登录时这些变量将被初始化。 查看设置的变量:set、env、declare set:输出所有的变量包括全局变量和局部变量。set -o 显示bash Shell的所有参数配置信息env:只显示全局变量declare:输出所有的变量、函数、整数和已经导出的变量变量中引号的使用 只有在变量的值中有空格的时候会使用引号。单引号与双引号的区别在于是否能够解析特殊符号。[rootmico ~]# namevicodona [rootmico ~]# name2mico [rootmico ~]# name3you are my heart [rootmico ~]# echo $name vicodona [rootmico ~]# echo $name2 mico [rootmico ~]# echo $name3 you are my heart [rootmico ~]# name4mi co [rootmico ~]# echo $name4 mi co [rootmico ~]# name5mi co [rootmico ~]# echo $name5 mi co [rootmico ~]# name6mico $PWD [rootmico ~]# echo $name6 mico /root [rootmico ~]# name6mi co $PWD [rootmico ~]# echo $name6 mi co $PWD [rootmico ~]# name7mico $PWD [rootmico ~]# echo $name7 mico /root 普通变量的要求 内容是纯数字、简单的连续字符内容中不带任何空格时定义时可以不加任何引号例如a.MicoAge22 b.NETWORKINGyes 没有特殊情况时字符串一律用双引号定义赋值特别是多个字符串中间有空格时例如a.NFSD_MODULEno load b.MyNameOldboy is a handsome boy. 当变量里的内容需要原样输出时要用单引号M这样的需求极少例如a.OLDBOY_NAMEOLDBOY 变量使用反引号赋值 [rootmico scripts]# timedate [rootmico scripts]# echo $time 2017年 12月 05日 星期二 09:02:06 CST[rootmico scripts]# filels [rootmico scripts]# echo $file mico_test.sh panduan.sh quanju.sh yhk.sh 使用${} 打印变量的时候防止出现“金庸新著”的问题 [rootmico ~]# timedate [rootmico ~]# echo $time 2019年 07月 18日 星期四 17:47:23 CST [rootmico ~]# echo ${time}_day 2019年 07月 18日 星期四 17:47:23 CST_day [rootmico ~]# echo $time-day 2019年 07月 18日 星期四 17:47:23 CST-day 编写脚本测试${} # 使用脚本测试[rootmico ~]# vim variable.sh #!/bin/bashtimedateecho $timedayecho ${time}day[rootmico ~]# sh variable.sh 2019年 07月 18日 星期四 17:49:51 CSTday名称解释单引号所见即所得即输出时会将单引号内的所有内容都原样输出或者描述为单引号里面看到的是什么就会输出什么这称为强引用双引号默认输出双引号内的所有内容如果内容中有命令、变量、特殊字符等会先把变量、命令、转义字符解析出结果然后再输出最终内容推荐使用称为弱引用无引号赋值时如果变量内容中有空格则会造成赋值不完整。而在输出内容时会将含有空格的字符串视为一个整体来输出如果内容中有命令、变量等则会先把变量、命令解析出结果然后输出最终内容如果字符串中带有空格等特殊字符则有可能无法完整的输出因此需要改加双引号反引号一般用于引用命令执行的时候命令会被执行相当于$()赋值和输出都要用命令引起来定义变量名技巧 变量名只能为字母、数字或下划线只能以字母或下划线开头。变量名的定义要有一定的规范并且要见名知意。示例 MicoAge22 #每个单词的首字母大写的写法 mico_age22 #单词之间用_的写法 micoAgeSexman #驼峰语法首个单词的首字母小写其余单词首字母大写 MICOAGE22 #单词全大写的写法 一般的变量定义、赋值常用双引号简单连续的字符串可以不加引号希望原样输出时使用单引号。希望变量的内容是命令的解析结果时要用反引号或者用$()把命令括起来再赋值。特殊变量 位置变量 常用的特殊位置参数说明 位置变量作用说明$0获取当前执行的shell脚本的文件名如果执行脚本带路径那么就包括脚本路径。$n获取当前执行的shell脚本的第n个参数值n1..9当n为0时表示脚本的文件名如果n大于9用大括号括起来{10}参数以空格隔开。$#获取当前执行的shell脚本后面接的参数的总个数$*获取当前shell的所有传参的参数不加引号同$;如果给$加上双引号例如: “$”,则表示将所有的参数视为单个字符串相当于“112$3”。$获取当前shell的所有传参的参数不加引号同$*;如果给$加上双引号例如: “$”,则表示将所有参数视为不同的独立字符串相当于“$1” “$2” “$3” “……”这是将参数传递给其他程序的最佳方式因为他会保留所有内嵌在每个参数里的任何空白。当$*和$ 都加双引号时两者有区别都不加双引号时两者无区别。 举例说 脚本名称叫 test.sh 入参三个: 1 2 3 运行 test.sh 1 2 3后 $* 为 1 2 3一起被引号包住 $ 为 1 2 3分别被包住 参数实践 [rootmico ~]# vim parameter.sh #!/bin/bashecho $0 echo 第一个参数 $1 echo 第二个参数 $2 echo 第11个参数 ${11}[rootmico ~]# sh parameter.sh parameter.sh 第一个参数 第二个参数 第11个参数 [rootmico ~]# [rootmico ~]# sh parameter.sh 1 2 3 4 5 6 7 8 9 10 11 parameter.sh 第一个参数 1 第二个参数 2 第11个参数 11 [rootmico ~]# $# 参数实践 [rootmico ~]# cat parameter.sh #!/bin/bash ############################################################## # File Name: parameter.sh # Version: V1.0 # Author: mico # Created Time : 2019-07-18 17:50:45 # Description: ############################################################## echo $0 echo 第一个参数 $1 echo 第二个参数 $2 echo 第10个参数 ${10} echo 第11个参数 ${11} echo 参数个数 $#[rootmico ~]# sh parameter.sh 1 2 3 4 5 6 7 8 9 10 11 parameter.sh 第一个参数 1 第二个参数 2 第10个参数 10 第11个参数 11 参数个数 11$* 参数实践 [rootmico ~]# vim parameter.sh#!/bin/bash ############################################################## # File Name: parameter.sh # Version: V1.0 # Author: mico # Created Time : 2019-07-18 17:50:45 # Description: ############################################################## echo $0 echo 第一个参数 $1 echo 第二个参数 $2 echo 第10个参数 ${10} echo 第11个参数 ${11} echo 参数个数 $# echo 参数$* [rootmico ~]# sh parameter.sh 1 2 3 4 5 6 7 8 9 10 11 parameter.sh 第一个参数 1 第二个参数 2 第10个参数 10 第11个参数 11 参数个数 11 参数1 2 3 4 5 6 7 8 9 10 11 $* 与$ 对比实践 [rootmico scripts]# set -- I am handsome boy.. [rootmico scripts]# echo $1 I am [rootmico scripts]# echo $2 handsome [rootmico scripts]# echo $3 boy.. [rootmico scripts]# echo $* I am handsome boy.. [rootmico scripts]# echo $ I am handsome boy..[rootmico scripts]# for i in $*;do echo $i ;done I am handsome boy.. [rootmico scripts]# for i in $;do echo $i ;done I am handsome boy.. [rootmico scripts]# for i in $;do echo $i ;done I am handsome boy.. [rootmico scripts]# for i in $*;do echo $i ;done I am handsome boy.. 进程状态变量 Shell进程的特殊状态变量说明 位置变量作用说明$?获取执行上一个指令的执行状态返回值0为成功非零为失败)这个变量最常用$$获取当前执行的Shell脚本的进程号PID)这个变量不常用了解即可$!获取上一个在后台工作的进程的进程号PID)这个变量不常用了解即可$_获取在此之前执行的命令或脚本的最后一个参数这个变量不常用了解即可进程参数实践 [rootmico scripts]# echo $? 0 [rootmico scripts]# echo $$ 1368 [rootmico scripts]# echo $![rootmico scripts]# echo $_ Echo Bash Shell常见的内部命令echo、eval、exec、export、read、shift echo参数说明 参数参数说明-n不要追加换行-e启用下列反斜杠转义的解释-E显式地抑制对于反斜杠转义的解释echo 对下列反斜杠字符进行转义 \n换行 \r回车 \t横向制表符 \b退格 \v纵向制表符 \c抑制更多的输出 定义变量的方式 三种定义变量的方式 直接赋值传参 (传递参数)交互式设置变量使用read命read命令说明 在命令行中使用 [rootmico scripts]# read 132 [rootmico scripts]# echo $REPLY 132 [rootmico scripts]# read mico 456 [rootmico scripts]# echo $mico 456 [rootmico scripts]# echo $REPLY 132 在脚本中使用 [rootmico scripts]# vim mico_test.sh #!/bin/bash read -p 请输入: micoecho $mico 执行结果 [rootmico scripts]# sh mico_test.sh 请输入:mico_znix mico_znix read 命令的帮助说明 [rootmico scripts]# read --help -bash: read: --: 无效选项 read: 用法:read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-N 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [-s不显示终端的任何输入] [名称 ...] 定义方法实践 直接赋值方法 [rootmico ~]# cat parameter.sh #!/bin/bash ############################################################## # File Name: parameter.sh # Version: V1.0 # Author: mico # Created Time : 2019-07-18 17:50:45 # Description: ############################################################## nameMICO age18 sexgirl hobbyls ethFile/etc/sysconfig/network-scripts/ifcfg-eth0echo $hobby ls $ethFile [rootmico ~]# sh parameter.sh default.pass Django-Blog Django-Blog.tar parameter.sh practices scripts server test.sh variable.sh /etc/sysconfig/network-scripts/ifcfg-eth0 交互式设置变量 read [rootmico ~]# vim keyword.sh #!/bin/bash ############################################################## # File Name: keyword.sh # Version: V1.0 # Author: mico # Created Time : 2019-07-18 18:42:31 # Description: ############################################################## read -p 请输入您的学号 number read -s -p 请输入姓名 name echo echo 您的学号$number echo 您的姓名$name [rootmico ~]# sh keyword.sh 请输入您的学号20190729 请输入姓名 您的学号20190729 您的姓名youka 写一个交互脚本实现能够定义主机名及IP地址 脚本内容↓ [rootmico ~]# cat keyword.sh #!/bin/bash ############################################################## # File Name: keyword.sh # Version: V1.0 # Author: mico # Created Time : 2019-07-18 18:42:31 # Description: ############################################################## read -p 请输入您的学号 number read -s -p 请输入姓名 name echo echo 您的学号$number echo 您的姓名$name[rootmico ~]# vim host_start.sh [rootmico ~]# sh host_start.sh 请输入主机名:mico 请输入IP地址的主机位:180 是否重启服务器:{yes/no}no 请稍后手动重启系统 变量的子串 变量子串说明 表达式说明${parameter}返回变量$parameter的内容${#parameter}返回变内容的长度按字符)也适用于特殊变量${parameter:offset}在变量${parameter}中从位置offset之后开始提取子串到结尾${parameter:offset:length}在变量${parameter}中从位置offset之后开始提取长度为length的子串${parameter#word}从变量${parameter}开头开始删除最短匹配的word子串${parameter##word}从变量${parameter}开头开始删除最长匹配的word子串${parameter%word}从变量${parameter}结尾开始删除最短匹配的word子串${parameter%%word}从变量${parameter}结尾开始删除最长匹配的word子串${parameter/pattem/string}使用string代替第一个匹配的pattern${parameter//pattem/string}使用string代替所有匹配的pattern计算变赋值的长度 echo $(#Mico) :这种方式最快echo $Mico|wc -Lexpr length $Micoecho $Mico|awk {print length($0)}[rootmico ~]# export TEMPHere is Linux [rootmico ~]# echo ${#TEMP} 13 [rootmico ~]# echo $TEMP|wc -L 13 [rootmico ~]# expr length $TEMP 13 [rootmico ~]# echo $TEMP Here is Linux [rootmico ~]# echo $TEMP|awk {print length($0)} 13 [rootmico ~]# time echo ${#TEMP} 13real 0m0.000s user 0m0.000s sys 0m0.000s [rootmico ~]# time echo $TEMP|wc -L 13real 0m0.002s user 0m0.000s sys 0m0.002s [rootmico ~]# 截取变量中的字符 [rootmico scripts]# micoabcABC123ABCabc [rootmico scripts]# echo ${mico#abc} ABC123ABCabc [rootmico scripts]# echo ${mico##abc} ABC123ABCabc [rootmico scripts]# echo ${mico%abc} abcABC123ABC [rootmico scripts]# echo ${mico%%abc} abcABC123ABC [rootmico scripts]# echo ${mico#a*c} ABC123ABCabc [rootmico scripts]# echo ${mico##a*c}[rootmico scripts]# echo ${mico%a*c} abcABC123ABC [rootmico scripts]# echo ${mico%%a*c}[rootmico scripts]# echo ${mico#a*C} 123ABCabc [rootmico scripts]# echo ${mico#a*C} 123ABCabc [rootmico scripts]# echo ${mico##a*C} abc [rootmico scripts]# echo ${mico%a*c} abcABC123ABC [rootmico scripts]# echo ${mico%A*c} abcABC123 [rootmico scripts]# echo ${mico%%A*c} abc 替换变量内容 [rootmico scripts]# echo $mico abcABC123ABCabc [rootmico scripts]# echo ${mico/abc/mico} micoABC123ABCabc [rootmico scripts]# echo ${mico//abc/mico} micoABC123ABCmico echo $(#parameter)处理最快的原因是一般情况下调用外部命令来处理的方式与使用内置操作的速度相差较大。在Shell编程中应该尽量使用内置命令。 有关获取字符串长度的几种统计方法的性能比较 变量自带的计算长度的方法效率最高在要求效率的场景中尽量多用使用管道统计的方法的效率都比较差在要求效率的场景中尽量不用对于日常简单的脚本计算可以根据自己所擅长的或易用的程度去选择有关上述匹配删除的小结 #表示从幵头删除匹配最短。 ##表示从开头删除匹配最长。%表示从结尾删除匹配最短。%%表示从结尾删除匹配最长。a*c表示匹配的突符串*表示匹配所有a*c 匹配开头为 a、中间为任意多个字符、结尾为c的字符串。a*C表示匹配的字符串*表示匹配所有a*C 匹配开头为 a、中间为任意多个字符、结尾为C的字符串。有关替换的小结 一个“/”表示替换匹配的第-个字符串。两个“/”表示替换匹配的所有字符串。Shell的特殊扩展变量说明 表达式说明${parameter:-word}如果parameter的变量值为空或未赋值则会返回word字符串并替代变量的值用途.如果变量未定义则返回备用的值防止变量为空值或因未定义而导致异常${parameter:word}如果parameter的变量值为空或未赋值则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用用途基本同上一个${parameterword}但该变量又额外给parameter变量赋值了${parameter:?word}如果parameter变量值为空或未赋值那么word字符串将被作为标准错误输出否则输出变量的值。用途用于捕捉由于变量未定义而导致的错误并退出程序${parameter:word}如果parameter变量值为空或未赋值则什么都不做否则word字符串将替代变量的值变量的数值计算 Shell中常见的算术运算符号 运算符意义 顺序 - -增加及减少可前置/可结尾由左至右一元正号由右至左-一元负号由右手至左逻辑与由右手至左~位的取反由右手至左* / %乘法、除法、取余数由左至右加法由左至右-减法由左至右 向左位移、向右位移由左至右 比较运算符由左至右 !相等 不相等由左至右位的AND由左至右^位的Exclusive OR由左至右|位的OR由左至右逻辑AND由左至右||逻辑OR由左至右?:条件表达式由右至左 - * / % ^赋值运算符Shell中常见的算术运算命令 运算操作符与运算命令意义(())用于整数运算的常用运算符效率高let用于整数运算类似于(())expr可用于整数运算但还有很多其他的额外功能bcLinux下的一个计算器程序适合整数以及小数运算$[]用于整数的运算awkawk既可以用于整数运算也可以用于小数运算declare定义变量值和属性-i参数可以用于定义整形变量做运算双小括号(())的操作方法 运算操作符与运算命令意义((ii1))此种书写方法为运算后赋值法即将i1的运算结构赋值给变量i。注意不能用echo((ii1))的形式输出表达式的值但可以用echo$((ii1))输出其值i$((i1))可以在(())前加$符表示将表达式运算后复制给i((8755))可以进行比较操作还可以加入逻辑与和逻辑或用于条件判断echo $((21))需要直接输出运算表达式的运算结果时可以在(())前加$符【提示】上面涉及的数字及变量必须为整数整型不能是小数浮点数或字符串。后面的bc和awk命令可以用于进行小数浮点数运算但一般用到的较少。 仅支持整数的运算 echo $((数学运算表达式)) # 形式一 [rootmico scripts]# echo $((1 1)) 2 [rootmico scripts]# echo $((2*7-3/65)) 19 # 形式二 [rootmico scripts]# ((mico2*8)) [rootmico scripts]# echo $mico 16 # 形式三 [rootmico scripts]# znix$((2*7-3/65)) [rootmico scripts]# echo $znix 19 延伸产物(重要) i 自增1i-- 自减1i--i示例 [rootmico scripts]# i1 [rootmico scripts]# echo $((i)) 1 [rootmico scripts]# echo $((i)) 2 [rootmico scripts]# echo $((i--)) 3 [rootmico scripts]# echo $((i--)) 2 [rootmico scripts]# echo $((i--)) 1 [rootmico scripts]# echo $((i)) 1 [rootmico scripts]# echo $((i)) 2 [rootmico scripts]# echo $((i)) 3 [rootmico scripts]# echo $((--i)) 2 [rootmico scripts]# echo $((--i)) 1 [rootmico scripts]# echo $((--i)) 0 记忆方法-- 变量a在前表达式的值为a然后a自增或自减变量a在符号后表达式值自增或自减然后a值自增或自减。 let命令 [rootmico scripts]# i1 [rootmico scripts]# ii1 [rootmico scripts]# echo $i i1[rootmico scripts]# i1 [rootmico scripts]# let ii1 [rootmico scripts]# echo $i 2 expr 命令 整数计算判断扩展名判断输入是否为整数非整数返回值为2计算变量的长度示例 [rootmico scripts]# expr 11 11 [rootmico scripts]# expr 1 1 2 [rootmico scripts]# expr 1 * 1 expr: 语法错误 [rootmico scripts]# expr 1 \* 1 1 非整数返回值为2 示例 [rootmico scripts]# expr 1 1 2 [rootmico scripts]# echo $? 0 [rootmico scripts]# expr -1 1 0 [rootmico scripts]# echo $? 1 [rootmico scripts]# expr a 1 expr: 非整数参数 [rootmico scripts]# echo $? 2 $[]运算符 [rootmico scripts]# echo $[12] 3 [rootmico scripts]# echo $[1-2] -1 [rootmico scripts]# echo $[1*2] 2 [rootmico scripts]# echo $[1/2] 0 typeset 命令进行运算 [rootmico scripts]# typeset -i A2017 B2018 [rootmico scripts]# AAB [rootmico scripts]# echo $A 4035 可以进行小数运算的命令 bc 命令 # 安装 bc 依赖于base源 [rootmico scripts]# yum -y install bc交互模式测试bc命令 [rootmico scripts]# bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. 11 2 [rootmico scripts]# echo 11.1|bc 2.1 免交互模式测试bc命令 [rootmico scripts]# echo scale6;1/3|bc .333333 python 命令 [rootmico scripts]# file which yum /usr/bin/yum: Python script, ASCII text executable [rootmico scripts]# python import osos.system(df -h)11.1 2.1 exit() awk 命令 [rootmico ~]# echo 7.7 3.8|awk {print ($1-$2)} 3.9 [rootmico ~]# echo 358 113|awk {print ($1-3)/$2} 3.14159 [rootmico ~]# echo 3 9|awk {print ($13)*$2} 54 [rootbackup scripts]# awk BEGIN{print 1.23.3} 4.5 运算相关练习题 【练习题】实现一个加减乘除等功能的计算器 实现脚本 [rootmico scripts]# cat calculator.sh #!/bin/bashread -p 请输入第一个整数: a read -p 请输入第二个整数: becho $a $b $(($a$b)) echo $a - $b $(($a-$b)) echo $a \* $b $(($a*$b)) echo $a / $b $(($a/$b))脚本执行过程 [rootmico scripts]# sh calculator.sh 请输入第一个整数:12 请输入第二个整数:12 12 12 24 12 - 12 0 12 * 12 144 12 / 12 1 精简方法 [rootmico scripts]# vim calculator2.sh #!/bin/bashecho $(($1))脚本执行过程 [rootmico scripts]# sh calculator2.sh 11 2 [rootmico scripts]# sh calculator.sh 1*9 9 【练习题】打印结果1234567891055 脚本内容 [rootmico scripts]# vim count.sh #!/bin/bashNumseq -s 1 10 echo $Num$(($Num)) 脚本执行结果 [rootmico scripts]# sh count.sh 1234567891055 补充说明 shell脚本中批量注释的方法EOF 文件内容EOF 或使用 exit 可以注释其之后的所有内容(类似注释实质为不执行后面的内容) 转载于:https://www.cnblogs.com/vicodona/p/11200117.html
http://www.zqtcl.cn/news/982360/

相关文章:

  • 怎样创建网站快捷方式个人制作一个网站的费用
  • 恒信在线做彩票的是什么样的网站软件开发流程管理
  • 网站服务器地址在哪里看艺术学校网站模板
  • 郑州中心站网站建设价格标准新闻
  • 电子商务网站管理互联网营销师主要做什么
  • 门户网站指的是什么凯里网络公司建设网站
  • 网站接入服务商查询0建设营销型网站步骤
  • 长沙如何做百度的网站小型网站建设实训教程
  • 昆明网络公司网站网站建设经费请示
  • 手机端网站欣赏wordpress 文章rss
  • 做网站一定要实名认证吗国外免费空间网站申请
  • 阿里云网站空间主机长春网站建设设计
  • 龙华网站建设yihekj长沙招聘网站制作
  • 网站怎么做文本跳出来网络规划设计师有用吗
  • 室内设计网站官网大全中国那些企业做网站做得好
  • 状态管理名词解释网站开发网络营销推广方案案例
  • 做网站需要几大模板河南中国建设信息网
  • 成都温江网站建设空间网页版
  • 做美股的数据网站邢台网站建设公司哪家好一点
  • 青岛即墨网站开发查询建设用地规划许可证在哪个网站
  • 成都APP,微网站开发芜湖企业100强
  • 江门搜索引擎网站推广网约车多少钱一辆
  • 北京高端网站建设宣传请人做软件开发的网站
  • h网站建设长沙本地公众号
  • 苏州工业园区劳动局网站做不了合同建域名做网站
  • 内蒙古建设兵团网站组建网站开发团队
  • 劳务派遣做网站的好处广州最新新闻事件
  • 海兴网站建设公司网站建设原则
  • 网站建设完不管了自己怎么接手wordpress个人主页
  • 具有品牌的网站建设霞浦建设局网站