linux —— shell 编程(编程语法)
导读 |
本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展。(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) |
目录 |
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
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 $?
演示函数的返回值
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;
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 编程(编程语法)的更多相关文章
- Linux shell脚本编程(二)
Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...
- Linux shell脚本编程(一)
Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
- Linux shell脚本编程(三)
Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...
- Linux Shell脚本编程--Linux特殊符号大全
Linux Shell脚本编程--Linux特殊符号大全 linux_shell 特殊符号的介绍 2011
- Linux Shell脚本编程while语句
Linux Shell脚本编程while语句案例 1,每隔3秒,打印一次系统负载 #!/bin/bash while truedo uptime sleep 3done 2,把监控结果保存 ...
- Linux Shell脚本编程-基础1
概述: shell脚本在Linux系统管理员的运维工作中非常重要.shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求.本篇将从编程基础 ...
- Linux shell脚本编程基础之练习篇
shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash ] then echo "请输入一个参数& ...
- 【学习】Linux Shell脚本编程
1.脚本的组成和执行 Linux shell脚本的结构并不复杂,其主要由变量.内部命令以及shell的语法结构和一些函数.其他命令行的程序等组成,以下是一个简单的shell脚本. #!/bin/bas ...
- linux shell语言编程规范安全篇之通用原则【转】
shell语言编程规范安全篇是针对bash语言编程中的数据校验.加密与解密.脚本执行.目录&文件操作等方面,描述可能导致安全漏洞或风险的常见编码错误.该规范基于业界最佳实践,并总结了公司内部的 ...
- [linux] shell脚本编程-xunsearch安装脚本学习
安装脚本setup.sh #!/bin/sh # FULL fast install/upgrade script # See help message via `--help' # $Id$ # s ...
随机推荐
- C++线程类的封装
简单的C++线程操作的封装,使用了智能指针管理对象的释放. 可运行对象基类 class SimpleRunable:public RefCountedBase { public: SimpleRuna ...
- GDB源代码查找路径
在gdb程序的时候,有时候会发现源代码文件找不到,对于那些带调试信息的系统库或者第三方库,很多时候当你真正想gdb去追他源代码的时候你会发现gdb根本找不到这些源代码路径.这个时候有两种选择: [1] ...
- android关于installLocation
以下内容主要参考自官网的描述. 从Android API-8开始,android允许你将应用程序安装到外部存储空间中去(比方:SD卡),你可以在AndroidManifest.xml中添加androi ...
- TCPIP通信
最近在开发TCPIP通信,封装了3个类,望各位大神指点指点. using System; using System.Collections.Generic; using System.Text; us ...
- 【随记】修复TortoiseGit文件夹和文件状态图标不显示问题
一. 运行环境: 操作系统 Windows 10 64bit TortoiseGit (2.2.0.0) 64bit msysgit(2.9.2.1) 64bit 注意:请确保环境正确,软件的位数相匹 ...
- Action配置
Action是一个逻辑控制器,并不直接对浏览器生成响应,而是返回指定逻辑视图(一个字符串). 不推荐在Action的name属性值中使用点(.)和中划线(-),有可能会引发一些未知异常. 1使用A ...
- jquery 效果
效果1.基本效果 1.1 show([speed,[easing],[fn]]) 如果元素本身是可见的,则不对其作任何改变.如果元素是隐藏的,则使其可见. $("p&qu ...
- tornado学习精要
最简单的应用在程序的最顶部,我们导入了一些Tornado模块.虽然Tornado还有另外一些有用的模块,但在这个例子中我们必须至少包含这四个模块. 12341234包括了一个有用的模块(tornado ...
- Object之魔术函数__call() 处理错误调用
在提到__call之前,先来看一个实例的测试结果,以便更好地去了解__call方法的作用.上代码: <?php class Person{ function say(){ echo " ...
- C++编译器合成Default Constructor的4种情况
笔记C++编译器为编译器需要合成Default Constructor的4种情况. 1,Class A内含Class B对象,Class A没有Default Constructor时会在编译时合成D ...