网站建设 中关村,如何用VS2017做网站,门户网站的优点,手把手教网站建设目录 一、Shell概念1.定义2.分类和使用场景2.1.分类和切换2.2.使用场景 3.特性3.1.文件描述符与输出重定向3.2.历史命令---history3.3.别名 --alias3.4.命令排序执行3.5.部分快捷键3.6.通配符置换 4.脚本规范5.脚本运行方式5.1.bash脚本执行5.2.bash脚本测试 二、bash配置文件1… 目录 一、Shell概念1.定义2.分类和使用场景2.1.分类和切换2.2.使用场景 3.特性3.1.文件描述符与输出重定向3.2.历史命令---history3.3.别名 --alias3.4.命令排序执行3.5.部分快捷键3.6.通配符置换 4.脚本规范5.脚本运行方式5.1.bash脚本执行5.2.bash脚本测试 二、bash配置文件1.全局配置文件2.个人配置文件 一、Shell概念
1.定义
程序 语言 编程语言自然语言汉语 英语、计算机语言c语言、c、java、php、python、go、shell编译型语言c、c、java解释型语言php、python、bash(shell) 编译型语言编译型语言的首先将源代码编译生成机器语言再由机器运行机器码二进制。像C/C等都是编译型语言。 解释型语言源代码不是直接翻译成机器语言而是先翻译成中间代码再由解释器对中间代码进行解释运行。比如Python/JavaScript/Shell等都是解释型语言 c 编译型执行代码需要编译成cpu能认识的二进制码 x86指令集 java 编译型执行编译–字节码cpu不能直接运行只能被Java虚拟机执行 shell 解释型语言执行 慢 编译型语言的执行方式 解释型语言的执行方式 Shell定义 Shell 也是一种程序设计语言它有变量关键字各种控制语句有自己的语法结构利用shell程序设计语言可以编写功能很强、代码简短的程序。 shell是外壳的意思就是系统的外壳我们可以通过shell的命令来控制和操作操作系统比如linux中的shell命令就包括ls、cd、pwd等等总结来说shell就是一个命令解释器他通过接收用户输入的shell命令来启动、停止程序的运行或者对计算机进行控制。 2.分类和使用场景
2.1.分类和切换
[rootlocalhost ~]# cat /etc/shells //查看所有shell
/bin/sh
/bin/bash //默认的shell
/usr/bin/sh //centos中脚本使用的默认shell
/usr/bin/bash[rootlocalhost ~]# echo $SHELL //查看当前正在使用的shell
/bin/bash[rootlocalhost ~]# vim /etc/passwd //编辑登录shell2.2.使用场景 Shell 能做什么? 自动化批量系统初始化程序 update软件安装时区设置安全策略…—初始化脚本自动化批量软件部署程序 LAMPLNMPTomcatLVSNginx—一键安装la/nmp环境通过脚本自动上线代码应用管理程序 KVM—通过脚本批量创建虚拟机日志分析处理程序PV, UV, 200, !200,grep/awk/sed自动化备份恢复程序MySQL完全备份/增量 Crond自动化信息采集及监控程序收集系统/应用状态信息CPU、Mem、Disk、Net、TCP Status、Apache、MySQL配合Zabbix信息采集收集系统/应用状态信息CPU、Mem、Disk、Net、Apache、MySQLShell可以做任何运维的事情一切取决于业务需求 3.特性
3.1.文件描述符与输出重定向 在 shell程序中最常使用的FD (file descriptor) 大概有三个分别是 0: Standard Input (STDIN) 1: Standard Output (STDOUT) 2: Standard Error Output (STDERR) 在标准情况下, 这些FD分别跟如下设备关联: stdin(0): keyboard 键盘输入并返回在前端 stdout(1): monitor 正确返回值 输出到前端 stderr(2): monitor 错误返回值 输出到前端 将程序的标准输出(stdout)和标准错误(stderr)一起重定向到一个文件该用法最常用 a.txt 将标准输出(stdout)重定向到标准错误(stderr)用的较少了解即可1 2 将标准错误(stderr)重定向到标准输出(stdout)用的较少了解即可2 1 一般来说, “1” 通常可以省略成 “” 1.例子当前目录下只有a.txt没有b.txt
[rootlocalhost ~]# touch a.txt
[rootlocalhost ~]# ls a.txt b.txt file.out 21
[rootlocalhost ~]# cat file.out
ls: cannot access b.txt: No such file or directory
a.txt2.或者也可以
[rootlocalhost ~]# ls a.txt b.txt cat.txt
[rootlocalhost ~]# cat cat.txt
ls: 无法访问b.tx: 没有那个文件或目录
a.txt3.通过cat的方式将内容写入到文件中
[rootlocalhost ~]# cat b.txt eofni hao a hahaeof
[rootlocalhost ~]# cat b.txt
ni hao a haha//注这里也可以使用EOF需要成对使用即可3.2.历史命令—history 上下健 ! 关键字 ! 历史命令行号 !! 执行上一条命令 !$ 上一条命令的最后一个参数 esc . 上一条命令的最后一个参数 Ctrlr 在历史命令中查找输入关键字调出之前的命令 3.3.别名 --alias
[rootlocalhost ~]# alias //查看别名
alias cpcp -i
alias egrepegrep --colorauto
alias fgrepfgrep --colorauto
alias grepgrep --colorauto
alias l.ls -d .* --colorauto
alias llls -l --colorauto
alias lsls --colorauto
alias mvmv -i
alias rmrm -i
alias whichalias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde设置别名
1.临时设置
[rootlocalhost ~]# aa88
[rootlocalhost ~]# echo $aa
882.永久设置
[rootlocalhost ~]# vim /root/.bashrc
aa88
[rootlocalhost ~]# source /root/.bashrc //让文件生效3.4.命令排序执行 逻辑与前面执行成功后面才执行。前面命令执行失败后面命令也不执行 || 逻辑或前面执行失败后面执行前面命令执行成功后面不执行。 ; 从左往右按顺序执行不管前面执行成功与否后面都执行 3.5.部分快捷键 Ctrla 切换到命令行开始(跟home一样但是home在某些unix环境下无法使用) Ctrlu 清除剪切光标之前的内容 Ctrlk 清除剪切光标之后的内容 ctrly 粘贴刚才所删除的字符 Ctrlr 在历史命令中查找输入关键字调出之前的命令 Ctrll 清屏 Ctrlc 终止 Ctrle 切换到命令行末尾 3.6.通配符置换 在 Shell命令中通常会使用通配符表达式来匹配一些文件 * ? [] {} 字符含义实例*匹配 0 或多个字符a*b a与b之间可以有任意长度的任意字符也可以一个也没有, 如aabcb, axyzb, a012b, ab?匹配任意一个字符a?b a与b之间必须也只能有一个字符可以是任意字符, 如aab, abb, acb, a0b[list]匹配 list 中的任意单一字符a[xyz]b a与b之间必须也只能有一个字符但只能是 x 或 y 或 z, 如: axb, ayb, azb[!list]匹配 除list 中的任意单一字符a[!0-9]b a与b之间必须也只能有一个字符但不能是阿拉伯数字, 如axb, aab, a-b[c1-c2]匹配 c1-c2 中的任意单一字符[0-9] [a-z] a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b… a9b{string1,string2,…}匹配 sring1 或 string2 (或更多)其一字符串a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一
[rootlocalhost tmp]# rm -rf *
[rootlocalhost tmp]# touch aabcb axyzb a012b ab acb
[rootlocalhost tmp]# ls
a012b aabcb ab acb axyzb
[rootlocalhost tmp]# ls a*b
a012b aabcb ab acb axyzb
[rootlocalhost tmp]# ls a?b
acb[rootlocalhost tmp]# rm -rf *
[rootlocalhost tmp]# touch axb ayb azb axyb
[rootlocalhost tmp]# ls
axb axyb ayb azb
[rootlocalhost tmp]# ls a[xy]b
axb ayb
[rootlocalhost tmp]# ls a[!xy]b
azb
[rootlocalhost tmp]# ls a[!x]b
ayb azb[rootlocalhost tmp]# rm -rf *
[rootlocalhost tmp]# touch a0b a1b a9b
[rootlocalhost tmp]# ls a[0-9]b
a0b a1b a9b[rootlocalhost tmp]# rm -rf *
[rootlocalhost tmp]# touch aabcb axyzb a012b ab
[rootlocalhost tmp]# ls a{abc}b //a{abc}b被当作文件名
ls: cannot access a{abc}b: No such file or directory
[rootlocalhost tmp]# ls a{abc,}b
aabcb ab
[rootlocalhost tmp]# ls a{abc,xyz}b
aabcb axyzb
[rootlocalhost tmp]# ls a{abc,xyz,012}b
a012b aabcb axyzb
//拓展
[rootlocalhost tmp]# ls a[0-9a-z][0-9a-z][0-9a-z]b
a012b aabcb axyzb4.脚本规范
[rootlocalhost ~]# vim helloworld.sh //.sh代表这个文件是个shell脚本拓展名后缀如果省略.sh则不易判断该文件是否为shell脚本
1. #!/usr/bin/env bash //shebang蛇棒, 解释器, 翻译
2. #
3. # Author: soso666
4. # Email: soso666163.com //一些注释可以解释一下脚本作用
5. # Github: https:github.com/soso666
6. # Date: 2019/12/24
7. printf hello world//功能说明打印hello world[rootlocalhost ~]# sh helloworld.sh
hello world5.脚本运行方式
5.1.bash脚本执行
[rootlocalhost ~]# vim /opt/test/script/test.sh
#!/bin/bash
# 获取主机基本信息
timedate %F-%T #等同于 $(date %F-%T)
#ifconfig命令需要安装net-tools工具包
ipifconfig |grep broadcast|awk {print $2}
echo 现在的时间是: $time
echo 当前的用户是: $USER
echo 当前的用户标识: $UID
echo 当前的主机名称是: $HOSTNAME
echo 当前可用网卡IP是: $ip[rootlocalhost ~]# cd /opt/test/script/1.source 文件名 使用当前shell父shell执行 比如cd /tmp会改变当前shell环境但是其他的方式不会
[rootlocalhost script]# source test.sh
现在的时间是: 2023-09-07-19:52:54
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: localhost.localdomain
当前可用网卡IP是: 192.168.221.1362.bash或者sh 文件名
[rootlocalhost script]# bash test.sh
现在的时间是: 2023-09-07-19:53:03
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: localhost.localdomain
当前可用网卡IP是: 192.168.221.136[rootlocalhost script]# sh test.sh
现在的时间是: 2023-09-07-19:53:09
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: localhost.localdomain
当前可用网卡IP是: 192.168.221.1363.相对路径或者绝对路径 需要提前授权
[rootlocalhost script]# ./test.sh
-bash: ./test.sh: 权限不够
[rootlocalhost script]# chmod x ./test.sh[rootlocalhost script]# ./test.sh
现在的时间是: 2023-09-07-19:56:25
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: localhost.localdomain
当前可用网卡IP是: 192.168.221.136[rootlocalhost script]# /opt/test/script/test.sh
现在的时间是: 2023-09-07-19:56:36
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: localhost.localdomain
当前可用网卡IP是: 192.168.221.1365.2.bash脚本测试
1.这将执行该脚本并显示所有变量的值
[rootlocalhost ~]# sh -x /root/helloworld.shprintf hello world
hello world2.不执行脚本只是检查语法模式将返回所有错误语法
[rootlocalhost ~]# sh -n /root/helloworld.sh3.执行脚本前把脚本内容显示在屏幕上
[rootlocalhost ~]# sh -v /root/helloworld.sh
#!/usr/bin/env bash
#
# Author: soso666
# Email: soso666163.com
# Github: https:github.com/soso666
# Date: 2019/12/24
printf hello world
hello world二、bash配置文件
1.全局配置文件
/etc/bashrc、/etc/profile、/etc/profile.d/*.sh 如果修改/etc/profile文件修改出错导致无法敲系统命令例如ls怎么解决呢 在命令行中输入 export PATH$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin 然后将该命令【追加】到/etc/profile文件中修改完后 source /etc/profile 2.个人配置文件
~/.bash_profile、~/.bashrc profile类的文件设定环境变量运行命令或脚本用户在登录的时候会自动生效 bashrc类的文件定义命令别名 用户登录时加载bash配置文件的过程 登录式shell加载配置文件过程先个人再公共先局部再全局 ~/.bash_profile -- ~/.bashrc -- /etc/bashrc — /etc/profile -- /etc/profile.d/*.sh 这里的优先级是影响范围最小的优先级最高 非登录式shell加载配置文件过程 ~/.bashrc -- /etc/bashrc -- /etc/profile.d/*.sh 下面的文件为系统的每个用户设置环境信息Shell设置文件 /etc/profile(系统级)启动时执行 这是系统最主要的shell设置文件也是用户登陆时系统最先检查的文件有关重要的【环境变量】都定义在此其中包括 PATH,USER,MAIL,HOSTNAME,HISTSIZE,INPUTRC等。而在文件的最后它会检查并执行/etc/profile.d/*.sh的脚本。 ~/.bash_login(用户级)登录时执行默认不存在 如果~/.bash_profile文件不存在则系统会转而读取.bash_login这个文件内容。这是用户的登陆文件在每次用户登陆系统时bash都会读此内容所以通常都会将登陆后必须执行的命令放在这个文件中。 ~/.bash_logout 离开时执行如果想在注销shell前执行一些工作都可以在此文件中设置。 例如vi ~.bash_logout clear #仅执行一个clear命令在你注销的时候 ~/.bash_history(用户级) 这个文件会记录用户先前使用的历史命令。