shell 指令集锦
0 shell简介
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
Shell 既是一种命令语言,又是一种程序设计语言。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
0.1 执行shell
方法1:作为可执行程序
保存为 test.sh,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
注意,一定要写成 ./test.sh,而不是 test.sh
方法2:作为解释器参数
直接运行解释器,其参数就是 shell 脚本的文件名(该脚本文件可以无 "执行权限"。)
sh test.sh
1 shell变量
1.1 定义变量
定义变量时,变量名不加美元符号
以下语句将 /etc 下目录的文件名循环出来。
for file in `ls /etc`
或
for file in $(ls /etc)
1.2 使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可
花括号是可选的(加花括号是为了帮助解释器识别变量的边界。推荐给所有变量加上花括号,这是个好的编程习惯。),但是一定要加美元符号
1.3 设置只读变量(readonly)
1.4 删除变量(unset)
变量被删除后不能再次使用。
unset 命令不能删除只读变量。
2 shell 字符串
2.1 单引号
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行)
但单引号可成对出现,作为字符串拼接使用。
2.2 双引号
- 双引号里可以有变量(变量需要$b使用)
- 双引号里可以出现转义字符(用echo -e显示转义字符)
和单引号一样,双引号也能拼接字符
2.3 获取字符串长度
也可以用length
2.4 截取子字符串
2.4.1 按照下标截取
假设有变量 var=http://www.aaa.com/123.htm
echo ${var:0:5} |
0 表示左边第一个字符开始,5 表示字符的总个数。 结果是:http: |
echo ${var:7} |
7 表示左边第8个字符开始,一直到结束。 结果是 :www.aaa.com/123.htm |
echo ${var:0-7:3} |
0-7 表示右边算起第七个字符开始,3 表示字符的个数。 结果是:123 |
echo ${var:0-7} |
从右边第七个字符开始,一直到结束。 结果是:123.htm |
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
2.4.2 #截取
#、## 表示从左边开始删除。
一个 # 表示从左边删除到第一个指定的字符;
两个 # 表示从左边删除到最后一个指定的字符。
假设有变量 var=http://www.aaa.com/123.htm
echo ${var#*//} |
从左边开始删除第一个 // 号及左边的所有字符, 即删除 http:// 结果是 :www.aaa.com/123.htm |
echo ${var##*/} |
表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符, 即删除 http://www.aaa.com/ 结果是 123.htm |
2.4.3 %截取
%、%% 表示从右边开始删除。
一个 % 表示从右边删除到第一个指定的字符;
两个 % 表示从右边删除到最后一个指定的字符。
假设有变量 var=http://www.aaa.com/123.htm
echo ${var%/*} |
从右边开始,删除第一个 / 号及右边的字符 结果是:http://www.aaa.com |
echo ${var%%/*} |
从右边开始,删除最后(最左边)一个 / 号及右边的字符 结果是:http: |
2.5 查找子字符串
注意,以上脚本中,`是反引号(键盘1左边那个),不是单引号
3 shell数组
3.1 定义数组
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
使用不连续的下标,如果接下来要读取没有赋值的下标位置的数组,不会报错,但也不会有什么返回。
3.2 读取数组
下标可以是变量(变量前面加不加$都可以)
3.3 获取数组所有元组
使用 @/* 符号可以获取数组中的所有元素
3.4 获取数组长度
获取数组长度的方式和获取字符串长度的方式相同
4 shell注释
4.1 单行注释
以 # 开头的行就是注释,会被解释器忽略。
通过每一行加一个 # 号设置多行注释
4.2 多行注释
5 shell传参
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。
n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
$# |
传递到脚本的参数个数 |
$* |
以一个单字符串显示所有向脚本传递的参数,以"$1 $2 … $n"的形式输出所有参数 |
$$ |
脚本当前的进程ID号 |
$@ |
与$*相同,但是使用时加引号,并在引号中返回每个参数。 如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 |
5.1 *和@的区别
$* 与 $@ 区别:
- 相同点:都是引用所有参数。
- 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
echo "-- \$* 演示 ---"
for i in "$*"; doecho $i
doneecho "-- \$@ 演示 ---"
for i in "$@"; doecho $i
done
6 shell基本运算符
注意事项:
1,表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
2,完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
3,常用的 + - * / % = == != ,shell上都有
4,乘号(*)前边必须加反斜杠(\)才能实现乘法运算;(在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" )
5,条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
6.1 shell关系运算符
-eq |
判断是否相等 (equal) |
-ne |
判断是否不相等 (not equal) |
-gt |
判断是否大于 (greater than) |
-lt |
判断是否小于 (less than) |
-ge |
判断是否大于等于 (greater equal) |
-le |
判断是否小于等于 (less equal) |
6.2 shell布尔运算符
! |
非 |
-o |
或运算(or) |
-a |
与运算(and) |
6.3 字符串运算符
= |
两个字符串是否相等 |
!= |
判断两个字符串是否不相等 |
-z |
字符串长度是否为0(为0返回true) |
-n |
字符串长度是否不为0(不为0返回true) |
6.4 shell逻辑运算符
&& | 逻辑的 AND |
|| | 逻辑的 OR |
6.5 文件测试运算符
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件,如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
7 shell echo 命令
7.1 显示普通字符
7.2 显示双引号
7.3 -e 开启转义
7.4 显示结果定向至某文件
7.5 显示命令执行结果
8 shell 流程控制
和一般的语言不一样,shell的流程控制不可为空,也就是说,如果else分支没有语句可以执行,那么就不要写这个else
要注意的是,和 C 语言不同,shell 语言中 0 代表 true,0 以外的值代表 false。
8.1 if-else
8.2 if-elif-else
8.3 for
8.4 while
几种自增的方法
let j++let "n++"let m+=1a=$[$a+1]
8.5 until
一直循环,直到某一次条件为true
8.6 case
每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
8.7 跳出循环
shell中也有break和continue
9 shell 重定向
command > file |
将输出重定向到file |
command < file |
将输入重定向到file |
command >> file |
将输出以追加(append)的方式重定向到file |
n > file |
将文件描述符为n的文件重定向到file |
n >> file |
将文件描述符为n的文件以追加的方式重定向到file |
n >& m |
将输出文件m和n合并 |
9.1 文件描述符
0 |
标准输入 STDIN |
1 |
标准输出 STDOUT |
2 |
标准错误输出 STDERR |
9.2 举例
将 stdout 和 stderr 合并后重定向到 file
10 printf
printf 命令模仿 C 程序库(library)里的 printf() 程序
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 小赵 男 66.1234
printf "%-10s %-8s %-4.2f\n" 小钱 男 48.6543
printf "%-10s %-8s %-4.2f\n" 小孙 女 47.9876
%s %c %d %f 都是格式替代符
%s 输出一个字符串(string)
%d 整型输出(decimal)
%c 输出一个字符(char)
%f 输出浮点数。(float)
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
format-string 单引号双引号效果一样。
如果format-string中只有一个,甚至没有引号都可以
格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
格式化浮点数默认支持小数点后面六位,多出来的四舍五入
10.1 printf 转义序列
大体上和C是一样的
\b | 后退 |
\c | 抑制(不显示)输出结果中任何结尾的换行字符 |
\f | 换页(formfeed) |
\n | 换行 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 一个字面上的反斜杠字符 |
\ddd | 表示1到3位数八进制值的字符。仅在格式字符串中有效 |
\0ddd | 表示1到3位的八进制值字符,开头有一个0 |
11 shell函数
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
11.1 函数定义
shell中函数的定义格式如下:
- 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
下面定义一个带有return语句的函数:
funWithReturn(){echo "这个函数会对输入的两个数字进行相加运算..."echo "输入第一个数字: "read aNumecho "输入第二个数字: "read anotherNumecho "两个数字分别为 $aNum 和 $anotherNum !"return $(($aNum+$anotherNum))
}
那么我们怎么得到函数返回的值呢?使用$? 即可
$? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得。
11.2 函数参数
在Shell中,调用函数时可以向其传递参数。
在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
funWithParam(){echo "第一个参数为 $1 !"echo "第二个参数为 $2 !"echo "第十个参数为 $10 !"echo "第十个参数为 ${10} !"echo "第十一个参数为 ${11} !"echo "参数总数有 $# 个!"echo "作为一个字符串输出所有参数 $* !"
}
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
还有几个特殊的参数,和第五节shell传参是一样的
$# |
传递到脚本的参数个数 |
$* |
以一个单字符串显示所有向脚本传递的参数,以"$1 $2 … $n"的形式输出所有参数 |
$$ |
脚本当前的进程ID号 |
$@ |
与$*相同,但是使用时加引号,并在引号中返回每个参数。 如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 |
shell 指令集锦相关推荐
- php exec执行多条命令,小技巧:在PHP中调用多条shell指令
原标题:小技巧:在PHP中调用多条shell指令 有时候,在持续集成的过程中,需要通过网页在目标服务器上执行shell指令,今天就列举一个实例进行讲解. 比如,我们需要能通过网页将SVN update ...
- linux shell 指令 诸如-d, -f, -e之类的判断表达式(转)
linux shell 指令 诸如-d, -f, -e之类的判断表达式(转) 一.文件比较运算符 e filename 如果 filename存在,则为真 如: [ -e /var/log/syslo ...
- linux shell指令大全整理
linux shell指令 shell是一种脚本语言, 需要有编译器执行 bash是linux下默认的shell sh是unix下默认的shell 在ubuntu中bash和sh都可用 执行 #!/b ...
- 随手记——Linux中C语言调用shell指令的三种方式
在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习.我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直 ...
- gitlab runner下载安装注册+卸载 + shell指令没执行的问题
什么是gitlab CI/CD 简单来说,CI的作用是验证提交的代码是否符合规范.主要起到一个验证的作用.CD的作用主要是部署,测试环境的部署,正式环境的发布,制品的生成,镜像的构建. Runner ...
- shell指令可以直接在终端输入吗_shell不是LInux系统的壳吗?咋还能脚本编程了?...
小豆丁:老张!老张!你快来! 老张:咋啦?火烧屁股啦?急急忙忙的! 小豆丁:啥火烧屁股啊,我是遇到问题了! 老张:也对,你只有遇到问题的时候才会找我!说吧,啥事? 小豆丁:老张啊,你不是刚给我讲完Li ...
- linux shell指令 amp,shell入门基础amp;常见命令及用法
shell shell是一个命令解释器,实际是一个程序,/bin/bash,linux中所有的命令都由它来解释,有自己的语法 shell脚本 以.sh结尾 shell语法+linux命令 注释: 单行 ...
- 常见 Shell 指令
New: shell中扩展命令 文件目录管理命令 tree 命令描述:tree命令用于以树状图列出目录的内容. tree命令没有内置在系统中,使用tree命令需要执行以下命令来安装: yum inst ...
- linux系统下的bash shell指令有哪些?对bash命令的汇总和小结
一.参考来源 Windows系统的cmd命令哪些?具体怎么用?cmd命令汇总,dos命令小结?和linux命令的对比? 下面这个网站,强烈推荐,一旦遇到自己不懂的linux命令,直接去这个开源站检索即 ...
最新文章
- 按照linux文件出现的时间来删除文件
- mysql 控制台全是_Mysql控制台命令大全
- 第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】
- Angular服务http post传递key-value 到Springmvc控制器
- storm的并行度的解释--- ( 看完就能理解 )
- Intel Core Solo/Duo处理器架构/微架构/流水线 - 前端/数据预取/SSE3
- 原子变量的原理与应用
- cp oracle,Oracle ASM使用asmcmd中的cp命令来执行远程复制
- 常用数据库的驱动程序加载和Url下载地址
- UNIX环境高级编程(第2版)第11-17章
- lamp兄弟连的解决问题套路
- 使用Python发送邮件(图片、表格、附件) 系列三: 发送工作报表之透视表自动刷新数据
- win7无声音显示“未插入扬声器或耳机” 怎么解决
- 关于vim的详细配置
- java安装报错循环冗余检查_SQLSERVER2012备份日志报错:”读取失败: 23(数据错误(循环冗余检查)。)”...
- DataGrip连接hive建表时报cannot recognize input near ‘show‘ ‘indexes‘ ‘on‘ in ddl statement错误
- 啪啪打脸,国际互联网协会数据泄露
- Flood Fill
- 选全尺寸还是非全尺寸备胎,这里面学问可大着呢
- 制作pDF 格式电子书
热门文章
- Spring的Hello, world,还有拿来主义
- PHP获取当前域名$_SERVER['HTTP_HOST']和$_SERVER['SERVER_NAME']的区别
- Hive 和普通关系数据库的异同
- Python 性能剖分工具
- 监控 WebBrowser 控件内容的改变
- Android 计步功能-简单实现
- python简单代码运行_python代码如何运行
- wps定位对话框快捷键_Word、Excel、PPT快捷键汇总
- php怎么随机显示6个数,PHP里一个12成员的数组,随机挑出6/3/3个成员(不重复),然后重新赋值,有什么简洁的办法实现?...
- Qt中多线程与界面组件的通信