由于项目要招聘需要有经验shell开发人员(awk编程),而作为技术面试官(暂时)的我对shell编程不太熟;当然以前也写过一些shell脚本来满足项目的需求—备份环境,数据库(逻辑)。假如只是针对awk编程的,那我绝对可以问倒他,呵呵…。所以我最近学习了shell编程。入门还不是很深,但是还是有点心得的。以下是本人的一些心得;大伙们觉得好,就拍个砖,不好也拿起你们的手鼓个掌…当然文中有什么错误,遗漏的也请指正我,大伙们对shell的总结也可以在下面回复。

1.   shell之read命令

1.1 对read的参数p,t,s,n。在此我就不作什么描述了。但对参数a还是做下。Read也可以申明数组,例如read01.sh

#!bin/bash
#author li0924
read -p "please entry your name: " -a name #执行在此输入多个字符串,以空格为分隔符
echo ${#name[@]}; #打印数组元素的个数
echo ${name[]}; #打印第一个数组元素,注意数组是以下标为0开始

1.2  读文件;这个可能我们对read用到最多。每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。读取文件的关键是如何将文本中的数据传送给read命令。最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令。例如read02.sh

date文件:

a  A
b B
e E
c C
d D
e E
f F
#!/bin/bash
count=
while read line #cat 命令的输出作为read命令的输入,read读到的值放在line中
do
echo "$count:$line"
count=$(($count + ))
done < date #当然你可以在while前面加 “cat date |“来替换”<date”
exit

1.3   大家有没有觉得这个效果跟awk ’{print FNR”:”$0}’ date一样。暂不作描述;本文重点不是awk。在上脚本;read后面只有变量line;其实可以跟很多变量。这个有点类似于awk中的$1-$9。例如read03.sh

#!/bin/bash
cat date| while read one two three #cat 命令的输出作为read命令的输入,read读到的值放在line中
do
echo "${one}:${two}:${three}"
done
exit

拓展:Read命令用法我们知道了;最后留一个问题给大伙;该脚本中把three删除;打印$two是什么?添加four;打印$four有是什么?

2.    数组

2.1 数组的常规用法;数组的下标是从0开始的;这个在前面有提到!

A=(a b c def)    # 定义$A数组
${A[@]} 或 ${A[*]} 可得到 a b c def (全部元素)
${A[]} 可得到 a (第一个数组元素),${A[1]} 则为第二个数组元素
${#A[]} 可得到 1 (第一个数组元素(a)的长度),
${#A[]} 可得到 3 (第四个数组(def)的长度)
A[]=xyz 将第4个数组重新定义为 xyz

2.2  数组的长度

${#A[*]}或者${#A[@]}

2.3 删除数组unset 数组[下标] 可以清除相应的元素,不带下标,清除整个数据

unset A[]    #删除第一个元素
unset A #删除数组A

2.4 特殊使用通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,例如下面测试

[li0924@localhost shell]$ A=(a b c def)       #定义一个数组A
[li0924@localhost shell]$ echo ${A[@]::} #取前三个元素
a b c
[li0924@localhost shell]$ B=(${A[@]::}) #这个类似于B=(a b c);其中括号里面是上述生产的
[li0924@localhost shell]$ echo ${B[@]}
a b c
[li0924@localhost shell]$ echo ${A[@]}
a b c def

讲到${数组名[@或*]:起始位置:长度}是返回字符串;接下来我们学习字符串的处理

3. 字符串处理

其实shell语言不像其他编程语言对字符串处理的内置函数。这个也是我觉得shell很难学懂原因。慢慢发现shell主要功能不是针对文本处理,处理数据的。所以这部分自己理解就行了。我们定义一个变量file=/dir1/dir2/dir3/my.file.txt

3.1  求字符串长度

[li0924@localhost shell]$ echo ${#file}

[li0924@localhost shell]$ echo $file | awk '{print length($0)}'  #当然你也可以借用awk中的length函数

3.2 替换字符串

[li0924@localhost shell]$ echo ${file/dir/path}
/path1/dir2/dir3/my.file.txt
[li0924@localhost shell]$ echo ${file//dir/path}
/path1/path2/path3/my.file.txt

拓展: 当然你也可以用sed或者awk中的sub,gsub来实现。

[li0924@localhost shell]$ echo $file | sed 's/dir/path/'
/path1/dir2/dir3/my.file.txt
[li0924@localhost shell]$ echo $file | sed 's/dir/path/g'
/path1/path2/path3/my.file.txt

3.3   截取字符串 --${变量名:起始位置:长度}

[li0924@localhost shell]$ echo ${file::}
/dir1
[li0924@localhost shell]$ echo ${file::} #下标是从0开始的;从0和1开始是有区别的;这个跟sql是不同。
dir1/
[li0924@localhost shell]$ echo ${file: -} #只提取最后4位.注意:跟-4之间是有空格的;这个做个记号A
.txt

拓展:这里同样也可以用awk的substr函数实现。暂不演示。
    4. 对未设定,空值的变量操作

Shell对这些操作有很多,大伙可以自己去查看资料。我们暂时只讲${变量名:-默认值}。假如变量是为定义或者是空值就取默认值。有点类似于sql中的nvl函数。

[li0924@localhost shell]$ name=lottu                #定义一个变量
[li0924@localhost shell]$ echo $name
lottu
[li0924@localhost shell]$ echo ${name:-li0924} #name的值是lottu。所以结果是lottu
lottu
[li0924@localhost shell]$ unset name
[li0924@localhost shell]$ echo ${name:-li0924} #name是未定义,所以取默认值li0924
li0924

拓展:对上述的记号A。去掉空格看下;无论file是否有值;效果都不是。

[li0924@localhost shell]$ echo $file
/dir1/dir2/dir3/my.file.txt
[li0924@localhost shell]$ echo ${file:-}
/dir1/dir2/dir3/my.file.txt
[li0924@localhost shell]$ unset file
[li0924@localhost shell]$ echo ${file:-}

5. shell中的三目表达式
            5.1 我们的shell对三目表达式别具风格。语法是expr && cmd1 ||cmd2

[li0924@localhost shell]  [  -gt  ] && echo "" ||echo ""

5.2对数字运算也可以使用expr?cmd1:cmd2

[li0924@localhost shell]$ (( a =>?: ))
[li0924@localhost shell]$ echo $a

6.对冒号:和内置命令true

在某些条件判断,我们不需要做什么操作;但未了代码的完整性,我们可以在其中添加:或者true。这个类似其它语言的null。暂作简单测试。这里的:等价于true。

[li0924@localhost shell]$ [  -lt  ] && : ||echo ""

[li0924@localhost shell]$ [  -gt  ] && : ||echo ""
[li0924@localhost shell]$ echo $? [li0924@localhost shell]$ [ -gt ] && true ||echo ""
[li0924@localhost shell]$ echo $?

最后奉送shell入门视频http://www.cppcourse.com/shell-programming

Shell—学习之心得的更多相关文章

  1. shell学习总结之自定义函数

    shell学习总结之自定义函数 Myfun (){ echo -n "now i is $i " ! [ "$i" ] && exit ; ec ...

  2. SHELL学习笔记----IF条件判断,判断条件

    SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here   ...

  3. shell学习笔记

    shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...

  4. shell学习指南-阅读笔记

    shell学习指南真不是刚开始学习shell应该看得书,虽然其中讲了简单的linux命令,shell语法等,但是每章也有些深入和生僻地方,我想如果我刚学shell看到这样的地方一定会头疼的要死.或许也 ...

  5. 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等

    1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...

  6. Shell学习之结合正则表达式与通配符的使用(五)

    Shell学习之结合正则表达式与通配符的使用 目录 通配符 正则表达式与通配符 通配符 通配符的使用 正则表达式 正则表达式 正则表达式的使用 通配符 正则表达式与通配符 正则表达式用来在文件中匹配符 ...

  7. Shell学习之条件测试(四)

    Shell学习之条件测试 目录 逻辑测试 文件测试 数值比较 字符串比较 逻辑测试 格式: [ 表达式 ] 操作符 [ 表达式2 ] …… 命令1 操作符 命令2 …… 常用的操作符 ( 注意:-a和 ...

  8. Shell学习之环境变量配置文件(三)

    Shell学习之环境变量配置文件 目录 环境变量配置文件简介 环境变量配置文件作用 其他配置文件和登录信息 环境变量配置文件简介 环境变量配置文件简介 环境变量配置文件中主要是定义对系统操作环境生效的 ...

  9. Shell学习之Bash变量详解(二)

    Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...

随机推荐

  1. MvvmLight 绑定

    添加MvvmLight引用,通过Nuget: 加载nuget以后会有ViewModelLocator.cs: 新建自己的ViewModel,继承ViewModelBase: View 通过资源引用Vi ...

  2. UIButton属性

    1.UIButton状态: UIControlStateNormal          // 正常状态    UIControlStateHighlighted     // 高亮状态    UICo ...

  3. ARC机制下组合关系

    // //  Person.h //  01-autorelease基本概念 // //  Created by apple on 14-3-18. //  Copyright (c) 2014年 a ...

  4. PostgreSQL数据库系统的进程结构

    PostgreSQL数据库系统的主要功能都集中于Postgres程序,其入口是Main模块中的main函数,在初始化数据集簇,启动数据库服务器是,都将从这里开始执行.Main模块主要的工作时确定当前的 ...

  5. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. javascript语法详解

    javascript语法:运算符 条件语句if...else...  条件语句switch  循环语句for  循环语句while   跳转语句 js运算符 1.算数运算符:+ - * % / ++ ...

  7. UVALive 7148 LRIP【树分治+线段树】

    题意就是要求一棵树上的最长不下降序列,同时不下降序列的最小值与最大值不超过D. 做法是树分治+线段树,假设树根是x,y是其当前需要处理的子树,对于子树y,需要处理出两个数组MN,MX,MN[i]表示以 ...

  8. JSon_零基础_003_将Map集合对象转换为JSon格式的对象字符串,返回给界面

    将Map集合对象转换为JSon格式的对象字符串,返回给界面 需导入的jar包: 编写servlet: package com.west.webcourse.servlet; import java.i ...

  9. Windows平台上安装搭建iPhone/iPad的开发环境

    http://www.cnblogs.com/hanxianlong/archive/2015/09/20/4824227.html http://blog.csdn.net/yahohi/artic ...

  10. docker gitlab

    Alternatively, you can manually launch the gitlab container and the supporting postgresql and redis ...