导读

本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展。(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行)


目录
  1. 再识变量
  2. 函数
  3. 条件语句
  4. 循环语句
1、再识变量

Shell 中有3种变量:用户变量、位置变量、环境变量

用户变量

用户变量就是用户在Shell编程过程中定义的变量,分为全局变量和局部变量。默认情况下,用户定义的变量为全局变量,如果要指定局部变量,需要使用local限定词

1)Shell 中的特殊符号:

特殊字符列表如下:

~    主目录,相当与$HOME

`     命令替换,如 echo `pwd`

#    脚本注释

$    变量表达式符号

&    后台作业,将此符号置于命令末端则让命令与后台运行

*    字符串通配符

(  )   ( 启动子Shell    ) 停止子Shell

\    转义下一个字符

|    管道

[  ]    [ 开始字符集通配符号  ] 结束字符集通配符号

{  }   { 开始命令块    }结束命令块

;    Shell 命令分隔符    

'  "    强引用  和 弱引用

> <    输出重定向 和 输入重定向

/      路径名目录分隔符

?      单个任意字符

!      管道行逻辑 NOT

变量的表达方式 $var 实际上是 ${var} 的简写形式,{}的形式好处如: ${10} ${Var}_ 以及可以进行下面的字符串高级操作

2)字符串操作符

字符串处理运算符允许你完成如下操作:

  • 保证变量存在且有值
  • 设置变量的默认值
  • 捕获未设置变量而导致的错误
  • 删除匹配模式的变量的值部分内容

替换运算符:
${varname:-word}    varname 存在且非null,返回varname , 否则返回word  (未定义返回默认值)
${varname:=word}     varname 存在且非null,返回varname , 否则返回word,并且将varname 置为word (未定义设置默认值)
${varname:?message}  varname 存在且非null,返回varname , 否则打印 message , 并退出当前脚本。
              message 默认为parameter null or not set      (捕捉未定义而导致的错误)
${varname:+word}    varname 存在且非null,返回 word; 否则返回 null     (测试变量是否存在)

模式匹配运算符:
${varname#pattern}    如果模式匹配变量值取值的 开头 处,则删除匹配的最 短 部分,并返回剩下部分
${varname##pattern}    如果模式匹配变量值取值的 开头 处,则删除匹配的最 长 部分,并返回剩下部分
${varname%pattern}     如果模式匹配变量值取值的 结尾 处,则删除匹配的最 短 部分,并返回剩下部分
${varname%%pattern}    如果模式匹配变量值取值的 结尾 处,则删除匹配的最 长 部分,并返回剩下部分
${varname/pattern/str}    替换第一个匹配的部分, 如果模式以#开头则匹配varname开头,%开头 则结尾
${varname//pattern/str}   替换所有匹配的部分
                str 为空则删除匹配部分,varname 为@或* 则依次应用于每个参数并拓展为结果列表

例子:line="arg=123"  : echo ${line%=*}   echo ${line#*=}

位置变量

$#    $?   $0    $*     分别表示传递给本脚本的 参数个数、上一条命令的返回值、第一个参数、所有参数

shift :  Shell 内置命令,可以截去参数列表最左边一个

#!/bin/bash
# 依次读取打印文件
while [ -e $ ];
do
cat $
shift
done

shift.sh

环境变量

查看另一篇博文:变量基础  设置环境变量

2、函数

1)Shell 命令执行顺序

交互Shell 在获取用户输入是,并不是直接在PATH 路径中查找,而是按照固定顺序依次寻找命令位置:

  • 别名    即使用alias command="..." 创建的命令
  • 关键字   如 if, for
  • 函数    当前声明的函数
  • 内置命令  如 cd,pwd
  • 外部命令      即脚本或可执行程序,这才在PATH路径中查找

type 命令:可以查询命令的类型

2) 函数的使用规则

函数使用时,应遵守一些重要规则:

  • 函数必须先定义,后使用
  • 函数在当前环境运行,共享调用它的脚本中的变量,函数可以接收位置参数,局部变量使用local限定
  • exit 退出整个脚本, return 返回调用处,返回值为最后一条命令的退出状态
  • 内置命令 export -f 可以将函数导出到子Shell中
  • 如果函数保存在其他文件中,可以使用source 或dot 将它们装入当前脚本中
  • 函数可以递归调用,并且没有调用限制
  • declare -f 可以找到登录会话中定义的函数,按字母打印(很多,more less 辅助阅读)-F 则仅看函数名。

3)若想每次启动系统是自动加载函数,只需要将函数写入启动文件中。例如,$HOME/.profile   ,则source $HOME/.profile 会自动加载函数。

4)定义和删除函数

function functionname ()   # 这种情况,()不是必须的
{ Shell commands}
functionname ()
{ Shell commands}

删除函数:

unset -f functionname
~:cat add.sh
#! /bin/bash
# 数字相加
add ()
{
let "sum=$1+$2"
return $sum
} ~: source add.sh
~: add
~: echo $?

演示函数的返回值

3、条件语句
语句结构

if/else 语法结构如下:

if condition
then
statments
[elif condition
then statement ...]
[else
statements]
fi

这里的condition不是一般的布尔表达式,而是语句列表,语句有各种退出状态。

POSIX 定义的退出状态的含义

退出状态值与对应的含义
0 命令成功退出
>0 在重定向或单词展开期间(~、变量、命令、算数展开、单词切割)失败
1~125 命令退出失败。特定退出值的定义,参见不同命令的定义
126 命令找到,但无法执行
127 命令无法找到
>128 命令因收到信号而死亡

退出的状态可以进行逻辑操作:

if ! condition
then
statement
fi
if condition1 && condition2
then
statement
fi
if condition1 || condition2
then
statement
fi
条件测试

1) if 语句 使用test

  if 语句唯一可以测试的内容是退出状态。不能用于检测表达式的值。但是通过test命令,可以将表达式值的测试与if语句连用

if test "2>3"
then
...
fi

等价于:

if [ "2>3" ]          # 注意:这里[后的空格,和]前的空格是必须要加的
then
...
fi

test "" 或 [ "" ] 返回值:0 表示expression 参数为true, 1 表示expression参数为false 或丢失, >1 发生错误

2) 字符串比较 (使用test)

字符串操作符及其含义

操作符 如果...则为真
str1 = str2 str1 匹配 str2
str1 != str2 str1 不匹配 str2
str1 /< str2 str1 小于 str2
str2 /> str2 str1 大于 str2
-n str1 str1 为非null (长度大于0)
-z str1 str1 为null (长度为0)

shell 默认所有的变量都为字符串,如果要当成数字来处理,则比较符号为: -eq -gt -lt

3) 文件属性的检查(使用test)

操作符 如果...则为真
-b file  file 为块设备文件
-c file  file 为字符设备文件
-d file  file 为目录
-e file file 存在 
-f file  file 为一般文件
-g file  file 有设置它的setgid位
-h file file 为符号连接
-L file  同 -h
-p file  file 为管道
-r file  file 可读
-S file  file 为套接字(socket)
-s file  file 非空
-u file  file 有设置它的setuid位
-w file file 可写
-x file fil可执行,如果是目录,则file可被查找
-O file 你是file的所有者
-G file file 的组ID匹配你的ID
file -nt file2 file1 比file2 新
file1 -ot file2 file1 比file2 旧

4)case 语句

case expression in
pattern1)
statements;;
pattern2 | pattern3)
statements;;
esac;
4、循环语句
for name [in list]
do
....
done

例子:

for file in *.mp3
do
mpg123 $file
done

遍历当前目录一级目录文件

for file in `find . -iname *.mp3`
do
mpg123 $file
done

遍历当前目录下所有文件

关于getopt 的例子:点这里

while/until 循环:

while condition  #condition 为真时继续
do
statements
done
until condition  #condition 为假时继续
do
statements
done

循环支持,break 和 continue ,如果嵌套循环,还可以在后面加上层数来控制跳出:

while condition
do
while condition
do
break
done
done

linux —— shell 编程(编程语法)的更多相关文章

  1. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  2. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  3. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  4. Linux Shell脚本编程--Linux特殊符号大全

    Linux Shell脚本编程--Linux特殊符号大全 linux_shell 特殊符号的介绍 2011

  5. Linux Shell脚本编程while语句

    Linux Shell脚本编程while语句案例 1,每隔3秒,打印一次系统负载 #!/bin/bash while truedo    uptime    sleep 3done 2,把监控结果保存 ...

  6. Linux Shell脚本编程-基础1

    概述:  shell脚本在Linux系统管理员的运维工作中非常重要.shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求.本篇将从编程基础 ...

  7. Linux shell脚本编程基础之练习篇

    shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash ] then echo "请输入一个参数& ...

  8. 【学习】Linux Shell脚本编程

    1.脚本的组成和执行 Linux shell脚本的结构并不复杂,其主要由变量.内部命令以及shell的语法结构和一些函数.其他命令行的程序等组成,以下是一个简单的shell脚本. #!/bin/bas ...

  9. linux shell语言编程规范安全篇之通用原则【转】

    shell语言编程规范安全篇是针对bash语言编程中的数据校验.加密与解密.脚本执行.目录&文件操作等方面,描述可能导致安全漏洞或风险的常见编码错误.该规范基于业界最佳实践,并总结了公司内部的 ...

  10. [linux] shell脚本编程-xunsearch安装脚本学习

    安装脚本setup.sh #!/bin/sh # FULL fast install/upgrade script # See help message via `--help' # $Id$ # s ...

随机推荐

  1. linux下安装svn(基于编码的方式)

    svn是什么,相信能看到这里的同学应该不会有这个问题了,费话不多说,开始: 1.创建目录 mkdir /home/svn/ 2.获取安装svn所需源文件(svn的官方网址是http://subvers ...

  2. 平衡搜索树(三) B-Tree

    B树的简介 B 树是为了磁盘或其它存储设备而设计的一种多叉平衡查找树.与红黑树很相似,但在降低磁盘I/0操作方面要更好一些(树的深度较低).许多数据库系统都一般使用B树或者B树的各种变形结构.B树与红 ...

  3. jquery返回顶部-ie6配合css表达式。

    css: .wraper{ width:980px; height:2048px; margin:0 auto; background:#ccc; } /*返回头部*/ #backToTop a{;; ...

  4. >炫酷的计时器效果Canvas绘图与动画<

    >炫丽的计时器效果Canvas绘图与动画< 虽然我是学习java的,但是因为最近使用html5的关系,多学习了一下前端知识. 现在,我要介绍的计时器是十分炫酷的,使用画布完成. 喜欢htm ...

  5. python基础之列表常用操作及知识点小结

    列表(list) List(列表) 是 Python 中使用最频繁的数据类型.列表可以完成大多数集合类的数据结构实现.它支持字符,数字,字符串甚至可以包含列表(所谓嵌套).列表用[ ]标识,是pyth ...

  6. 关于如何设置reduce的个数

    在默认情况下,一个MapReduce Job如果不设置Reducer的个数,那么Reducer的个数为1.具体,可以通过JobConf.setNumReduceTasks(int numOfReduc ...

  7. Tomcat架构(二)

    5.容器组件 这一小节中我们将讨论请求处理组件:引擎(engine).虚拟主机.上下文(context)组件. 5.1.引擎(engine) 引擎表示可运行的Catalina的servlet引擎实例并 ...

  8. unity Character Controller 点滴

    unity Character Controller  点滴 1.今天在做角色的时候,发现人物跳不起来,原来设置这个属性即可,Step Offset, 这个是台阶的高度,这个值设置的越大,人物爬的越高 ...

  9. KeilC51使用详解 (三)

    C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统. 第一节 本征库函数(intrinsic rou ...

  10. 迅雷创始人程浩:创业公司5招做好内部创新(组建小型敢死队:一共3个人,一个产品经理,两个研发;腾讯做不做这个项目是一个伪命题;让用户来验证,而不是相反 good)

    欢迎关注“创事记”的微信订阅号:sinachuangshiji 文/程浩 编者按:本文首发于微信公众号“浩哥说”(ID:haogetalks),作者程浩,迅雷创始人.内容为作者在混沌AI成长营上的演讲 ...