linux shell 脚本攻略学习2
1.关于文件描述符和重定向:
文件描述符是与一个打开的文件或数据流相关联的整数。文件描述符0、1以及2是系统预留的.
0——stdin(标准输入)
1——stdout(标准输出)
2——stderr(标准错误)
使用“echo $?”来显示状态
- amosli@amosli-pc:~/learn$ echo $?
- amosli@amosli-pc:~/learn$ ls + > out.txt //没有任何输出,因为已经重定向到out.txt里面了
- amosli@amosli-pc:~/learn$ cat out.txt
- ls: cannot access +: No such file or directory
- amosli@amosli-pc:~/learn$ cmd &> output.txt
- amosli@amosli-pc:~/learn$ cat output.txt
- No command 'cmd' found, did you mean:
- Command 'dcmd' from package 'devscripts' (main)
- Command 'wmd' from package 'wml' (universe)
- Command 'amd' from package 'am-utils' (universe)
- Command 'tcmd' from package 'tcm' (universe)
- Command 'cme' from package 'libconfig-model-perl' (universe)
- Command 'cmp' from package 'diffutils' (main)
- Command 'qcmd' from package 'renameutils' (universe)
- Command 'mmd' from package 'mtools' (main)
- Command 'cm' from package 'config-manager' (universe)
- Command 'mcd' from package 'mtools' (main)
- Command 'icmd' from package 'renameutils' (universe)
- Command 'cad' from package 'rheolef' (universe)
- cmd: command not found
cat a* 输出所有以a开头的文件的内容
- amosli@amosli-pc:~/learn$ cat a* | tee out.txt | cat -n
- cat: a1: Permission denied
- a1
- a1
- #上面的代码所说的是,tee命令接收到来扑克stdin的数据,它将stdout的一份副本写入文件out.txt,同时将另一份副本作为后续命令的stdin,命令cat -n 将从stdin中接收到的每行数据前加上行号并写入stdout
- amosli@amosli-pc:~/learn$ cat out.txt
- a1
- a1
- amosli@amosli-pc:~/learn$ echo who is this |tee -
- who is this
- who is this
自定义文件描述符:
- amosli@amosli-pc:~/learn$ exec <input.txt #为读取文件创建一个文件描述符
- bash: input.txt: No such file or directory
- amosli@amosli-pc:~/learn$ echo this is a test line > input.txt
- amosli@amosli-pc:~/learn$ exec <input.txt
- amosli@amosli-pc:~/learn$ cat <&3 #使用自定义的文件描述3
- this is a test line
文件打模式,一般有三种模式,只读,截断,和追加模式。
<操作符用于从文件中读取至stdin中。>用于截断模式(个人理解即先清空文件里的内容,再写数据进去即为所谓的截断模式)。>>操作符用于追加模式的文件写入(数据被添加到文件的现有内容之后).
2.数组和关联数组
数组分为普通数组和关联数组,普通数组只能使用整数做索引,而关联数组可以使用字符串作为数组的索引。
关联数组在很操作中相当有用,Bash4.0开始支持关联数组,4.0以前版本不支持关联数组!
数组定义的方法:
1)
array=(1 2 3 4)
2).array[index]=value;
- amosli@amosli-pc:~/learn$ array_var[]="test1"
- amosli@amosli-pc:~/learn$ array_var[]="test2"
- amosli@amosli-pc:~/learn$ array_var[]="test3"
- amosli@amosli-pc:~/learn$ array_var[]="test4"
- amosli@amosli-pc:~/learn$ echo ${array_var[]}
- test1
- amosli@amosli-pc:~/learn$ echo ${array_var[]}
- test2
- amosli@amosli-pc:~/learn$ echo ${array_var[]}
- test3
- amosli@amosli-pc:~/learn$ echo ${array_var[]}
- test4
- amosli@amosli-pc:~/learn$ echo ${array_var[]}
- amosli@amosli-pc:~/learn$ index=;
- amosli@amosli-pc:~/learn$ echo ${array_var[$index]}
以清单方式列出所有数组的值:index使用*来进行匹配
- amosli@amosli-pc:~/learn$ echo ${array_var[*]}
- test1 test2 test3 test4
也可以使用@符号来做index
- amosli@amosli-pc:~/learn$ echo ${array_var[@]}
- test1 test2 test3 test4
定义关联数组:
首先,需要使用单独的一个变量名声明为关联数组,声明语句如下:
- declare -A ass_array
(1) 内嵌索引-值列表法,提供一个索引-值列表
- ass_array=([index1]=value1 [index2]=value2)
(2)独立的索引-值进行赋值
- ass_array[index1]=value1
- ass_array[index2]=value2
举例:
- amosli@amosli-pc:~/learn$ declare -A fruits_value
- amosli@amosli-pc:~/learn$ fruits_value[apple]="apple is 5 dollars"
- amosli@amosli-pc:~/learn$ fruits_value[pear]="pear is 3 dollars"
- amosli@amosli-pc:~/learn$ echo ${fruits_value[apple]}
- apple is dollars
列出数组索引:
- amosli@amosli-pc:~/learn$ echo ${!fruits_value[*]}#方法1
- apple pear
- amosli@amosli-pc:~/learn$ echo ${!fruits_value[@]}#方法2
- apple pear
3.使用别名
- amosli@amosli-pc:~/learn$ alias install='sudo apt-get install' #为sudo apt-get install设置别名install
这个关闭当前终端即会失效。
- amosli@amosli-pc:~/learn$ echo 'alias cmd="command seq"' >> ~/.bashrc #定义全局变量
- amosli@amosli-pc:~/learn$ vi /home/amosli/.bashrc #使用vi删除刚才设置的别名
4.获取终端信息
使用tput和stty两款工具
获取终端的行数和列数
- amosli@amosli-pc:~/learn$ tput cols
- amosli@amosli-pc:~/learn$ tput lines
打印终端的名称:
- amosli@amosli-pc:~/learn$ tput longname
- X11 terminal emulatoramosli@amosli-pc:~/learn$
- amosli@amosli-pc:~/learn$ tput setb no #更改背景色no可以取值为0-
- amosli@amosli-pc:~/learn$tput setb bold #字体加粗
5.获取、设置日期和延时
- amosli@amosli-pc:~/learn$ date
- 2013年 12月 19日 星期四 :: CST
打印纪元时,纪元时被定义为从1970年1月1日0时0分0秒起至当前时刻的总秒数,不包括闰秒
- amosli@amosli-pc:~/learn$ date +%s
按格式输出:
- amosli@amosli-pc:~$ date "+%d %b %Y"
- 12月
- amosli@amosli-pc:~$ date "+%d %B %Y"
- 十二月
- 格式列表如下:
星期 %a Sat- %A Saturday
- 月 %b Nov
- %B November
- 日 %d 19
- 固定日期格式mm/dd/yy %D 12/19/13
- 年 %y 13
- %Y 2013
- 小时 %I/%H 00
- 分钟 %M 41
- 秒 %S 10
- 纳秒 %N 696308515
- Unix纪元时 %s
延时
- sleep number_of_seconds
6.调试脚本
打印出所执行的每一行命令
- bash -x script.sh
- sh -x script.sh
可以在脚本使用set built-in 来启用或禁止调试打印
set -x:在执行时显示参数和命令
set +x:禁止调试
set -v:当命令进行读取时显示输入
set +v:禁止打印输入
实例:
- #debug.sh
- for i in {..}
- do
- set -x
- echo $i
- set +x
- done
- echo "Script executed"
- amosli@amosli-pc:~/learn$ sh -x debug.sh
- + set -x
- + echo {..}
- {..}
- + set +x
- Script executed
直接修改脚本
- #!/bin/bash -xv
7.函数和参数
定义函数
- function fname()
- {
- statements;
- }
- or
- fname()
- {
- statements;
- }
函数调用
- fname;
- fname arg1 arg2;#传递参数
示例:
- amosli@amosli-pc:~/learn$ fname(){
- > echo $,$;#访问参数1和参数2
- > echo "$@";#以列表的方式一次性打印所有参数
- > echo "$*";#类似于$@,但是参数被作为单个实体
- > return ;#返回值
- > }
- amosli@amosli-pc:~/learn$ fname ;
- ,
- 说明:
$1第一个参数- $2第二个参数
- $n第n个参数
- "$@"被扩展成 "$1" "$2" "$3"
- "$*"扩展成"$1c$2c$3", 其中c是IFS第一个字符
- "$@"使用最多, $*将所有的参数当做单个字符串
bash支持递归 ,可以了解一下Fork炸弹' :(){ :|:& };: '
导出函数,可以作用到子进程中
- export -f fname
函数及命令返回值
- cmd;
- echo $?#读取命令返回值
- 退出状态,成功退出,状态为0,否则,非0
8.读取命令序列输出(管道 pipe)
一个命令的输出可以作为另一个命令的输入,而这个命令的输出又会传递到另一个命令,依此类推,即是管道的思想。
- $cmd1 | cmd2 | cmd3
实例:
- amosli@amosli-pc:~/learn$ ls | cat -n > out.txt
- amosli@amosli-pc:~/learn$ cat out.txt
- a1
- a2
- a3
- debug.sh
- input.txt
- output.txt
- out.txt
- sleep.sh
- stderr.txt
- stdout.txt
- test1.txt
- uid.sh
- variables.sh
ls 的输出(当前目录内容的列表)被传递给cat -n ,cat -n 为通过stdin所接收到输入内容加上行号,然后将输出重定向到文件out.txt
读取命令输出
- cmd_output=$(COMMANDS) #subshell 子shell
- or
- cmd_output=`COMMANDS`#back-quote反引用
保留空格和换行符
- amosli@amosli-pc:~/learn$ cat -n> text.txt
- amosli@amosli-pc:~/learn$ cat text.txt
- amosli@amosli-pc:~/learn$ out=$(cat text.txt)
- amosli@amosli-pc:~/learn$ echo $out
- amosli@amosli-pc:~/learn$ out2="$(cat text.txt)" #这里依然丢失了,不知道为什么,应该会保留的。
- amosli@amosli-pc:~/learn$ echo $out2
- out=$(cat text.txt)
- echo $out #丢失所有换行符
- out="$(cat text.txt)"
- echo $out #保留
linux shell 脚本攻略学习2的更多相关文章
- linux shell 脚本攻略学习20--awk命令入门详解
awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...
- Linux Shell脚本攻略学习总结:一
终端打印 终端打印的常用命令有两个:echo和print 首先,我先介绍echo 1.echo echo这个命令接受三种形式的参数,实例如下: echo "Hello World" ...
- linux shell 脚本攻略学习19--sed命令详解
sed(意为流编辑器,英语“stream editor”的缩写)是Unix/linux常见的命令行程序.sed用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出,即文本替换.sed通常 ...
- Linux Shell 脚本攻略学习--四
linux中(chattr)创建不可修改文件的方法 在常见的linux扩展文件系统中(如ext2.ext3.ext4等),可以将文件设置为不可修改(immutable).某些文件属性可帮助我们将文件设 ...
- linux shell 脚本攻略学习3
1.Bash中的READ命令 #读取n个字符存入变量 read -n number_of_chars variable_name 示例: amosli@amosli-pc:~$ read -n var ...
- Linux Shell脚本攻略学习总结:三
根据扩展名切分文件名 首先,我们先来看两个例子: file_jpg="sample.jgp" name=${file_jpg%.*} echo File name is : $na ...
- Linux Shell脚本攻略学习总结:二
比较与测试 程序中的流程控制是由比较和测试语句来处理的. 我们可以用if,if else 以及逻辑运算符来执行测试,而用一些比较运算符来比较数据项.另外,有一个test 命令也可以用来进行测试.让我们 ...
- linux shell 脚本攻略学习12--文件权限详解,chmod命令详解,chown命令详解,chattr命令详解
文件权限详解 一.chmod命令详解 文件权限和所有权是Unix/Linux文件系统最显著的特征之一.linux中的每一个文件都与多种权限类型相关联,在这些权限中主要分类为3种: 用户(User)是文 ...
- linux shell 脚本攻略学习18--grep命令详解
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是unix/linux中用于文本搜索 ...
随机推荐
- JavaScript递归方法 生成 json tree 树形结构数据
//递归方法 生成 json tree 数据 var getJsonTree = function(data, parentId) { var itemArr = []; for (var i = 0 ...
- 八一八android开发规范(一种建议)
开发规范重不重要了,不言而喻.这里就给大家说一故事把——据<圣经·旧约·创世记>第11章记载,是当时人类联合起来兴建,希望能通往天堂的高塔.为了阻止人类的计划,上帝让人类说不同的语言,使人 ...
- 【Eclipse】Eclipse-Build-缓慢-卡住
Eclipse-Build-缓慢-卡住 eclipse building workspace 卡主_百度搜索 解决building workplace 导致的卡死,使得eclipse加速 - CSDN ...
- Spark的动态资源分配
跑spark程序的时候,公司服务器需要排队等资源,参考一些设置,之前不知道,跑的很慢,懂得设置之后简直直接起飞. 简单粗暴上设置代码: def conf(self): conf = super(Tbt ...
- Pearson(皮尔逊)相关系数
Pearson(皮尔逊)相关系数:也叫pearson积差相关系数.衡量两个连续变量之间的线性相关程度. 当两个变量都是正态连续变量,而且两者之间呈线性关系时,表现这两个变量之间相关程度用积差相关系数, ...
- Git创建分支/GIT提交分支
git clone xxx.git cd fwspp-react git init touch README.md git add README.md git commit -m "add ...
- C++ 纯虚方法
1.纯虚方法解决什么样的问题,为什么要设计出纯虚方法? 考虑下面的需求,基类声明了一个方法,这个方法只针对具体的子类才有意义,比如Animal的Eat()方法,调用Animal的Eat方法是没有意义的 ...
- junit mockito
package com.zendaimoney.util; import static org.mockito.Mockito.*;import static org.junit.Assert.*;i ...
- jstl函数的使用
1.fn:contains()和fn:containsIgnoreCase() fn:contains()函数用于确定一个字符串是否包含指定的子串. fn:containsIgnoreCase()函数 ...
- 从C++到java
C++和java都号称是面向对象的语言,虽然C++不完全算是.学习过C++如何快速对java有个大体的掌握,可以通过对比来进行了解. 首先还是来高大上一下,看看他们的使命: · C++ 被设计成主要用 ...