由于项目要招聘需要有经验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. checkbox的完美用户体验(转)

    如需查看效果-->自行建个html文件,或者-->原文:http://bbs.blueidea.com/thread-2711834-1-7.html 最常见的checkbox的使用: & ...

  2. iOS - (利用/调用系统定位获取当前经纬度与地理信息)

    这些天做iOS项目的时候,需要通过定位来拿到当期城市的名称.百度地图SDK有这个功能,但为了不依赖第三方,这里使用iOS自带框架CoreLocation来实现这个需求.iOS8出来之后,针对定位需要多 ...

  3. websocket 待更新

    https://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=2652545551&idx=1&sn=403b75d95cf191 ...

  4. Linux脚本实现“按任意键继续/Press any key to continue”效果

    此代码来自lnmp一键安装包,用于实现“按任意键继续/Press any key to continue”效果: get_char() { SAVEDSTTY=`stty -g` #隐藏终端输入显示 ...

  5. 12c Grid Infrastructure Management Repository (GIMR)

    1.什么是管理资料库(Management Repository) 管理资料库是12c中oracle clusterware管理的一个单实例数据库.对应的数据库名是MGMTDB.因为是一个单实例数据库 ...

  6. 改变对update的做法

    以前都是 先根据id或者其他条件查出来  再根据查出来的结果 进行修改  再update提交 这里可以改所有的字段 现在是做法 是直接new 一个 Do或者Vo  把要改变的值 先填充进去  然后再去 ...

  7. CPU虚拟化技术(留坑)

    留坑~~~ 不知道这个是这么实现的 CPU虚拟化技术就是单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率.虚 ...

  8. 怎么查找执行比较慢的sql语句-DBA给的建议

    1.使用sql动态视图 如下: b.text,a.total_worker_time,a.total_logical_reads,a.total_elapsed_time,execution_coun ...

  9. NSCoding归档

    大家都知道ios中数据持久化的方式有plist sqlite coredata nscoding 而nscoding不需要关心模型属性有多少个,是什么类型,不需要定义归档文件的规则. 下面给个类大家用 ...

  10. Notice: Undefined offset 的解决方法

    Notice: Undefined offset: 1 in D:\wwwroot\wr\askseo\404.php on line 5 Notice: Undefined offset: 2 in ...