摘自: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命令的作用是获取脚本的名字。

  1. [root@yeebian ~]# vim /tmp/variable.sh
  2. #!/bin/bash
  3. dirname $0
  4. basename $0
  5. [root@yeebian ~]# bash /tmp/variable.sh
  6. /tmp
  7. variable.sh

$#特殊变量获取脚本传参个数的实

  1. [root@yeebian tmp]# vim variable.sh
  2. #!/bin/bash
  3. #表达式方式
  4. [ $# -ne 2 ]&&{
  5. echo "Must two args."
  6. exit 1
  7. }
  8. echo oldgirl
  9. [root@yeebian tmp]# bash variable.sh 12
  10. Must two args.
  11. [root@yeebian tmp]# bash variable.sh 12 8
  12. oldgirl
  13.  
  14. [root@yeebian tmp]# vim variable.sh
  15. #!/bin/bash
  16. #if判断语句方式
  17. if [ $# -ne 2 ]
  18. then
  19. echo "USAGE:/bin/sh $0 arg1 arg2"
  20. exit 1
  21. fi
  22. echo $1 $2
  23. [root@yeebian tmp]# bash variable.sh good
  24. USAGE:/bin/sh variable.sh arg1 arg2
  25. [root@yeebian tmp]# bash variable.sh good bad
  26. 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
  1. [root@yeebian ~]# cat parameter.sh
  2. #!/bin/bash
  3. #1.定义TEST变量,截取其内容,从第二个字符之后开始截取,默认截取后面字符的全部,第二个字符不包含在内,也可理解为删除前面的多个字符。
  4. TEST="It is a test"
  5. echo $TEST
  6. echo "1.${TEST:2}"
  7.  
  8. #2.截取TEST变量内容,从第二个字符之后开始截取,截取两个字符。
  9. echo -e "2.${TEST:2:2}\n"
  10.  
  11. #3.从变量$TEST内容的开头开始删除最短匹配"a*C"及"a*c"的子串。
  12. TEST=abcABC123ABCabc
  13. echo $TEST
  14. echo "3.${TEST#a*C}"
  15. echo -e " ${TEST#a*c}\n"
  16.  
  17. #4.从变量$TEST开头开始删除最长匹配"a*C"及“a*c”的子串。
  18. echo "4.${TEST##a*C}"
  19. echo -e " ${TEST##a*c}\n"
  20. #5.从变量$TEST结尾开始删除最短匹配"a*C"及"a*c"的子串。
  21. echo "5.${TEST%a*C}"
  22. echo -e " ${TEST%a*c}\n"
  23. #6.从变量$TEST结尾开始删除最长匹配"a*C"及"a*c"的子串。
  24. echo "6.${TEST%%a*C}"
  25. echo -e " ${TEST%%a*c}\n"
  26. #7.使用testing字符串代替变量$TEST匹配的test字符串。
  27. TEST="It is a test."
  28. echo $TEST
  29. echo "7.${TEST//test/testing}" #其中一个“/”表示替换匹配的第一个字符串;两个“/”表示替换匹配的所有字符串。
  30. [root@yeebian ~]# bash parameter.sh
  31. It is a test
  32. 1. is a test #<==相当于从t开始计算,包含空格在内,一起截取到结尾
  33. 2. i #<==截取空格和i两个字符
  34. abcABC123ABCabc
  35. 3.123ABCabc
  36. ABC123ABCabc
  37. 4.abc
  38.  
  39. 5.abcABC123ABCabc
  40. abcABC123ABC
  41. 6.abcABC123ABCabc
  42.  
  43. It is a test.
  44. 7.It is a testing.

去掉下面所有文件的文件名中的“_finished”字符串

  1. [root@yeebian ~]# ll *.jpg
  2. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_1_finished.jpg
  3. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_2_finished.jpg
  4. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_3_finished.jpg
  5. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_4_finished.jpg
  6. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_5_finished.jpg
  7. [root@yeebian ~]# file=stu_102999_1_finished.jpg
  8. [root@yeebian ~]# mv $file `echo ${file//_finished/}`
  9. [root@yeebian ~]# ll *.jpg
  10. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_1.jpg
  11. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_2_finished.jpg
  12. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_3_finished.jpg
  13. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_4_finished.jpg
  14. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_5_finished.jpg
  15. [root@yeebian ~]# for file in `ls *fin*.jpg`;do mv $file `echo ${file//_finished/}`;done #for循环实现批量处理
  16. [root@yeebian ~]# ll *.jpg
  17. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_1.jpg
  18. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_2.jpg
  19. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_3.jpg
  20. -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_4.jpg
  21. -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. 1.[root@yeebian ~]# echo $test
  2.  
  3. [root@yeebian ~]# result=${test:-UNSET}
  4. [root@yeebian ~]# echo $result
  5. UNSET
  6. 2.[root@yeebian ~]# echo $result
  7.  
  8. [root@yeebian ~]# echo $test
  9.  
  10. [root@yeebian ~]# result=${test:=UNSET}
  11. [root@yeebian ~]# echo $result
  12. UNSET
  13. [root@yeebian ~]# echo $test
  14. UNSET
  15. 3.[root@yeebian ~]# echo $test
  16.  
  17. [root@yeebian ~]# echo ${test:?testing}
  18. -bash: test: testing
  19. [root@yeebian ~]# test=1
  20. [root@yeebian ~]# echo ${test:?testing}
  21. 1
  22. 4.[root@yeebian ~]# echo $test
  23.  
  24. [root@yeebian ~]# result=${test:+testing}
  25. [root@yeebian ~]# echo $result
  26.  
  27. [root@yeebian ~]# test=four
  28. [root@yeebian ~]# result=${test:+testing}
  29. [root@yeebian ~]# echo $result
  30. testing

删除7天前过期数据备份

  1. [root@yeebian ~]# vim del.sh
  2. #!/bin/bash
  3. find ${path:-/tmp} -name "*.tar.gz" -type f -mtime +7 | xargs rm -f
  4. [root@yeebian ~]# bash -x del.sh
  5. + find /tmp -name '*.tar.gz' -type f -mtime +7
  6. + xargs rm -f

SHELL (3) —— 变量知识进阶和实践的更多相关文章

  1. Shell变量知识进阶

    一,Shell中特殊且重要的变量 $0结合dirname和basename分别取出脚本名称和脚本路径 [root@192-168-3-163 scripts]# cat test.sh #!/bin/ ...

  2. 第三章:shell变量知识进阶

    特殊变量:位置变量大于9的时候,需要加上(),例如$(10)$*获取脚本的所有参数,如果不加""和$@是一样的效果,如果加上"",则表示所有参数组成一个字符串$ ...

  3. shell脚本基础知识以及变量

    一.基础知识 1.shell脚本的格式注意事项 第一行(一般必须写明):指定脚本使用的shell(若不写明也不影响脚本的执行,系统会自动以sh解析脚本)."#!/bin/bash" ...

  4. shell变量赋值进阶

    首先,要理解shell中变量的3种赋值情况: unset 例子. unset a 空字符串, null 例子. a='' 非空,即不是unset,并且不是空字符串 例子: a=1 or a=b等 然后 ...

  5. shell脚本—基础知识,变量

    shell脚本本质: 编译型语言 解释型语言 shell编程基本过程 1.建立shell文件 2.赋予shell文件执行权限,使用chmod命令修改权限 3.执行shell文件 shell变量: sh ...

  6. 【Linux】Shell三类变量的作用域——linux shell “永久环境变量”、“临时环境变量”和"普通变量"之完全解读

      2015-05-08 00:15 3896人阅读 评论(10) 收藏 举报 本文章已收录于:   分类: 软件开发进阶(419) 作者同类文章X Unix/Linux杂项(118) 作者同类文章X ...

  7. Shell编程(二)——shell的基础知识及常用命令

    shell的基础知识 一.bash有以下特点: 1.记录命令历史 2.指令和文件名补全 3.别名 alias rm='rm -i' 4.通配符 * 0个或多个字符 ?​匹配一个字符 5 输入输出重定向 ...

  8. 什么是Shell?Shell脚本基础知识详细介绍

    这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 ...

  9. 第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器

    第四章 基础知识进阶第十七节 迭代.可迭代对象.迭代器 一.    引言 本来计划讲完元组和字典后就讲列表解析和字典解析,但要理解列表解析和字典解析,就需要掌握Python的高级的类型迭代器,因此本节 ...

随机推荐

  1. 基于Shader实现的UGUI描边解决方案

    基于Shader实现的UGUI描边解决方案 前言 大扎好,我系狗猥.当大家都以为我鸽了的时候,我又出现了,这也是一种鸽.创业两年失败后归来,今天想给大家分享一个我最近研究出来的好康的,比游戏还刺激,还 ...

  2. "Regressing Robust and Discriminative 3D Morphable Models with a very Deep Neural Network" 解读

    简介:这是一篇17年的CVPR,作者提出使用现有的人脸识别深度神经网络Resnet101来得到一个具有鲁棒性的人脸模型. 原文链接:https://www.researchgate.net/publi ...

  3. arduino按钮使用的两个小实验

    一:按钮控制一个灯                                                                                            ...

  4. PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789177.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  5. 1090. Highest Price in Supply Chain (25)-dfs求层数

    给出一棵树,在树根出货物的价格为p,然后每往下一层,价格增加r%,求所有叶子节点中的最高价格,以及该层叶子结点个数. #include <iostream> #include <cs ...

  6. LeetCode 633. Sum of Square Numbers平方数之和 (C++)

    题目: Given a non-negative integer c, your task is to decide whether there're two integers a and b suc ...

  7. Daily Scrumming* 2015.12.12(Day 4)

    一.团队scrum meeting照片 二.今日总结 姓名 WorkItem ID 工作内容 签入链接以及备注说明  江昊 任务1036 进行界面开发,明日准备开发第一个界面,社团展示界面 工作暂未完 ...

  8. 【Alpha】第三次Scrum meeting

    今日任务一览: 导航栏诞生 前期准备的Latex文本将撰写完毕 生成燃尽图的问题已经解决 姓名 今日完成任务 所耗时间 刘乾 用Github成功生成了燃尽图(真是不容易啊...),与架构师继续每日面基 ...

  9. YQCB冲刺第二周第五天

    今天的任务为实现由用户设置每月初始额度的功能. 昨天的任务为实现精准查账的功能. 遇到的问题为界面的布局以及精准查账按什么标准查找,最后决定按分类查账与时间查账相结合. 站立会议 任务面板

  10. VC2013一些感受

    这是一个我很早就在用的编译器,因为是微软官方的,极其高大上,安装包,界面错误的提示处理都相当简洁明了,不像VC6.0以及Codeblock太low了 但其实,我想说,我并不怎么用这玩意~就像Siri做 ...