shell基础之一
Shell脚本自动化管理系统的必备基础:
- vim编辑器的熟练使用,SSH终端及“.vimrc”的设置等等需要熟悉。
- 命令基础:Linux的150个常用命令的熟练使用
- Linux的正则表达式以及三剑客(grep、sed、awk)熟练
- 常见linux网络服务部署、优化及排错。例如:crond、nfs、rsync、inotify、lanmp,sersync、ssh、memcached、mysql等
shell其实是一个命令解释器,它的作用是解释用户输入的命令和程序,命令和程序可以理解成我们图中的应用程序,我们linux系统中的那些命令其实也都是一个个的小程序,只不过完成的是系统的应用功能。我们在系统的终端中输入一条命令,可以立马看到一条或者几条系统回复我们的信息,其实就是shell在帮我们回复,所以shell可以称之为命令解释器。这种从键盘一输入命令,就可以立马得到相应的回复信息,叫作交互的方式。相当于我们在和电脑交流。Shell存在于系统的最外层,所以算作操作系统的外壳,它之外的应用程序就不能算作操作系统了。我们从输入系统的账户密码开始,到登录系统以后的所有操作都是shell在帮我们解释执行的。
一、shell
- 图形界面 Shell(GUI Shell)
- 命令行界面 Shell(CLI Shell)
CLI 是在用户提示符下键入可执行指令的界面,用户通过键盘输入指令,完成一系列操作。在 Linux 系统上主流的 CLI 实现是 Bash,
查看系统可用的shell(/etc/shells文件)
Linux系统默认的命令行终端解释器为Bash
- 必须要root才能执行脚本,否则退出;
- 成功切换目录,否则退出;
- 清理日志(cat /dev/null > messages),清理成功,再输出;
- 通关。。。(echo 输出)
二、Shell脚本文件的格式:
- 第一行(一般必须写明):指定脚本使用的shell(若不写明也不影响脚本的执行,系统会自动以sh解析脚本)。"#!/bin/bash"声明文件内的语法使用bash的语法,当这个程序被执行时,加载bash的相关环境配置文件(一般是non-login shell中的~/.bashrc文件)。
- 第二部分的注释(可写):程序内容的说明。shell脚本中,井号#用作批注(除第一行的"#!"外),shell不会解释以#开头的行(除第一行bash声明外)。
- 主要环境变量的声明(可写)
- 脚本的程序部分。
- 程序执行结束,回传一个数值给系统告知执行的结果(可写。默认命令执行成功返回数值0)。
脚本文件test1.sh的执行方式:
- 以sh(bash)进程来执行脚本文件(用户不必拥有对脚本文件的x权限)(在子进程中执行)
sh -x:实现shell脚本逐条语句的跟踪
sh -n:不执行脚本,仅进行语法的检查
sh -v:执行脚本前,先将脚本的内容输出到屏幕上
- 通过绝对或相对路径来执行脚本文件(用户须拥有对脚本文件的x权限)
(Linux系统中一切都是文件。后缀名.sh仅提示用户该文件是一个脚本文件,并不代表该文件是可以被用户执行的。文件是否可以被执行在于用户是否拥有对该文件的x权限)(在子进程中执行)
- 将脚本文件所处的目录添加到PATH环境变量中,通过输入脚本文件名来直接运行(用户须拥有对脚本文件的x权限)(在子进程中执行)
- 通过source命令或小数点(.)来执行脚本文件(在父进程中执行)
用方式①/②/③执行test2.sh脚本,执行完成后回到命令行模式(父进程)输出脚本中设置的变量,发现变量并不存在
(通过上述①/②/③方式(bash(sh)、绝对/相对路径或者将路径添加到$PATH中)来运行脚本时,该script会使用一个新的bash环境(子shell、子进程)来执行脚本内的命令。当子进程完成后(脚本执行结束),子进程内的各项变量或操作将会消失而不会传回给父进程中。)
若通过source命令或小数点(.)来执行脚本,该script会在父进程中执行。因此,父进程拥有脚本内设置的变量、操作等。
bash shell中的数学运算:在方括号内计算数学公式 [ operation ],结果赋值为result=$[ operation ]。
数学运算浮点解决方案:使用bc命令(bash的内建计算器)。
选项 |
作用 |
-q |
不显示bc计算器的欢迎信息 |
输入quit或组合键ctrl+d可退出bc计算器
浮点运算是由内建变量scale(数值范围)控制的,须将这个值设置为希望在计算结果中保留的小数位数,默认值为0。
在脚本中使用bc命令,通过命令替换$(),将输出结果赋值给一个变量:
基本格式为 variable=$(echo "options; expression" | bc)
使用内联输入重定向<<,在命令行中重定向数据(特别适用于进行大量运算):
基本格式为 varible=$(bc << EOF
options
statements
expressions
EOF
)
EOF字符串标识了重定向给bc命令的数据的终止。
bash计算器中创建的变量只在bash计算器中有效。
Shell中运行的每个命令都使用退出状态码告诉shell它运行完毕。退出状态码:0-255的整数值,在命令结束运行时由命令传给shell。变量$?用于保存上个已执行命令的退出状态码。退出状态码可配合exit命令使用。
状态码 |
描述 |
0 |
命令成功结束 |
1 |
一般性未知错误 |
2 |
不适合的shell命令 |
126 |
命令不可执行 |
127 |
没找到命令 |
128 |
无效的退出参数 |
128+x |
与Linux信号x相关的严重错误 |
130 |
通过ctrl+c终止的命令 |
255 |
正常范围之外的退出状态码 |
三、参数变量
Shell script的的默认变量(接受用户参数的变量)
- $0:当前Shell脚本程序的名称;
- $#:参数的个数;
- $*:所有位置的参数被看作一个字符串(当成一个整体);
- $@: 每个位置参数被看做独立的字符串(参数当成个体);
- $?:返回上一条命令是否执行成功,并返回一个值,0代表成功,非0代表执行失败;
- $1、$2、$3……:第N个位置的参数值。注:第10参数值需要{}来限定区域即${10}
- $$ :当前进程PID
- $! :上一条运行后台进程的PID
四、文件测试表达式 (man test即可)
test(测试):判断条件表达式是够成立。格式:test [参数]。单独执行test命令后不会显示任何信息。
可通过echo $?输出上一条命令(test命令)执行后的返回结果,若为0则表示执行(判断)成功
或通过&&、||来显示相关结果
- 文件测试所用的参数
操作符 |
作用 |
-e file1 |
测试file1文件是否存在(exist) |
-d file1 |
测试file1文件是否为目录类型,且是否存在(directory) |
-f file1 |
测试file1文件是否为一般文件,且是否存在(file) |
-r file1 |
测试当前用户对file1文件是否有读取权限(read) |
-w file1 |
测试当前用户对file1文件是否有写入权限(write) |
-x file1 |
测试当前用户对file1文件是否有执行权限(execute) |
file1-nt file2 |
测试file1是否比file2新(newer than)(检查文件日期) |
file1-ot file2 |
测试file1是否比file2旧(older than) |
- 整数测试所用的参数
操作符 |
作用 |
n1 -eq n2 |
检查n1是否等于n2(equal) |
n2 -ne n2 |
检查n1是否不等于n2(not equal) |
n1-gt n2 |
检查n1是否大于n2(greater than) |
n1 -lt n2 |
检查n1是否小于n2(less than) |
n1 -le n2 |
检查n1是否等于或小于n2(less equal) |
n1 -ge n2 |
检查n1是否大于或等于n2(greater equal) |
[ $num1 -eq $num2 ] #注意空格 整数比较不需要加双引号
(( $num1>$num2)) #无需空格,常规数学比较符号
Shell中不应使用"=="和"!="进行整数的比较(会将整数当作字符串来比较)
来自 <http://blog.csdn.net/zbw18297786698/article/details/77460786>
- 字符串测试所用的参数
- 字符串或字符串变量比较都要加双引号之后再比较
- 字符串或字符串变量比较,比较符号两段最好都要跑有空格
操作符 |
作用 |
str1 == str2 |
比较str1与str2字符串的内容是否相同 |
str1 != str2 |
比较str1与str2字符串的内容是否不同 |
-z str1 |
判断str1字符串长度是否为0(或未被定义) |
-n str1 |
判断str1字符串长度是否为非0 |
str1 > str2 |
判断str1是否比str2大(逐位比较字符串的每个字符,按字典顺序比较大小) |
str1 < str2 |
判断str1是否比str2小 |
(使用>、<(大于号、小于号)进行判断时必须搭配转义字符/使用,否则shell会误认为是重定向符号,把后字符串误当成文件名)(比较字符串顺序大小的测试中,大写字母会被认为是小于小写字母的(与sort命令恰恰相反,在英语环境下sort命令会认为大写字母是大于小写字母的,即排序结果中小写字母优先于大写字母出现))
- 多重条件判断
操作符 |
作用 |
test1 -a test2 |
类似于&&,两个测试条件同时成立时才回传true(and) |
test1 -o test2 |
类似于||,任一测试条件成立就回传true(or) |
! test1 |
反向状态(取反) |
[](中括号):判断符号。bash shell提供的另一种条件测试方法,作用同等与test命令,常用于if…then条件判断式中。
- 中括号的两端、每个组件间都需要有空格符来分隔。
- 中括号内的变量、常量,最好都以双引号或单引号括起来。
[ "$yn" == "Y" -o "$yn" == "y" ] 也可写成 [ "$yn" == "Y" ] || [ "$yn" == "y" ] (布尔逻辑能将可能的返回值简化为TRUE或FALSE类型)
shell基础之一的更多相关文章
- Shell基础学习小结
0 shell基础概念 Shell是解释性语言,使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象:缺点是它们的效率通常不如编译型语言.Shell命令有本 ...
- Shell基础-环境变量配置文件
Shell基础-环境变量配置文件 source 配置文件 或者 . 配置文件: 把环境变量写入配置文件后,需要用户重新登陆才能生效,而是用source命令,则能直接生效 主要的配置文件: /etc/p ...
- shell基础二十篇 一些笔记
shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...
- shell基础(转)
shell基础1:文件安全与权限 http://bbs.chinaunix.net/forum/viewtopic.php?t=434579&highlight=wingger 附:Linux ...
- Linux实战教学笔记17:精简shell基础
第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...
- shell基础及变量
一 Shell概述 1.Shell的作用——命令解释器,“翻译官” shell作为一个人机接口,用于解释用户输入的命令,将命令解释为Linux内核可以执行的2进制代码,并将执行的结果返回在标准终端上. ...
- Shell 基础教程
一个比较好的shell基础教程: http://www.runoob.com/linux/linux-shell.html
- Linux基础学习(10)--Shell基础
第十章——Shell基础 一.Shell概述 1.Shell是什么: (1)Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来 ...
- Linux Shell基础(下)
Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...
- Linux shell基础知识(上)
Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...
随机推荐
- 数据结构和算法总结(三):A* 寻路算法
前言 复习下寻路相关的东西,而且A star寻路在游戏开发中应用挺多的,故记录下. 正文 迪杰斯特拉算法 说起A*得先谈谈Dijkstra算法,它是在BFS基础上的一种带权值的两点最短寻路贪心算法. ...
- 基于MFC对话框的2048游戏
在之前一篇<简单数字拼板游戏学习>基础上修改,地址:http://www.cnblogs.com/fwst/p/3706483.html 开发环境:Windows 7/ Visual St ...
- JSON在JS中的应用
一. JSON在JS中的应用: 首先解释下JSON对象与普通js对象字面量定义时格式的区别: Js对象字面量定义格式: var person = { name:"Wede", ag ...
- POJ1845Sumdiv题解--约数之和
题目链接 https://cn.vjudge.net/problem/POJ-1845 分析 \(POJ\)里的数学题总是这么妙啊 首先有一个结论就是\(A=\prod{ \ {p_i}^{c_i} ...
- python matplotlib 折线图
1.绘制折线图,去上和右边框,显示中文 import numpy as np import matplotlib.pyplot as plt #plt.style.use('default') #pl ...
- 无法删除登录名 '***',因为该用户当前正处于登录状态。 (Microsoft SQL Server,错误: 15434)
问题描述: 当删除数据库用户时,有时会得到这样的提示: 无法删除登录名 '***',因为该用户当前正处于登录状态. (Microsoft SQL Server,错误: 15434) 解决办法: 1.首 ...
- SIP协议入门:初学者必须明白的几个重要概念
SIP协议初学者必须明白的几个重要概念 http://blog.sina.com.cn/s/blog_60e1d7bb0100f6er.html 一. SIP协议的分层结构 SIP是一个分层结构协议, ...
- Redis缓存策略设计及常见问题
Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的选 ...
- VUE【二、选项和生命周期】
vue对象,类似于一个viewModel,是处理页面显示的数据模型的对象 其中会有很多选项,以下为较常用的: 选项 1.data-数据 vue实例会代理其data对象里的所有属性 2.methods- ...
- go爬虫之爬取豆瓣电影
go爬取豆瓣电影 好久没使用go语言做个项目了,上午闲来无事花了点时间使用golang来爬取豆瓣top电影,这里我没有用colly框架而是自己设计简单流程.mark一下 思路 定义两个channel, ...