shell学习之变量、判断、重复动作
1.1 环境以及变量的定义、赋值、展开、删除
- export:将一个变量导入到环境中:export PATH=$PATH:/home。
- readonly 讲一个变量设置为只读模式,在shell脚本中定义字面值常量特别有用:readonly days_per_week=7, readonly -p 打印当前环境只读模式变量。
- env可以对命令执行时的环境做更细致的控制:env -i PATH=$PATH HOME=$HOME awk '...' file1, 执行awk命令时的环境仅仅为env指定的环境。
- unset 删除变量:unset [-v] full_name,删除函数:unset -f func。
1.2 参数展开扩展知识
在展开参数获取参数值时可以做额外的处理。
1.2.1 常用替换运算符
- ${varname:-word} 如果varname存在且非NULL, 则返回其值,否则返回word。例子:par1=${1:-100} && echo $par1。
- ${varname:=word}如果varname存在且非null,则返回其值;否则,设置varname值为word,并且返回varname的值。
- ${varname:?message}如果varname存在且非null,则返回它的值;否则显示varname:message信息,并退出当前脚本。
- ${varname:+word}如果varname存在且非null,则返回word;否则返回null。用于测试变量是否存在。
1.2.2 模式匹配运算符
多用于处理路径类型的变量,做路径提取或者文件名提取。
- ${var#pattern}:如果模式匹配与变量值得开头处,则删除匹配的最短部分,返回剩下的部分;如果不匹配则返回var。
- ${var##pattern}:如果模式匹配与变量值得开头处,则删除匹配的最长部分,返回剩下的部分;如果不匹配则返回var。
- ${var%pattern}:如果模式匹配与变量值得结尾处,则删除匹配的最短部分,返回剩下的部分;如果不匹配则返回var。
- ${var%%pattern}:如果模式匹配与变量值得结尾处,则删除匹配的最长部分,返回剩下的部分;如果不匹配则返回var。
1.2.3 位置参数
位置参数即shell脚本的命令行参数,他们的名称用单个的整数来命名,如果整数大于9必须用花括号({})括起来。另外需要注意的:
- $#:用于获取参数的总数。
- $*和$@:一次表示所有的命令行参数。
- "$*":引用所有的参数,但是将所有的命令行参数视为单个字符串,等同于"$1 $2 $3.... "。
- "$@":引用所有的参数,但将所有的命令行参数视为单独的个体,等同于"$1" "$2"...。
- set和shift:set 可以重新设置新的参数 set -- hello world ,将1设置为hello,将2设置为world,shift 参数列表左移。
1.2.4 特殊变量
- ?:前一个命令的退出状态。
- $:shell进程的进程编号。
- 0:shell进程的程序名称。
- HOME:登陆目录。
- IFS:内部的字段分隔符。
- LINENO:刚执行过的行在脚本或者函数内的行编号。
- PATH:命令查找路径。
- PWD:当前工作目录。
1.2.5 算数展开
shell里面的算数运算都置于((...))中,比如 echo $((i++)) 。注意:POSIX规定,算数运算使用的是C的带有正负号的长整数,不一定支持浮点数。
1.3 退出状态
shell中,退出状态为0表示成功,其他的任何退出状态都为失败,可以用exit number来指定脚本退出时的返回值。
1.4 测试命令
shell 中的测试命令为test或[ .... ],在分支和循环判断中常用[ ... ]做条件测试。常用的两类测试:测试文件,测试比较表达式。
字符串测试:
- [ string ] :string不为null则为真。
- [ -z string ]:string为null则为真。
文件测试:
- [ -f file ]:file为一般文件则返回真,其他的文件测试-b 块设备文件、-c 字符设备文件、-d 目录文件、-e 文件存在、-g 文件有设置setgid、-h 符号链接文件、-p 管道文件、-r 文件可读、-S socket文件、 -s 文件非空、 -t 文件描述符执行终端、 -u 文件有设置setuid、-w 文件可以写、-x 文件可以执行.
表达式测试:
- [ s1 = s2 ]:字符串s1与s2是否相同。
- [ s1 != s2 ]:字符串s1与s2不相同。
- [ n1 -eq n2 ]:整数n1等于n2。
- [ n1 -nq n2 ]:整数n1不等于n2。
- [ n1 -lt n2 ]:整数n1小于n2。
- [ n1 -gt n2 ]:整数n1大于n2。
- [ n1 -le n2 ]:整数n1小于等于n2。
- [ n1 -ge n2 ]:整数n1大于等于n2。
条件测试的几个注意点:
- 字符串相关变量的测试,变量展开后加引号。if [ -f "$file" ] 比 if [ -f $file ]更好。
- 只能做整数数字测试。
1.5 分支语句if-elif-else-fi
if分支语句示例:
if grep "hello" file1 > /dev/null
then
echo "file1 has hello"
elif grep "hello" file2 > /dev/null
then
echo "file2 has hello"
else
echo "no-file has hello"
fi
分支判断的pipeline可以是多条语句的逻辑表达式:!、&&、 ||,比如:
#!/bin/bash if grep "hello" file1 > /dev/null || grep "hello" file2 > /dev/null
then
echo "file1 or file2 has hello"
fi
1.6 分支case语句
case使用示例:
#!/bin/bash my_var=
my_str="B" case $my_var in
)
printf "1\n"
;;
)
printf "2\n"
;;
*)
printf "else\n"
;;
esac case $my_str in
"a" | "A")
printf "a\n"
;;
"b" | "B")
printf "b\n"
;;
*)
printf "else\n"
;;
esac
case的分支可以使用多个模式,多个模式间只要用|隔开即可。
1.7 循环语句
for循环用于重复整个对象列表,依次执行每一个独立对象的循环内容,下面的脚本利用for循环依次处理当前目录的文件和目录,sample example如下:
#!/bin/bash
for i in `ls`
do
echo $i
done
while循环和until循环为基于条件condition的循环,不同之处在于:只要condition是成功退出,while会继续循环,只要condition为成功结束,until则执行循环。
while简单示例如下:
#!/bin/bash cat /etc/passwd | awk 'BEGIN{FS=":";OFS=" "};{print $1,$3}'|
while read user id
do
printf "username is $user, and id is $id\n"
done
until简单示例如下:
#!/bin/bash
#等待特定用户登录
printf "Enter username: "
read user until who | grep "$user" > /dev/null
do
printf "$user not login in.\n"
sleep
done
1.8 shell中的函数
shell学习之变量、判断、重复动作的更多相关文章
- Shell学习(六)——条件判断总结
Shell学习(六)--条件判断总结 [1]https://www.cnblogs.com/zhw-626/p/8528001.html [2]https://www.cnblogs.com/yizh ...
- Shell学习笔记 - 条件判断式
1. 判断格式 1) test 参数 文件 例: test -e /root/install.log 2) [ 参数 文件 ] -- 推荐使用 例: [ -e /root/install.log ] ...
- linux shell 学习笔记--变量声明与赋值,循环
Bash 变量是不分类型的 ------------------------ 不像其他程序语言一样,Bash 并不对变量区分"类型".本质上,Bash 变量都是字符串. 但是依赖于 ...
- Shell学习之环境变量配置文件(三)
Shell学习之环境变量配置文件 目录 环境变量配置文件简介 环境变量配置文件作用 其他配置文件和登录信息 环境变量配置文件简介 环境变量配置文件简介 环境变量配置文件中主要是定义对系统操作环境生效的 ...
- Shell学习小结 - 深入认识变量
移动端访问不佳,请访问我的个人博客 变量的命名 对于初学者来说,可以简单的理解为,变量就是保存在计算机内存中的一系列的键值对. 列如: str="hello" 这里的str就是变量 ...
- shell中的条件判断、参数以及变量替换
文章转自: http://www.cnblogs.com/maxupeng/archive/2011/07/02/2096551.html 一.test命令 test命令是shell内部命令,它计算作 ...
- SHELL学习笔记----IF条件判断,判断条件
SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外. if list then do something here ...
- 【转】shell学习笔记(二) ——shell变量
在shell中有3种变量:系统变量,环境变量和用户变量,其中系统变量在对参数判断和命令返回值判断时会使用,环境变量主要是在程序运行时需要设置,用户变量在编程过程中使用量最多. 1 系统变量 变量名 ...
- Shell学习之Bash变量详解(二)
Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...
随机推荐
- HDU 5726 GCD(DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5726 [题目大意] 给出数列An,对于询问的区间[L,R],求出区间内数的GCD值,并且求出GCD ...
- externkeyword放到函数体内而导致的linkage问题
不少人都知道,C/C++语言编程时,假设要引用在别的C/C++文件里定义的变量或函数,必须extern一下,才干使用 另一些人知道,这个extern事实上能够放在函数体内声明,这么做的理由是不想让其它 ...
- 【Android】手机号码获取问题
手机号码不是所有的都能获取.只是有一部分可以拿到.这个是由于移动运营商没有把手机号码的数据写入到sim卡中.SIM卡只有唯一的编号,供网络与设备识别那就是IMSI号码,手机的信号也可以说是通过这个号码 ...
- [置顶] WebService调用工具(AXIS2)
package com.metarnet.util; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Meth ...
- 加装 ImageMagick 性能更佳!
1. 下载 Download ImageMagick 以此文件ImageMagick-6.9.1-10-Q16-x64-dll-win进行,第二次开发的研发 2. 安装 Install ImageMa ...
- 射频识别技术漫谈(18)——Mifare Desfire
Mifare DESFire(MF3 IC D40/D41,本文以D40为例)遵守14443 TypeA协议,卡内的数据以文件形式存储,所以有人认为它是准CPU卡,主要用于安全性要求较高的非接触式领 ...
- 完成端口(Completion Port)详解(超级长,超级清楚)
http://www.cnblogs.com/lancidie/archive/2011/12/19/2293773.html
- Foundation Sorting: Single List Insertion Sort
/* List Insertion Sorting. * Implementation history:. * 2013-09-15, Mars Fu, first version. */ #incl ...
- ActionScript3游戏中的图像编程(连载十七)
总文件夹:http://blog.csdn.net/iloveas2014/article/details/38304477 1.3.3 HSB与RGB之间的互转公式及HSL和HSV对色彩属性理解的异 ...
- aliyun硬盘挂载
实在难以忍受公司服务器的网络问题,停用了半年的aliyun服务器今天终于决定启用了. 购买的时候是40G的硬盘空间,首先查了一硬盘情况结果发现有一个分区居然没有挂载. 第一步是创建一个分区 输入命令 ...