菜鸟教程之学习Shell script笔记(中)
菜鸟教程Shell script学习笔记(中)
以下内容是学习菜鸟教程之shell教程,所整理的笔记
菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.html
Shell基本运算符
注意: 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
#!/bin/bash
val=`expr 2 + 2`
echo "两个数之和为:$val"
运行实例:
两数之和为:4
注意:表达式和运算符之间哟要有空格,这与我们熟悉的大部分编程语言不一样
% 取余 `expr $b % $a`
== 相等,用于比较两个数字,相同则返回true [$a == $b] 返回false
!= 不相等,用于比较两个数字,不相同则返回true {$ != $b}返回true
注意:条件表达式要放在方括号之间,并且要有空格。
- 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
常见的关系运算符:
设a为10,b为20
-eq 检测两个数是否相等,相等则返回true [$a -eq $b]返回false
-ne 检测两数是否不相等,不相等则返回true [$a -ne $b]返回true
-gt 检测左边的数是否大于右边,如果是,则返回true [$a -gt $b]返回false
-lt 检测左边的数是否小于右边,如果是,则返回true [$a -lt $b]返回true
-ge 检测左边的数是否大于等于右边,如果是,则返回true [$a -ge $b]返回false
-le 检测左边的数是否小于等于右边,如果是,则返回true [$a -le $b]返回true
- 布尔运算符
常见的布尔运算符:
假定变量a为10,变量b为20
! 非运算,表达式为true则返回false,否则返回true [!false]返回true
-o 或运算,有一个表达式为true则返回true [$a -lt 20 -o $b -gt 100]返回true
-a 与运算,两个表达式都为true才返回true [$a -lt 20 -a $b -gt 100]返回false
- 逻辑运算符
shell的逻辑运算符:
假设变量a为10,变量b为20
&& 逻辑的and [[$a -lt $b -gt 100]]返回false
|| 逻辑的or ][[$a -lt 100 || $b -gt 100]]返回true
- 字符串运算符
常见的字符串运算符:
假设变量a为"abc",变量b为"efg"
-z 检测字符串长度是否为0,为0返回ture [-z"$a"]返回false
-n 检测字符串长度是否为0,不为0返回true [-n"$"]返回true
str 检测字符串是否为空,不为空返回true [$a]返回true
- 文件测试运算符
文件测试符用于检测unix文件的各种属性
属性检测描述如下
-b file 检测文件是否是块设备文件,如果是,则返回true [-b $file]返回false
-c file 检测文件是复活是字符设备文件,如果是,则放回true [-c $file]返回false
-d file 检测文件是否是目录,如果是,则返回true [-d $file]返回false
-f file 检测文件是否是普通文件(即不是目录,也不是设备文件),如果是,则放回true [-f $file]返回true
-g file 检测文件是否设置了SGID位,如果是,则返回true [-g $file]返回fasle
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回true [-k $file]返回false
-p file 检测文件是否是有名管道,如果是,则返回true [-p $file]返回false
-u file 检测文件是否设置了SUID位,如果是,则返回true [-u $file]返回false
-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
Shell echo命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。
- 显示普通字符
echo "It is a test" #双引号可省略 效果一样 - 显示转义字符
用\转义,显示\后面的字符 echo ""It is a test"" 输出:"It is a test" - 显示变量
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
#!/bin/sh
read name
echo "$name It is a test"
- 显示换行
-n 显示换行 菜鸟上面显示-e开启转义,是错误的。
echo -e "ok! \n"
echo "It is a test"
输出:
-e ok!
It is a test
- \c 显示不换行
- 显示结果并写入文件
echo "It is a test" > mylife - 原样输出字符串,不进行转义或取变量(用单引号)
echo '$name\"'
输出:
$name\"
- 用
xxx
显示命令执行结果
echodate
Shell printf命令
printf 由 POSIX 标准所定义,使用printf的脚本比echo移植性好。printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
- printf命令的语法:
printf format-string [arguments]
format-string:为格式控制字符串
arguments:为参数列表
eg:
#!/bin/bash
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.3f\n" 郭芙 女 47.9876
执行脚本 输出如下
...
%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
思考教程上例题:
教程上例题源码:
#!/bin/bash
printf "%d %s\n" 1 "abc"
printf '%d %s\n' 1 "abc"
printf %s abcdef
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
printf "%s and %d \n"
执行结果:
1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j
and 0
以上结果我认为有误:
为什么 单个printf %s abcdef 输出的是abcdef 而不是abcdefabcdefabc
- printf的格式指示符
%b 相应的参数被视为有要处理的转义序列的字符串
%c ASCLL字符,显示相对应参数的第一个字符
%d,%i 十进制整数
%e 浮点格式
%E 浮点格式
%f 浮点格式
%g %e或%f转换,看哪个比较短,则删除结尾的零
%G %E或%f转换,看哪个比较短,则删除结尾的零
%o 不带正负号的八进制转换
%s 字符串格式
%u 不带正负号的十进制值
%x 不带正负号的十六进制。使用a至f表示10至15
%X 不带正负号的十六进制。使用A至F表示10至15
%% 字面意义的%
- printf的转义序列
\a 警告字符,通常为ASCII的BEL字符
\b 后退(一位)
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符,仅在格式字符串中有效
\0ddd 表示1到3位的八进制的字符,仅在格式字符串中有效
eg:
printf "a string, no processing:<%s>\n" "A\nB"
printf "a string, no processing:<%b>\n" "A\nB"
printf "www.baiduu.com \a"
Shell test命令
Shell中的test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
- 数值测试
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
eg:
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
代码中的[]执行基本的算数运算,如:
#!/bin/bash
a=5
b=6
result=$[a+b] #注意等号两边不能有空格
echo "result 为:$result"
- 字符串测试
= 等于则为真
!= 不相等则为真
-z字符串 字符串的长度为零则为真
-n字符串 字符串的长度不为零则为真
eg:
num1="test"
num2="test2"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等'
fi
- 文件测试
-e文件名 如果文件存在则为真
-r文件名 如果文件存在且可读则为真
-w文件名 如果文件存在且可写则为真
-x文件名 如果文件存在且可执行则为真
-s文件名 如果文件存在且至少有一个字符则为真
-d文件名 如果文件存在且为目录则为真
-f文件名 如果文件存在且为普通文件则为真
-c文件名 如果文件存在且为字符型特殊文件则为真
-b文件名 如果文件存在且为块文件则为真
eg:
#!/bin/bash
cd /bin
if test -e ./bash
then
echo '文件已经存在'
else
echo '文件不存在'
fi
另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:
#!/bin/bash
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '至少有一个文件存在!'
else
echo '两个都不存在!'
fi
菜鸟教程之学习Shell script笔记(中)的更多相关文章
- 菜鸟教程之学习Shell script笔记(上)
菜鸟教程之学习Shell script笔记 以下内容是,学习菜鸟shell教程整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.ht ...
- 菜鸟教程之学习Shell script笔记(下)
菜鸟教程Shell script学习笔记(下) 以下内容是学习菜鸟教程之shell教程,所整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-sh ...
- bash shell学习-shell script基础 (笔记)
A chain no stronger than its weakest link. "一着不慎,满盘皆输" 参考资料:鸟哥的Linux私房菜 基础学习篇(第三版) Linux ...
- 菜鸟的《Linux程序设计》学习—shell script
1. 认识shell script shell script是利用shell的功能缩写的一个"程序",这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面, ...
- bash shell学习-shell基础 (笔记)
When you hoist the sails to cross the sea, you willride the wind and cleave the waves. "长风破浪会有时 ...
- 第13章 学习shell script
由于博客园中dollar符号有别的意义,所以文中的dollar符号使用¥表示 第一个script [root@localhost script]# cat -n sh01.sh #!/bin/bash ...
- 学习shell script
摘要:概述.script的编写.test命令.[]判断符号.默认变量($1...).if...then条件判断式. 一.概述 [什么是shell script] 针对shell所写的脚本,将多个命令汇 ...
- 学习shell脚本笔记
1.if 是单分支语句,使用格式如下: if condition ; then statement ….. fi 2.if … else 是双分支语句,使用格式如下: if condition ; t ...
- 鸟哥的Linux私房菜之学习shell script
运行程序的时候一般都是创建一个子程序来执行,所以子程序中的变量什么的在当前的shell下没法使用,但是如果使用source来执行就可以在当前shell下执行程序 shift 1 去掉第一个参数,后面接 ...
随机推荐
- python 迭代器 一个奇怪的解决方法
一般我们在类里面写迭代器都是如下写法: class IterableSomthing: def __iter__(self): return self def __next__(self): retu ...
- ss-R:// 链接的含义
1.问题 ss-R:// Mi41LmZ1Y2twcHBwcC50b2RheToyNDI4ODphdXRoX2FlczEyOF9tZDU6YWVzLTI1Ni1jdHI6dGxzMS4yX3RpY2t ...
- Python 安装beautifulsoup4遇到No module named setuptools问题解决方法
背景说明: 电脑win7-32 在Python 3.3.5下安装beautifulsoup4 4.6.0(下载链接https://pypi.org/project/beautifulsoup4/#fi ...
- 前端基础:form表单提交
今天介绍下form表单提交经常用到的表单元素. 1:datalist元素,一般与input组建配合使用,以定义可能输入的值,例如: <!DOCTYPE html> <html lan ...
- Pong 打乒乓
发售年份 1972 发售平台 多平台 开发商 雅达利(Atari) 类型 体育休闲 https://www.youtube.com/watch?v=fiShX2pTz9A
- Java高级特性 第7节 多线程
一.进程与线程的概念 1. 进程 进程是应用程序的执行实例,有独立的内存空间和系统资源. 如上图,标红色的是一个Office Word进程. 进程的特点: 动态性:进程是动态的创建和消亡: 并发性:操 ...
- 微信小程序计算金额长度异常解决办法
今天在做微信小程序,在测试的时候偶然出现了一些问题,如下图. 心中的一阵不爽猛然袭来,完全是搞事情哈! 然后经过一番探索,用toFixed方法搞定了,此方法是对值进行四舍五入的. 解决后点了一大堆控制 ...
- mysql 8.0 主从复制的优化
mysql 8.0复制改进一简介: 基于GTID下的并行复制,本文不考虑MGR架构二 主要特性 1 基于writeset的下的改进型并行复制 我在之前的一篇文章关于并行复制中详细的介绍了关 ...
- webpack打包vue -->简易讲解
### 1. 测试环境: 推荐这篇文章:讲的很细致 https://www.cnblogs.com/lhweb15/p/5660609.html 1. webpack.config.js自行安装 { ...
- [总结] Synchronized汇总
Java中的每一个对象都可以作为锁. 1对于同步方法,锁是当前实例对象. 2对于静态同步方法,锁是当前对象的Class对象. 3对于同步方法块,锁是Synchonized括号里配置的对象. 当一个线程 ...