Shell 学习(七)-----杂项
把这几天的笔记记录如下:
1.赋值的一些办法
- variable1=`<file1` # 将"file1"的内容放到"variable1"中.
- variable2=`cat file2` # 将"file2"的内容放到"variable2"中.
- ############################################################
- var=`echo "one two three"` # 在这个方法中set --$var 后,有one=$1
- set -- $var # two=$2,three=$3,其中$1,$2,$3是位置参数
2.重定向和文件描述符
- : > filename #将会把文件"filename"变为一个空文件(就是size为0),如果
- #文件不存在,就创建一个长度为0的文件(同touch)。
- N<>filename #为了读写"filename", 把文件"filename"打开, 并且将文件描
- #描述符N分配给它。如果filename不存在,就创建。如果N没有
- #指定,那默认就是fd 0,stdin 。
- 示例
- echo 1234567890 > File # 写字符串到"File".
- exec 3<> File # 打开"File"并且将fd 3分配给它.
- read -n 4 <&3 # 只读取4个字符.
- echo -n . >&3 # 写一个小数点.
- exec 3>&- # 关闭fd 3.
- cat File # ==> 1234.67890
- 关闭文件描述符
- n<&- # 关闭输入文件描述符n
- 0<&-, <&- # 关闭stdin
- n>&- # 关闭输出文件描述符n
- 1>&-, >&- # 关闭stdout
- ####比较####
- ls -yz >> command.log 2>&1 # 将错误选项"yz"的结果放到
- # 文件command.log中,因为 stderr
- # 被重定向到这个文件中,所有的错误消息
- # 也就被指向那里了(进入command.log)。
- ls -yz 2>&1 >> command.log # 输出一个错误消息, 但是并不写到文件中
- exec <filename # 将stdin重定向到文件中
再给出一个脚本:
- /bin/bash
- # 使用'exec'重定向stdin.
- exec 6<&0 # 将文件描述符#6与stdin链接起来.
- # 保存stdin.
- exec < data-file # stdin被文件"data-file"所代替.
- read a1 # 读取文件"data-file"的第一行.
- read a2 # 读取文件"data-file"的第二行.
- echo
- echo "Following lines read from file."
- echo "-------------------------------"
- echo $a1
- echo $a2
- echo; echo; echo
- exec 0<&6 6<&-
- # 现在将stdin从fd #6中恢复, 因为刚才我们把stdin重定向到#6了,
- #+ 然后关闭fd #6 ( 6<&- ), 好让这个描述符继续被其他进程所使用.
- #
- # <&6 6<&- 这么做也可以.
- echo -n "Enter data "
- read b1 # 现在"read"已经恢复正常了, 就是能够正常的从stdin中读取.
- echo "Input read from stdin."
- echo "----------------------"
- echo "b1 = $b1"
- echo
- exit 0
- [max@localhost xx]$ clear
- [max@localhost xx]$ cat 2
- /bin/bash
- # 使用'exec'重定向stdin.
- exec 6<&0 # 将文件描述符#6与stdin链接起来.
- # 保存stdin.
- exec < data-file # stdin被文件"data-file"所代替.
- read a1 # 读取文件"data-file"的第一行.
- read a2 # 读取文件"data-file"的第二行.
- echo
- echo "Following lines read from file."
- echo "-------------------------------"
- echo $a1
- echo $a2
- echo; echo; echo
- exec 0<&6 6<&-
- # 现在将stdin从fd #6中恢复, 因为刚才我们把stdin重定向到#6了,
- #+ 然后关闭fd #6 ( 6<&- ), 好让这个描述符继续被其他进程所使用.
- #
- # <&6 6<&- 这么做也可以.
- echo -n "Enter data "
- read b1 # 现在"read"已经恢复正常了, 就是能够正常的从stdin中读取.
- echo "Input read from stdin."
- echo "----------------------"
- echo "b1 = $b1"
- echo
- exit 0
3. shell中函数返回值最大的正整数是255.‘
4.调试shell的方法有下面这些
a): echo语句可以放在脚本中存在疑问的位置上, 来观察变量的值, 也可以了解脚本后续的动作;
b): 使用过滤器tee来检查临界点上的进程或数据流;
c):设置选项-n -v -x
sh -n scriptname不会运行脚本, 只会检查脚本的语法错误. 这等价于把set -n或set -o noexec插入脚本中。注意, 某些类型的语法错误不会被这种方式检查出来。
sh -v scriptname将会在运行脚本之前, 打印出每一个命令. 这等价于把set -v或set -o verbose插入到脚本中。
选项-n和-v可以同时使用. sh -nv scriptname将会给出详细的语法检查。
sh -x scriptname会打印出每个命令执行的结果, 但只使用缩写形式。 这等价于在脚本中插入set -x或set -o xtrace。
把set -u或set -o nounset插入到脚本中, 并运行它, 就会在每个试图使用未声明变量的地方给出一个unbound variable错误信息.
d):使用"assert"(断言)函数在脚本的临界点上测试变量或条件;
e):使用变量$LINENO和内建命令caller;
f):用trap捕获exit等信号,捕获exit在某些情况下很有用, 比如说强制"打印"变量值。trap命令必须放在脚本中第一个命令的位置上。
trap '' SIGNAL (两个引号之间为空)在剩余的脚本中禁用了SIGNAL信号的动作。trap SIGNAL则会恢复处理SIGNAL的动作。当你想保护脚本的临界部分不受意外的中断骚扰, 那么上面讲的这种办法就非常有用了。
如下:
- trap '' 2 # 信号2就是Control-C, 现在被禁用了.
- command
- command
- command
- trap 2 # 重新恢复Control-C
用trap捕获exit信号,来触发操作的脚本示例:
- #!/bin/bash
- trap 'echo Variable Listing -----a = $a b = $b' EXIT
- echo "This prints before the \"trap\" --"
- echo "Even though the script sees the \"trap\" first."
- echo
- a=39
- b=36
- exit 0
输出一下结果:
- This prints before the "trap" --
- Even though the script sees the "trap" first.
- Variable Listing -----a = 39 b = 36
5。shell选项,shell有很多选项,如下图所示:
好了,这是这几天的笔记、、、、、
转载于:https://blog.51cto.com/alkshao/519996
Shell 学习(七)-----杂项相关推荐
- 【shell学习】missing-semester-3-编辑器Vim
编辑器(Vim) 写英语单词和写代码是完全不同的活动.在编程时,与编写一长串文字相比,您需要花费更多的时间来切换文件.读取.导航和编辑代码.有不同类型的程序用于编写英文单词和代码(例如Microsof ...
- shell学习笔记 (2)
shell学习笔记 (2) ---china.pub.com linux shell电子书学习笔记 第2章 使用find和xargs find pathname -options [-print - ...
- STL源码剖析学习七:stack和queue
STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...
- 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等
1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...
- OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)
OpenCV与图像处理学习七--传统图像分割之阈值法(固定阈值.自适应阈值.大津阈值) 一.固定阈值图像分割 1.1 直方图双峰法 1.2 OpenCV中的固定阈值分割 二.自动阈值图像分割 2.1 ...
- PyTorch框架学习七——自定义transforms方法
PyTorch框架学习七--自定义transforms方法 一.自定义transforms注意要素 二.自定义transforms步骤 三.自定义transforms实例:椒盐噪声 虽然前面的笔记介绍 ...
- Shell学习之结合正则表达式与通配符的使用(五)
Shell学习之结合正则表达式与通配符的使用 目录 通配符 正则表达式与通配符 通配符 通配符的使用 正则表达式 正则表达式 正则表达式的使用 通配符 正则表达式与通配符 正则表达式用来在文件中匹配符 ...
- Docker学习七:使用docker搭建Hadoop集群
本博客简单分享了如何在Docker上搭建Hadoop集群,我的电脑是Ubuntu20,听同学说wsl2有些命令不对,所以建议在虚拟机里按照Ubuntu或者直接安装双系统吧 Docker学习一:Dock ...
- (转)MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码
http://blog.csdn.net/yerenyuan_pku/article/details/71909325 什么是逆向工程 MyBatis的一个主要的特点就是需要程序员自己编写sql,那么 ...
- Shell学习:关于替换命令-tr-ROT13法则
Shell学习:关于替换命令-tr-ROT13法则 [root@stu100 ~]# echo abcdef|tr 'abcdef' 'xyzabc' xyzabc [root@stu100 ...
最新文章
- 【免费CDN】俄罗斯DDOS-Guard 支持ssl 防御1.5T
- Android属性动画源代码解析(超详细)
- python里split_python中split()的用法
- js防篡改对象之不可扩展对象
- asp.net mvc 缓存CaChe使用
- ruby .each_Ruby中带有示例的Array.each方法
- 送书 | 获得诺贝尔奖之后影响力会下降?绘制精英科学家的职业生涯路线图
- cnblog div+CSS 布局常识 8问
- 分治算法兵乓球比赛日程(java)
- (十三)java多线程之Timer
- ubuntu系统下hbase数据库的安装和使用,hbase配置文件详解
- jquery 自定义事件
- 动态规划解决分割问题
- Codeforces123E. Maze【树形dp】【概率dp】【证明题】
- 海康录像机能用别的摄像头吗_海康威视录像机NVR如何添加其它品牌(大华)摄像头...
- 卫星控制类操作系统VAX/VMS简介
- 数据基础---《利用Python进行数据分析·第2版》第12章 pandas高级应用
- 趣图:程序员的斗志曲线图
- MipMap(纹理过滤)
- NLP(四十八)使用kenlm进行文本纠错
热门文章
- ExtJs6入门-使用SenchaCmd命令创建第一个ExtJs6的HelloWorld项目
- 国际通用计算机编码,ASCII 编码(美国信息交换标准代码)完整对照表
- 白名单里的蓝桥杯“计算思维”竞赛到底考啥,有啥用处?
- 计算机组成原理的基本知识
- unity开始游戏代码_Unity的代码之夏开始
- 免费的uml建模工具
- CentOS Linux release 7.7-安装搜狗输入法、Pycharm无法输入中文解决
- matlab第八课:图像分析(下)
- VCIP2020:VVC SCC中基于镜像模式的IBC
- codeforces 19E Fairy 树链剖分