SHELL (3) —— 变量知识进阶和实践
摘自:Oldboy Linux运维——SHELL编程实战
SHELL中特殊切重要的变量
位置变量 | 作用说明 |
$0 | 获取当前执行的Shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径 |
$n |
获取当前执行的Shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名; 如果n大于9,则用大括号括起来,例如${10},接的参数以空格隔开 |
$# | 获取当前执行的Shell脚本后面接的参数的总个数 |
$* |
获取当前Shell脚本所有传参的参数,不加引号和$@相同; 如果给$*加上双引号,例如:"$*",则表示将所有的参数视为单个字符串,相当于"$1 $2 $3" |
$@ |
获取当前Shell脚本所有传参的参数,不加引号和$*相同; 如果给$@加上双引号,例如:"$@",则表示将所有的参数视为不同的独立字符串,相当于"$1" "$2" "$3" "..."。 这是将多参数传递给其他程序的最佳方式,因为它会保留所有的内嵌在每个参数里的任何空白。 当"$@"和"$*"都加双引号时,两者是有区别的;都不加双引号时,两者无区别 |
dirname命令的作用是获取脚本的路径。
bashname命令的作用是获取脚本的名字。
[root@yeebian ~]# vim /tmp/variable.sh
#!/bin/bash
dirname $0
basename $0
[root@yeebian ~]# bash /tmp/variable.sh
/tmp
variable.sh
$#特殊变量获取脚本传参个数的实
[root@yeebian tmp]# vim variable.sh
#!/bin/bash
#表达式方式
[ $# -ne 2 ]&&{
echo "Must two args."
exit 1
}
echo oldgirl
[root@yeebian tmp]# bash variable.sh 12
Must two args.
[root@yeebian tmp]# bash variable.sh 12 8
oldgirl [root@yeebian tmp]# vim variable.sh
#!/bin/bash
#if判断语句方式
if [ $# -ne 2 ]
then
echo "USAGE:/bin/sh $0 arg1 arg2"
exit 1
fi
echo $1 $2
[root@yeebian tmp]# bash variable.sh good
USAGE:/bin/sh variable.sh arg1 arg2
[root@yeebian tmp]# bash variable.sh good bad
good bad
SHELL进程中的特殊状态变量
位置变量 | 作用说明 |
$? | 获取执行上一个指令的执行状态返回值(0为成功,非零为失败),可根据返回值来判断软件的安装步骤是否成功 |
$$ | 获取当前执行的Shell脚本的进程号(PID) |
$! | 获取上一个在后台工作的进程的进程号(PID) |
$_ | 获取在此之前执行的命令或脚本的最后一个参数 |
在企业场景下,“$?”返回值的用饭如下:
1)判断命令、脚本或函数等程序是否执行成功。
2)若在脚本中调用执行“exit数字”,则会返回这个数字给“$?”变量。
3)如果是在函数里,则通过“return数字”把这个数字以函数返回值的形式传给“$?”
Shell变量子串说明
表达式 | 说明 |
${parameter} | 返回变量$parameter的内容 |
${#parameter} | 返回变量$parameter内容的长度(按字符),也适用于特殊变量 |
${parameter:offset} | 在变量${parameter}中,从位置offset之后开始提取子串到结尾 |
${parameter:offset:length} | 在变量${parameter}中,从位置offset之后开始提取长度为length的子串 |
${parameter#word} | 从变量${parameter}开头开始删除最短匹配的word子串 |
${parameter##word} | 从变量${parameter}开头开始删除最长匹配的word子串 |
${parameter%word} | 从变量${parameter}结尾开始删除最短匹配的word子串 |
${parameter%%word} | 从变量${parameter}结尾开始删除最长匹配的word子串 |
${parameter/patern/string} | 使用string代替第一个匹配的pattern |
${parameter//pattern/string} | 使用string代替所有匹配的pattern |
[root@yeebian ~]# cat parameter.sh
#!/bin/bash
#1.定义TEST变量,截取其内容,从第二个字符之后开始截取,默认截取后面字符的全部,第二个字符不包含在内,也可理解为删除前面的多个字符。
TEST="It is a test"
echo $TEST
echo "1.${TEST:2}" #2.截取TEST变量内容,从第二个字符之后开始截取,截取两个字符。
echo -e "2.${TEST:2:2}\n" #3.从变量$TEST内容的开头开始删除最短匹配"a*C"及"a*c"的子串。
TEST=abcABC123ABCabc
echo $TEST
echo "3.${TEST#a*C}"
echo -e " ${TEST#a*c}\n" #4.从变量$TEST开头开始删除最长匹配"a*C"及“a*c”的子串。
echo "4.${TEST##a*C}"
echo -e " ${TEST##a*c}\n"
#5.从变量$TEST结尾开始删除最短匹配"a*C"及"a*c"的子串。
echo "5.${TEST%a*C}"
echo -e " ${TEST%a*c}\n"
#6.从变量$TEST结尾开始删除最长匹配"a*C"及"a*c"的子串。
echo "6.${TEST%%a*C}"
echo -e " ${TEST%%a*c}\n"
#7.使用testing字符串代替变量$TEST匹配的test字符串。
TEST="It is a test."
echo $TEST
echo "7.${TEST//test/testing}" #其中一个“/”表示替换匹配的第一个字符串;两个“/”表示替换匹配的所有字符串。
[root@yeebian ~]# bash parameter.sh
It is a test
1. is a test #<==相当于从t开始计算,包含空格在内,一起截取到结尾
2. i #<==截取空格和i两个字符
abcABC123ABCabc
3.123ABCabc
ABC123ABCabc
4.abc 5.abcABC123ABCabc
abcABC123ABC
6.abcABC123ABCabc It is a test.
7.It is a testing.
去掉下面所有文件的文件名中的“_finished”字符串
[root@yeebian ~]# ll *.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_1_finished.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_2_finished.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_3_finished.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_4_finished.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_5_finished.jpg
[root@yeebian ~]# file=stu_102999_1_finished.jpg
[root@yeebian ~]# mv $file `echo ${file//_finished/}`
[root@yeebian ~]# ll *.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_1.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_2_finished.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_3_finished.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_4_finished.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_5_finished.jpg
[root@yeebian ~]# for file in `ls *fin*.jpg`;do mv $file `echo ${file//_finished/}`;done #for循环实现批量处理
[root@yeebian ~]# ll *.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_1.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_2.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_3.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_4.jpg
-rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_5.jpg
Shell特殊扩展变量说明
表达式 | 说明 |
${parameter:-word} |
如果parameter的变量值为空或未赋值,则会返回word字符串并替代变量的值 用途:如果变量未定义,则返回备用的值,防止变量为空值或因未定义而导致异常 |
${parameter:==word} |
如果parameter的变量值为空或未赋值,则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用 用途:基本同上一个${parameter:-word},但该变量又额外给parameter变量赋值了 |
${parameter:?word} |
如果parameter变量值为空或未赋值,那么word字符串将被作为标准错误输出,否则输出变量的值。 用途:用于捕捉由于变量未定义而导致的错误,并退出程序 |
${parameter:+word} | 如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值 |
例子
1.[root@yeebian ~]# echo $test [root@yeebian ~]# result=${test:-UNSET}
[root@yeebian ~]# echo $result
UNSET
2.[root@yeebian ~]# echo $result [root@yeebian ~]# echo $test [root@yeebian ~]# result=${test:=UNSET}
[root@yeebian ~]# echo $result
UNSET
[root@yeebian ~]# echo $test
UNSET
3.[root@yeebian ~]# echo $test [root@yeebian ~]# echo ${test:?testing}
-bash: test: testing
[root@yeebian ~]# test=1
[root@yeebian ~]# echo ${test:?testing}
1
4.[root@yeebian ~]# echo $test [root@yeebian ~]# result=${test:+testing}
[root@yeebian ~]# echo $result [root@yeebian ~]# test=four
[root@yeebian ~]# result=${test:+testing}
[root@yeebian ~]# echo $result
testing
删除7天前过期数据备份
[root@yeebian ~]# vim del.sh
#!/bin/bash
find ${path:-/tmp} -name "*.tar.gz" -type f -mtime +7 | xargs rm -f
[root@yeebian ~]# bash -x del.sh
+ find /tmp -name '*.tar.gz' -type f -mtime +7
+ xargs rm -f
SHELL (3) —— 变量知识进阶和实践的更多相关文章
- Shell变量知识进阶
一,Shell中特殊且重要的变量 $0结合dirname和basename分别取出脚本名称和脚本路径 [root@192-168-3-163 scripts]# cat test.sh #!/bin/ ...
- 第三章:shell变量知识进阶
特殊变量:位置变量大于9的时候,需要加上(),例如$(10)$*获取脚本的所有参数,如果不加""和$@是一样的效果,如果加上"",则表示所有参数组成一个字符串$ ...
- shell脚本基础知识以及变量
一.基础知识 1.shell脚本的格式注意事项 第一行(一般必须写明):指定脚本使用的shell(若不写明也不影响脚本的执行,系统会自动以sh解析脚本)."#!/bin/bash" ...
- shell变量赋值进阶
首先,要理解shell中变量的3种赋值情况: unset 例子. unset a 空字符串, null 例子. a='' 非空,即不是unset,并且不是空字符串 例子: a=1 or a=b等 然后 ...
- shell脚本—基础知识,变量
shell脚本本质: 编译型语言 解释型语言 shell编程基本过程 1.建立shell文件 2.赋予shell文件执行权限,使用chmod命令修改权限 3.执行shell文件 shell变量: sh ...
- 【Linux】Shell三类变量的作用域——linux shell “永久环境变量”、“临时环境变量”和"普通变量"之完全解读
2015-05-08 00:15 3896人阅读 评论(10) 收藏 举报 本文章已收录于: 分类: 软件开发进阶(419) 作者同类文章X Unix/Linux杂项(118) 作者同类文章X ...
- Shell编程(二)——shell的基础知识及常用命令
shell的基础知识 一.bash有以下特点: 1.记录命令历史 2.指令和文件名补全 3.别名 alias rm='rm -i' 4.通配符 * 0个或多个字符 ?匹配一个字符 5 输入输出重定向 ...
- 什么是Shell?Shell脚本基础知识详细介绍
这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 ...
- 第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器
第四章 基础知识进阶第十七节 迭代.可迭代对象.迭代器 一. 引言 本来计划讲完元组和字典后就讲列表解析和字典解析,但要理解列表解析和字典解析,就需要掌握Python的高级的类型迭代器,因此本节 ...
随机推荐
- MySQL在x64系统上1067问题解决
最近一个项目需要用到MYSQL,因为以前也弄过,所以就没怎么多想,直接下一个完事了.于是乎果断上官方网站下了一个installer(5.26),修改了一下默认位置和配置,然后一路next,最后在配置完 ...
- laravel从5.2到5.5从入门到精通视频教程共16套
laravel从5.2到5.5从入门到精通视频教程共16套,大部分都是实战项目比如P2P.博客.短网址.知乎门户.app软件开发.微信商城实战等 课程目录: 01.Laravel框架从入门到精通02. ...
- 微软职位内部推荐-Software Development Engineer II_Commerce
微软近期Open的职位: Are you looking for a high impact project that involves processing of billions of dolla ...
- PAT甲题题解-1088. Rational Arithmetic (20)-模拟分数计算
输入为两个分数,让你计算+,-,*,\四种结果,并且输出对应的式子,分数要按带分数的格式k a/b输出如果为负数,则带分数两边要有括号如果除数为0,则式子中的结果输出Inf模拟题最好自己动手实现,考验 ...
- 12.18daily_scrum
本软件中的最后一个界面——“关于”界面的设计已经开始进行,数据传输的内容也差不多进行过半,最主要的任务依旧在测试过程中,我们组接下来还是要大力加强测试的强度和数量,注意边际数据和错误数据的测试处理: ...
- “数学口袋精灵”第二个Sprint计划(第三天)
“数学口袋精灵”第二个Sprint计划----第三天进度 任务分配: 冯美欣:欢迎界面的背景音乐完善 吴舒婷:游戏界面的动作条,选择答案后的音效 林欢雯:代码算法设计 进度: 冯美欣:欢迎界面背景 ...
- 在 Ubuntu16.04 中搭建 Spark 单机开发环境 (JDK + Scala + Spark)
1.准备 本文主要讲述如何在Ubuntu 16.04 中搭建 Spark 2.11 单机开发环境,主要分为 3 部分:JDK 安装,Scala 安装和 Spark 安装. JDK 1.8:jdk-8u ...
- PAT 甲级 1078 Hashing
https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592 The task of this probl ...
- Linux命令(十一) 显示文件类型 file
命令介绍 file 命令是用来显示文件的类型,对于每个给定的参数,该命令试图将文件分类,分辨的类型有文本文件.可执行文件.压缩文件.或其它可理解的数据格式. 常用参数介绍 -b 不显示文件名称,只显示 ...
- Yii 框架的Rbac [权限控制]
转载自 xmlife 的博客 : http://blog.csdn.net/xmlife/article/details/50733451 1.首先我们要在配置文件的组件(component)里面配置 ...