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的更多相关文章

  1. linux shell 脚本攻略学习20--awk命令入门详解

    awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...

  2. Linux Shell脚本攻略学习总结:一

    终端打印 终端打印的常用命令有两个:echo和print 首先,我先介绍echo 1.echo echo这个命令接受三种形式的参数,实例如下: echo "Hello World" ...

  3. linux shell 脚本攻略学习19--sed命令详解

    sed(意为流编辑器,英语“stream editor”的缩写)是Unix/linux常见的命令行程序.sed用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出,即文本替换.sed通常 ...

  4. Linux Shell 脚本攻略学习--四

    linux中(chattr)创建不可修改文件的方法 在常见的linux扩展文件系统中(如ext2.ext3.ext4等),可以将文件设置为不可修改(immutable).某些文件属性可帮助我们将文件设 ...

  5. linux shell 脚本攻略学习3

    1.Bash中的READ命令 #读取n个字符存入变量 read -n number_of_chars variable_name 示例: amosli@amosli-pc:~$ read -n var ...

  6. Linux Shell脚本攻略学习总结:三

    根据扩展名切分文件名 首先,我们先来看两个例子: file_jpg="sample.jgp" name=${file_jpg%.*} echo File name is : $na ...

  7. Linux Shell脚本攻略学习总结:二

    比较与测试 程序中的流程控制是由比较和测试语句来处理的. 我们可以用if,if else 以及逻辑运算符来执行测试,而用一些比较运算符来比较数据项.另外,有一个test 命令也可以用来进行测试.让我们 ...

  8. linux shell 脚本攻略学习12--文件权限详解,chmod命令详解,chown命令详解,chattr命令详解

    文件权限详解 一.chmod命令详解 文件权限和所有权是Unix/Linux文件系统最显著的特征之一.linux中的每一个文件都与多种权限类型相关联,在这些权限中主要分类为3种: 用户(User)是文 ...

  9. linux shell 脚本攻略学习18--grep命令详解

    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是unix/linux中用于文本搜索 ...

随机推荐

  1. 创建SQL作业错误的解决方法(不能将值 NULL 插入列 'owner_sid',表 'msdb.dbo.sysjobs';列不允许有空值。)

    在用SQL语句创建SQL Server作业时有时出现如下错误: 消息 515,级别 16,状态 2,过程 sp_add_job,第 137 行 不能将值 NULL 插入列 'owner_sid',表  ...

  2. Base64原理与实现

    Base64编码说明 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式. 如果剩下的字符不足3个字节,则用0填充 ...

  3. 机器学习中的损失函数 (着重比较:hinge loss vs softmax loss)

    https://blog.csdn.net/u010976453/article/details/78488279 1. 损失函数 损失函数(Loss function)是用来估量你模型的预测值 f( ...

  4. Tensorflow进行POS词性标注NER实体识别 - 构建LSTM网络进行序列化标注

    http://blog.csdn.net/rockingdingo/article/details/55653279  Github下载完整代码 https://github.com/rockingd ...

  5. .NET 常用加密、解密& 数字签名算法

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Run ...

  6. Centos设置开机启动Apache和Mysql[总结]

    1.前言 最近学习搭建wordpress,需要用到apahce和mysql.我是下载源代码进行安装的,安装在/url/local目录下,每次开机都需要手动启动,有点麻烦.如是想设置开机启动,从网上查了 ...

  7. Cognos11中报XQE-JDB-0004查找驱动程序类错误

    1:问题描述,在cognos11中创建了一个数据源连接TestData, 类型为Microsoft SQL Server (OLE DB) 操作如下: 同时配置了jdbc的连接方式,如下图所示 测试数 ...

  8. 协程(Coroutine)并不是真正的多线程

    自:http://www.zhihu.com/question/23895384 说到Coroutine,我们必须提到两个更远的东西.在操作系统(os)级别,有进程(process)和线程(threa ...

  9. Android ListView 和 ***Adapter 从本地/网络获取歌曲列表

    本文内容 环境 项目结构 测试数据 演示 1:SimpleAdapter 演示 2:BaseAdapter 演示 3:CustomLazyList 演示 4:CustomLazyCompleteLis ...

  10. 关于ngModelOptions用法总结 让校验不过的验证绑定ngModel

    updataOn 指定ng-model以什么绑定事件触发 default 就是默认的大家都知道blur 失去焦点的时候更新mouseover 鼠标滑过....... <input type=&q ...