wordpress网站很卡,网站运营小白可以做吗,xp系统中做网站服务器,平面构成创意与设计本文目录1.什么是Shell#xff1f;2.脚本语言类型3.其他常用的脚本语句种类4.Shell脚本的建立和执行5.Shell 变量类型6.普通变量7.Shell 特殊重要变量8.Shell进程状态变量9.Parameter Expansion10.扩展#xff1a;其他变量的替换11.变量的数值#xff08;整数#xff09;计…本文目录1.什么是Shell2.脚本语言类型3.其他常用的脚本语句种类4.Shell脚本的建立和执行5.Shell 变量类型6.普通变量7.Shell 特殊重要变量8.Shell进程状态变量9.Parameter Expansion10.扩展其他变量的替换11.变量的数值整数计算↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑1.什么是Shell
Shell是一个命令解释器它在操作系统的最外层负载直接与用户对话把用户的输入解释给操作系统并处理各种各样的操作系统的输出结果输出到屏幕并返回给用户。这种对话方式可以是交互的方式从键盘输入命令可以立即得到shell的回应或非交互式执行脚本程序的方式。图解当linux命令或语句不在命令行下执行严格说命令行执行的语句也是shell脚本而是通过一个程序文件执行时该程序就被称为shell脚本或shell程序shell程序很类似DOS系统下的批处理程序。这些命令、变量和流程控制语句结合起来就形成了一个功能强大的shell脚本。简单的小脚本 #!/bin/bash# 清除日志脚本, 版本 2LOG_DIR/var/logROOT_UID0 # $UID为0的时候,用户才具有root用户的权限
# 要使用root用户来运行因此对当前用户进行判断不合要求给出友好提示并终止程序运行。if[$UID-ne $ROOT_UID]
thenecho Must be root to run this script.exit 1fi
# 如果切换到指定目录不成功给出提示并终止程序运行。
cd $LOG_DIR ||{echo Cannot change to necessary directory.2exit 1}
# 经过上述两个判断后此处的用户权限和路径就应该是对的了只有清空成功才打印成功提示。cat /dev/null messages {
echo Logs cleaned up.exit 0 # 退出之前返回0表示成功. 返回1表示失败。
}
echo Logs cleaned up fail.exit 11.必须是root才能执行脚本否则给出友好提示并终止程序运行 2.成功切换目录cd/var/log否则给出友好提示并终止运行 3.清理日志cat /dev/null messages清理成功给出正确提示 4.给出相应提示echo 输出 Shell脚本语言擅长处理纯文本类型的数据而linux系统中几乎所有的配置文件、日志文件如nfs、rsync、httpd、nginx、lvs等、绝大多数启动文件纯文件。就可以利用它在Linux系统中发挥巨大的作用。2.脚本语言类型
2.1 Shell脚本语言的种类
在UNIX/LINUX中主要由两大类shell1.Bourne shell包括sh、ksh、bashBourne shell (sh)
Korn shell (ksh)
Bourne Again shell (bash)
POSIX shell (sh)2. Cshell (包括csh、tcsh) C shell (csh)
TENEX/TOPS C shell (tcsh)Shell脚本语言是弱类型语言较为通用的shell有标准的Bourne shell (sh)和C shell csh。其中Bourne shell (sh)已经被bash shell取代但是我们还是习惯称之为sh。 查看Centos6 系统SHELL情况[rootweb02 ~]# cat /etc/shells
/bin/sh 黄色标记为重点
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/cshLinux系统中的主流shell是Bash它是Bourne Again Shell的缩写Bash是由Bourne Shellsh发展而来的但Bash与sh稍有不同它还包含了csh和ksh的特色但大多数脚本可以不加修改地在sh上运行 3.其他常用的脚本语句种类
3.1 PHP PHP是网页程序也是脚本语言。是一款更专注于web页面开发前端展示的脚本语言例如Dedecms,discuz。PHP程序也可以处理系统日志配置文件等php也可以调用系统命令。 3.2 Perl Perl脚本语言。比shell脚本强大很多语法灵活、复杂实现方式很多不易读团队协作困难但仍不失为很好的脚本语言存世大量的程序软件。MHA高可用Perl写的 3.3 Python 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 1.Linux是Bourne Again shellbash 2.Solaris和FreeBSD缺省的是Bourne shellsh 3.AIX下是Korn Shellksh 4.HP-UX缺省的是POSIX shellsh 提示比较常用和充电的是Bourne Again shellbash 查看Centos默认bash [rootdb01 ~]# echo $SHELL
/bin/bash
[rootdb01 ~]# echo shell
shell
[rootdb01 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash修改创建用户默认配置文件路径 [rootdb01 ~]# cat /etc/default/useradd
# useradd defaults file
GROUP100
HOME/home
INACTIVE-1
EXPIRE
SHELL/bin/bash
SKEL/etc/skel
CREATE_MAIL_SPOOLyesShell脚本的建立和执行 1.1 shell脚本的建立
在Linux系统中shell脚本bash shell程序通常是在编辑器vi/vim中编写由Unix/Linux命令、bash shell命令、程序结构控制语句和注释等内容组成。 vi 记事本 vim 编辑器emeditor、editplus notepad 我们可以制作一个vivim的别名
[rootdb01 ~]# alias vivim
[rootdb01 ~]# vim /etc/profile
export alias vivim
[rootdb01 ~]#./etc/profile1.2 脚本开头第一行 一个规范的shell脚本在脚本第一行会指出由那个程序解释器来执行脚本中的内容这一行内容在linux bash编程中一般为#/bin/bash
or
#/bin/sh 255字符以内其中开头的”#!”字符又称为幻数在执行bash脚本的时候内核会根据”#!”后的解释器来确定该用那个程序解释这个脚本中的内容。注意这一行必须在每个脚本顶端的第一行如果不是第一行则为脚本注释行。 [rootweb02 tmp]# cat 1.sh
#!/bin/bash
echo 123
#!/bin/sh 代表注释
echo 456sh和bash的区别 早期的Bash与sh稍有不同它还包含了csh和ksh的特色但大多数脚本都可以不加修改地在sh上运行[rootweb02 /]# ll /bin/sh
lrwxrwxrwx.1 root root 4May 104:26/bin/sh - bash
[rootweb02 /]# ll /bin/bash
-rwxr-xr-x 1 root root 941720Jul24 2015/bin/bash企业面试题案例一Centos Linux系统默认的shell是 解答bash 查看方法1 [rootweb02 ~]# echo $shell
bash
[rootweb02 ~]# echo $SHELL
/bin/bash 查看方法2 [rootweb02 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
提示结尾的/bin/bash就是shell解释器 1.3 脚本注释
在shell脚本中跟在#井号后面的内容表示注释用来对脚本进行注释说明注释部分不会被当做程序执行仅仅给用户看系统解析器是看不到更不会执行。 特别提示注释尽量不使用中文1.4 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 或. script-name #注意”.”点号和后面字符之间有空格。 4.sh script-name 或 cat script-name|sh同样适合bash 全路径执行如果不加命令全路径会没有权限 /server/scripts/abc.sh 权限不够
/bin/sh /server/scripts/abc.sh 可以执行 提示: 第三种方法通常是使用source或者”.”点号读入或加载指定的shell脚本文件如san.sh然后依次执行指定shell脚本文件san.sh 中的所有语句。这些语句将作为当前父shell脚本运行。 source或者”.”点号命令的功能是在当前shell中执行source或者”.”点号加载并执行相关脚本文件中的命令以及语句而不是产生一个字shell来执行命令文件中的命令。 脚本里面的内容是无法和外面的变量沟通但是外面的变量在脚本里面是可以引用的。 如果想在脚本里面的变量引用到命令行需要使用source or . Shell 变量类型
变量可以分为两类环境变量全局变量和普通变量局部变量。环境变量也可称为全局变量可以在创建他们的Shell及其派生出来的任意子进程shell中使用环境变量又可分为自定义环境变量和Bash内置的环境变量 普通变量也可称为局部变量只能在创建他们的Shell函数或Shell脚本中使用。普通变量一般是由开发者用户开发脚本程序时创建的。 环境变量
环境变量一般用于定义Shell的运行环境保证Shell命令的正确执行Shell通过环境变量来确定登录用户、命令路径、终端类型、登录目录等所有的环境变量都是系统全局变量可用于所有子进程这包括编辑器Shell脚本和各类应用crond任务必须比较特殊环境变量可以在命令行中设置创建但用户退出命令行时这些变量值就会丢失因此如果希望永久保存环境变量可在用户家目录下的.bash_profile或.bashrc文件中或全局配置/etc/bashrc/或/etc/profile 文件或者/etc/profile.d中定义。将环境变量放入上述的文件中每次用户登录时这些变量值都将被初始化一次有一些环境变比如HOME、PATH、UID、USER等在用户登陆之前就已经被/bin/login 程序设置好了。通常环境变量定义保存在用户家目录下的.bash_profile文件或者全局的配置文件/etc/profile中。查看系统变量env命令也可以使用set 显示的没有env变量多[rootwww ~]# env
HOSTNAMEwww
TERMlinux
SHELL/bin/bash
HISTSIZE1000
SSH_CLIENT125.34.74.615169622
SSH_TTY/dev/pts/0
USERroot
LS_COLORSrs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40;33;01:cd40;33;01:or40;31;01:mi01;05;37;41:su37;41:sg30;43:ca30;41:tw30;42:ow34;42:st37;44:ex01;32:*.tar01;31:*.tgz01;31:*.arj01;31:*.taz01;31:*.lzh01;31:*.lzma01;31:*.tlz01;31:*.txz01;31:*.zip01;31:*.z01;31:*.Z01;31:*.dz01;31:*.gz01;31:*.lz01;31:*.xz01;31:*.bz201;31:*.tbz01;31:*.tbz201;31:*.bz01;31:*.tz01;31:*.deb01;31:*.rpm01;31:*.jar01;31:*.rar01;31:*.ace01;31:*.zoo01;31:*.cpio01;31:*.7z01;31:*.rz01;31:*.jpg01;35:*.jpeg01;35:*.gif01;35:*.bmp01;35:*.pbm01;35:*.pgm01;35:*.ppm01;35:*.tga01;35:*.xbm01;35:*.xpm01;35:*.tif01;35:*.tiff01;35:*.png01;35:*.svg01;35:*.svgz01;35:*.mng01;35:*.pcx01;35:*.mov01;35:*.mpg01;35:*.mpeg01;35:*.m2v01;35:*.mkv01;35:*.ogm01;35:*.mp401;35:*.m4v01;35:*.mp4v01;35:*.vob01;35:*.qt01;35:*.nuv01;35:*.wmv01;35:*.asf01;35:*.rm01;35:*.rmvb01;35:*.flc01;35:*.avi01;35:*.fli01;35:*.flv01;35:*.gl01;35:*.dl01;35:*.xcf01;35:*.xwd01;35:*.yuv01;35:*.cgm01;35:*.emf01;35:*.axv01;35:*.anx01;35:*.ogv01;35:*.ogx01;35:*.aac01;36:*.au01;36:*.flac01;36:*.mid01;36:*.midi01;36:*.mka01;36:*.mp301;36:*.mpc01;36:*.ogg01;36:*.ra01;36:*.wav01;36:*.axa01;36:*.oga01;36:*.spx01;36:*.xspf01;36:
MAIL/var/spool/mail/root
PATH/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
PWD/root
LANGen_US.UTF-8
HISTCONTROLignoredups
SHLVL1
HOME/root
LOGNAMEroot
CVS_RSHssh
SSH_CONNECTION125.34.74.6151696120.25.167.4222
LESSOPEN|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES1
_/bin/env 自定义环境变量 设置环境变量
如果想设置环境变量就要给在变量赋值之后或设置变量时使用export命令。带-x选项的declare内置命令也可完成同样的功能。格式1.export变量名value
2.变量名valueexport变量名
3.declare-x 变量名value
提示以上为三种设置环境变量的方法
例
export NAMEoldboy
declare -x NAMEoldboy
NAMEoldboyexport NAME 让环境变量永久生效的常用设置文件及区别 1、用户的变量变量配置[rootwww ~]# ls /root/.bashrc
/root/.bashrc
[rootwww ~]# ls /root/.bash_profile
/root/.bash_profile
提示用户的环境变量设置常见的为用户家目录下的.bashrc和.bash_profile2、全局环境变量的配置 全局环境的配置文件常见的配置文件为/etc/profile/etc/bashrc/etc/profile.d 需要登陆后初始化或显示加载内容可以把脚本文件放在/etc/profile.d下设置可执行即可 3、生产环境 自定义JAVA环境鞭炮配置实例环境变量知识小结1、变量名通常要大写 2、变量可以在自身的shell以及子shell中使用。 3、通过export来定义环境变量 4、输出用$变量名取消用unset变量名 5、书写定时任务要注意环境变量最好在执行的shell脚本中重新定义。 6、如果系统永久生效可以放在用户环境变量文件或全局环境变量文件里。 1.1 普通变量
1.1.1 定义本地变量
本地变量在用户当前的Shell生存期的脚本中使用。例如本地变量OLDBOY取值为bingbing这个值在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出本地变量值将无效1. 普通变量定义****变量名value #赋值时不加引号 变量名’value’ #赋值时加单引号 变量名”value” #赋值时加双引号 2.Shell中定义变量名及给变量内容赋值的要求变量名一般是由字母、数字、下划线组成可以字母或下划线开头abc,abc123,abc_123 变量的内容可以使用单引号或双引号引起来也可不加引号但是这三者是不同的。 3. 普通变量定义及输出的不同例子[rootweb02 ~]# a1
[rootweb02 ~]# b2
[rootweb02 ~]# c3
[rootweb02 ~]# echo $a
1
[rootweb02 ~]# echo $b
2
[rootweb02 ~]# echo ${c}
3 提示$变量名表示输出变量可以用$c和${c}两种用法 小结连续普通字符串内容赋值给变量不管用什么引号或者不用引号它的内容是什么打印变量就输出什么4.例子2[rootdb01 scripts]# a192.168.1.2
[rootdb01 scripts]# b192.168.1.2
[rootdb01 scripts]# c192.168.1.2
[rootdb01 scripts]# echo a$a
a192.168.1.2
[rootdb01 scripts]# echo b$b
b192.168.1.2
[rootdb01 scripts]# echo c${c}
c192.168.1.2[rootdb01 scripts]# a192.168.1.2-$a
[rootdb01 scripts]# b192.168.1.2-$a
[rootdb01 scripts]# c192.168.1.2-$a
[rootdb01 scripts]# echo a$a
a192.168.1.2-192.168.1.2
[rootdb01 scripts]# echo b$b
b192.168.1.2-$a
[rootdb01 scripts]# echo c${c}
c192.168.1.2-192.168.1.2-192.168.1.2 小结数字内容变量定义可不加引号其他没有特别要求的字符串等定义最好都加上双引号确实真的需要原因输出的的就加单引号。 1.2 把一个命令的结果作为变量的定义方法 获取命令结果的变量内容写法常见的有两种
变量名ls #命令用反引号引起来
变量名$(ls) #命令用$()括起来 自定义普通字符串变量 1内容是纯数字简单连续字符内容中不带任何空格此时定义方式可以不加任何引号 a.OldboyAge33
b.NETWORDyes (2)没特殊情况时字符串一律用双引号定义特别是多个字符串中间由空格时 a.NFS_MODULEno load
b.MyNameGood game (3)当变量里内容需要原样输出时要用单引号”这样的需求极少 a.HOST_NAME’OCALHOST’ 提示 1、变量名只能为字母、数字、下划线只能以字母或下划线开头 2、规范的命令名写法要见名如意。 1OldboyAge1 #每个单词的首字母大写
2oldboy_age1#单词之间用“_”
3oldboyAgeSex1#驼峰语法首个单词的首字母小写其余单词首字母大写
4OLDBOY1#单词全大写 1.3 变量定义的完整小结 1普通变量内容的定义: 1.连续的数字或字符串可以不加引号例如a1232.变量内容很多还希望解析变量就加双引号例如a”/etc/rc.local $USER”,会对内容中的USER解析输出3.希望原样输出就用单引号例如:a’$USER’2希望编译内容是命令得解析结果的定义1.反引号括起来例如als2.或者$()括起来例如a$(ls)3变量的输出方法使用$变量名输出变量内容常用echo $变量名1.4 变量定义的小结技巧 1、注意命令变量定义前后的字符“ 例如”CMDls” 2、在变量名前加$可以取得该变量的值使用echo或printf命令可以显示变量的值$A和${A}的写法不同但功能是一样的。 3、用echo等命令输出变量的时候也有单引号、双引号、反引号的形式。 4、$dbname_tname若变量后面有其他字符连接的时候就必须给变量加上大括号{} 例如$dbname_tname就要改写成${dbname}_tname 5、养成所有字符串变量用双引号括起来使用的习惯将会减少很多编程时遇到的问题。 有关shell变量定义及变量输出单引号、双引号不加引号的简要说明如下 名称 解释 单引号 所见即所得输出时会将单引号内的所有内容都原样输出。 双引号 把双引号内的所有内容输出出来如果内容中有命令要反引变量特殊字符等会先把变量、命令解析出来然后在输出最终内容来。 无引号 把内容输出出来会将含有空格的字符串视为一个整体输出 反引号 一般用于引用命令执行的时候命令会被执行相当于$() 1.5 特殊例子awk调用shell变量引号例子 [rootdb01 scripts]# ETT123
[rootdb01 scripts]# awk BEGIN {print $ETT}
$ETT
[rootdb01 scripts]# awk BEGIN {print $ETT}
123
[rootdb01 scripts]# awk BEGIN {print $ETT}
一道实用linux运维问题的9种shell解答方法http://oldboy.blog.51cto.com/2561410/760192 Shell 特殊重要变量 1.1 Shell特殊位置变量 $0 获取当前执行的shell脚本文件名如果执行脚本带路径那么久包括脚本路径。$n 获取当前执行的shell脚本的第n个参数值。如果n大于9需要用大括号括起来${10}$* 获取当前shell脚本的所有传参的参数将所有的字符视为单个字符相当于”$1$2$3$4″$# 获取当前执行的shell脚本后面接的参数的总个数$ 这个程序的所有参数 “$1” “$2” “#3″这是将参数传递给其他程序的最佳方式因为他会保留所有内嵌在每个参数里的任何空白”$”和”$*”都要加双引号提示$*和$了解即可 $*和$的区别例子1.$* 将命令行脚本所有参数视为单个字符串等同于”$1$2$3″”$*“ 要用双引号2.$将命令行脚本每个参数视为单独的字符串等同于”$1″ “$2” “$3″这是将参数传递给其他程序的最佳方式因为他会保留所有的内嵌在每个参数里的任何空白.[rootweb02 /]#for i in $*;do echo $i;done
##在有双引号的情况下$*参数里引号内容当做一个参数输出了
I am oldboy
[rootweb02 /]#for i in $do echo $i;done
##在有双引号的情况下每个参数以独立的内容输出。
I am
oldboy 其他linux下set和eval的使用小案例精彩解答特殊位置变量用法 http://oldboy.blog.51cto.com/2561410/1175971 范例1$n的实践例子[rootweb02 /]# cat p.sh
#!/bin/bash
echo $1
[rootweb02 /]# sh p.sh good #传一个字符串参数
good
[rootweb02 /]# sh p.sh good good #传2个字符串参数第二个不会接受$1只显示第一个
good
[rootweb02 /]# sh p.sh good good #加引号括起来表示为一个字符串参数
good good 测试 26的英文字符 [rootdb01 scripts]# cat q.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} $12 $13 $14 $15[rootdb01 scripts]# sh q.sh {a..z}a b c d e f g h i j k a2 a3 a4 a5 提示脚本里面的$1就是我们执行的第一个参数例如/etc/init.d/iptables stop 其中stop相当于$1 $0案例 [rootdb01 scripts]# cat q.sh
echo $Usage: $0 {start|stop}
[rootdb01 scripts]#/server/scripts/q.sh start
Usage:/server/scripts/q.sh {start|stop $1 脚本传参的第一个参数以此类推 $0 脚本的名字以及路径 $# 脚本传参的参数数量 例子$? $? 返回值 0 表示成功 [rootdb01 scripts]# cat q.sh
#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 1 ]
thenecho $Usage: $0 {start|stop}exit 1
fi
rsync --daemon
if [ $? -eq 0 ]
thenaction oldboy /bin/true
fi exit 1 脚本的返回值此处的exit 1 可以随便定义。如果定义为1 $?返回的值就是1 return 1 函数的返回值 Shell进程状态变量
$$ 获取当前shell脚本的进程号PID$! 执行上一个指令的PID$? 获取上一个指令的返回值0为成功非0为失败$_ 在此之前执行的命令或脚本的最后一个参数提示查找知道方法man bash然后搜索Special Parameters.范例2应用案例当系统中只能有某个脚本同时只能运行一个进程的时候。 [rootoldboy day2]# cat pid.sh
#!/bin/sh
pidpath/tmp/a.pid
if [ -f $pidpath ] then kill -USR2 cat $pidpath /dev/null 21rm -f $pidpath
fi
echo $$ $pidpath
sleep 300 bash内置命令没有路径二进制文件 alias
break
cd
continue
declare
echo
eval
exec
exit
export
help
history
jobs
kill
let
local
logout
printf
pwd
read
readonly
return
set
shift
times
trap
typeset
ulimit
umask
unalias
unset常用操作如下表man bash找本节资料“Parameter Expansion”${#string} 返回$string的长度 ${string:position} 在$string中从位置$position之后开始提取子串 ${string:position:length} 在$string中从位置$position之后开始提取长度为$length的子串 ${string#substring} 从变量$string开头开始删除最短匹配$substring子串 ${string##substring } 从变量$string开头开始删除最长匹配$substring子串 ${string%substring} 从变量$string结尾开始删除最短匹配$substring子串 ${string%%substring} 从变量$string结尾开始删除最长匹配$substring子串 ${parameter/pattern/string} 使用string来代替第一个匹配的pattern ${parameter/#pattern/string} 从开头匹配string变量中的pattern使用string来替换匹配的pettern ${parameter/%patter/string} 从结尾开始匹配string变量中的pattern就用string来替换匹配pattern ${parameter//pattern/string} 使用string来代替所有匹配的pattern 更多资料man bansh 查找“Parameter Expansion” 获取变量字符串的长度 [rootdb01 ~]# OLDBOYI am oldboy
[rootdb01 ~]# echo $OLDBOY
I am oldboy
[rootdb01 ~]# echo $OLDBOY|wc -L
11
[rootdb01 ~]# echo ${#OLDBOY}
11
[rootdb01 ~]# expr length $OLDBOY11截取OLDBOY变量字符串从第2个字符之后开始取默认取后面字符的全部第二个字符不包含在内。也可以理解为删除前面多少个字符。[rootweb02 /]# OLDBOYI am oldboy linux,welcome to our training.
[rootweb02 /]# echo $OLDBOY
I am oldboy linux,welcome to our training.
[rootweb02 /]# echo ${OLDBOY:2}
am oldboy linux,welcome to our training. 截取OLDBOY变量字符串从第二个字符之后开始取取2个字符 [rootweb02 /]# echo ${OLDBOY:2:2}
am
提示类似于cut -c参数
[rootweb02 /]# echo ${OLDBOY}|cut -c 1-4
I am
[rootweb02 /]# echo ${OLDBOY}|cut -c 3-4
am 从变量$OLDBOY开头删除最短匹配”a*C”子串 [rootweb02 /]# OLDBOYabcABC123ABCabc
[rootweb02 /]# echo ${OLDBOY#A*c}
abcABC123ABCabc
[rootweb02 /]# echo ${OLDBOY#a*c}
ABC123ABCabc
[rootweb02 /]# echo ${OLDBOY#a*C}
123ABCabc
[rootweb02 /]# echo ${OLDBOY##a*c} [rootdb01 ~]# OLDBOYI am oldboy[rootdb01 ~]# echo ${OLDBOY/oldboy/oldgirl}I am oldgirl[rootdb01 ~]# OLDBOYI am oldboy oldboy [rootdb01 ~]# echo ${OLDBOY/oldboy/oldgirl}I am oldgirl oldboy 小结 #是开头删除匹配最短##是开头删除匹配最长%是结尾删除匹配最短%%是结尾删除匹配最长生产案例 httpd${HTTPD-/usr/sbin/httpd}
proghttpd
pidfile${PIDFILE-/var/run/httpd/httpd.pid}
lockfile${LOCKFILE-/var/lock/subsys/httpd}
RETVAL0
STOP_TIMEOUT${STOP_TIMEOUT-10} 企业场景例子尽量不要使用rm [rootMySQL test]# cat del.shpath/server/backupfind ${path:/tmp/} -name *.tar.gz -type f |xargs rm -f path/server/backupfind ${path:/tmp/} -name *.tar.gz -type f |xargs rm -f[rootMySQL test]# cat del.shpath/server/backupfind ${path:/tmp/} -name *.tar.gz -type f |xargs rm -f[rootMySQL test]# sh -x del.sh path/server/backup find /server/backup -name *.tar.gz -type f xargs rm -f[rootMySQL test]# sed -i 1d del.sh[rootMySQL test]# cat del.shfind ${path:/tmp/} -name *.tar.gz -type f |xargs rm -f[rootMySQL test]# sh -x del.sh find /tmp -name *.tar.gz -type f xargs rm -f#rm -fr ${path:/tmp/} 扩展其他变量的替换
变量替换表了解man bash查到资料Parameter Expansion变量的数值整数计算 变量的数值计算常见的有如下几个命令(())、let、expr、bc小数、$[]其他都是整数。如果要执行简单的整数运算只需将特定的算术表达式用”$((“和”))” 括起来即可。shell的算术运算符号常置于”$((“……”))”的语法中。这一语法如同双引号的功能1(())用法此方法很常用
范例shell的算术运算实例如下[rootdb01 ~]# ((a12**3-4%3))
[rootdb01 ~]# echo $a
8
[rootdb01 ~]# ((a12**3-4%3))
[rootdb01 ~]# echo $a
8
[rootdb01 ~]# echo $((12**3-4%3))
8 记忆方法– 变量a在前表达式的值为a然后a自增或自减变量a在符号后表达式值自增或自减然后a值自增或自减 [rootdb01 ~]# a$((100*(1001)/2))
[rootdb01 ~]# echo $a
5050 范例6这是一个实践考试题内容如下 把ab两个变量通过命令行脚本传参的方式实现上面混合运算脚本的功能 第一种方法 #!/bin/bash
a6
b2
echo a-b $(( $a - $b ))
echo ab $(( $a $b ))
echo a*b $(( $a * $b ))
echo a/b $(( $a / $b ))
echo a**b $(( $a ** $b ))
echo a%b $(( $a % $b )) 第二种方法 [rootweb02 ~]# cat abc.sh
#!/bin/bash
a$1
b$2
echo a-b $(( $a - $b ))
echo ab $(( $a $b ))
echo a*b $(( $a * $b ))
echo a/b $(( $a / $b ))
echo a**b $(( $a ** $b ))
echo a%b $(( $a % $b )) 2let命令的用法整数
格式let 赋值表达式【注】let赋值表达式功能等同于((赋值表达式))范例1给自变量i加8[rootdb01 scripts]# i2
[rootdb01 scripts]# let ii8
[rootdb01 scripts]# echo $i
10 3expr evaluate求值expressions表达式命令的用法
expr命令一般用于整数值但也可用于字符串用来求表达式变量的值同时expr也是一个手工命令计算器1.计算语法expr Expression[rootweb02 /]# expr 22
4
[rootweb02 /]# expr 2-2
0
[rootweb02 /]# expr 2*2
expr: syntax error 语法错误
[rootweb02 /]# expr 2 \* 2
4
[rootweb02 /]# expr 3/2
1
[rootweb02 /]# expr 3%2
1 另一种玩法 [rootdb01 scripts]# i0
[rootdb01 scripts]# iexpr $i 1
[rootdb01 scripts]# echo $i
1 expr $[$a$b] 表达式形式其中$a $b 可为整数值 [rootweb02 /]# expr $[23]
5
[rootweb02 /]# expr $[2*3]
6
[rootweb02 /]# expr $[2**3] 2的2次方*3
8
[rootweb02 /]# expr $[2/3]
0
[rootweb02 /]# expr $[2%3]
2 四种运算方法 1. 2.let 3.expr 4.[] 整数 判断一个文件的扩展名是不是pub 发送公钥的命令就是使用此参数#!/bin/sh
if expr $1 : .*\.pub /dev/nullthen echo you are using $1
elseecho pls use *.pub file
fi
[rootweb02 ~]# sh aaa.sh oldboy
pls use *.pub file
[rootweb02 ~]# sh aaa.sh oldboy.pub
you are using oldboy.pub STRING : REGEXP anchored pattern match of REGEXP in STRING 判断一个输入是不是数字 #!/bin/sh
while true
doread -p Pls input: aexpr $a 0 /dev/null 21[ $? -eq 0 ] echo int||echo chars
done 如果判断是不是数字就执行错误shars [rootdb01 scripts]# cat b.sh
#!/bin/sh
expr $1 1 /dev/null 21
[ $? -eq 0 ] echo int||echo chars
[rootdb01 scripts]# sh b.sh 1
int
[rootdb01 scripts]# sh b.sh 1a
chars
[rootdb01 scripts]# sh b.sh 100
int
[rootdb01 scripts]# sh b.sh 100abc
charsexpr match 整数判断 [[ expr match $a [0-9][0-9]*$ 0 ]] {echo the first is not a numexit 3
} 计算变量长度 [rootdb01 scripts]# aoldboy
[rootdb01 scripts]# expr length $a
6expr功能 1.整数计算 2.判断扩展名 3.判断输入是否为整数 4.计算变量的长度 [rootdb01 scripts]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type warranty.
11
2
13
4
6*8
48另一种使用bc的方式 [rootdb01 scripts]# echo 12|bc
3
[rootdb01 scripts]# echo 8-2|bc
6inux下的bc命令可以设置结果的位数通过 scale. [rootdb01 scripts]# echo scale3;5.23 / 3.13|bc
1.670
[rootdb01 scripts]# echo scale2;5.23 / 3.13|bc
1.67
比如
$ echo scale4; 1.2323293128 / 1.1 | bc -l
1.1202bc命令简单的算法 [rootweb02 ~]# i2
[rootweb02 ~]# iecho $i1|bc
[rootweb02 ~]# echo $i
3
可以做加法计算
[rootweb02 ~]# echo 3.55
3.55
[rootweb02 ~]# echo 3.55|bc
8.5
减法计算
[rootweb02 ~]# echo 3.5-5|bc
-1.5
乘法计算
[rootweb02 ~]# echo 3.5*5|bc
17.5
保留位数bc的用处不大
[rootweb02 ~]# echo scale2; 3.5*5.1|bc
17.85
[rootweb02 ~]# echo scale2; 3*5|bc
15
[rootweb02 ~]# echo scale1; 3*5|bc
15
提示bc是特有的小数计算
awk也可以进行小数计算
[rootweb02 ~]# echo 5.5 5.6 |awk {print ($2-$1)}
0.1
[rootweb02 ~]# echo 5.5 5.5 |awk {print ($2$1)}
11 范例通过一条命令计算输出123…10的表达式并计算出结果使用bc计算 输出内容如1234567891055 第一种方法 [rootweb02 ~]# seq -s 10
12345678910
[rootweb02 ~]# echo seq -s 10seq -s 10|bc
1234567891055第二种方法 [rootweb02 ~]# echo {1..10}|tr
12345678910
[rootweb02 ~]# echo echo {1..10}|tr echo {1..10}|tr |bc
1234567891055 更多方法因计算不是重点所以我们不重点研究。特点bc的独有特点是支持小数运算当然也可以整数运算。 typeset命令的用法
使用整数变量进行计算例如[rootweb02 ~]# typeset -i A1 B3
[rootweb02 ~]# AAB
[rootweb02 ~]# echo $A
4小结 shell的数值运算方法 expr、(())、let、bc、$[]、awk typeset