Shell变量知识进阶

一、shell中特殊且重要的变量

1、特殊位置变量

在shell中存在着一些特殊且重要的变量,例如:$0、$1、$#,我们可以称之为特殊位置变量。要想从命令行、函数或脚本执行等传递参数时,就需要在Shell脚本中使用位置参数变量。

常用的特殊位置参数变量,如图:

举例说明:
$0

[[email protected] ~]# cat a.sh
echo $0
[[email protected] ~]# sh a.sh
a.sh
[[email protected] ~]# sh /root/a.sh
/root/a.sh
[[email protected] ~]# dirname /root/a.sh
/root
//只输出路径名称
[[email protected] ~]# basename /root/a.sh
a.sh
//只输出脚本名称

$n

[[email protected] ~]# cat a.sh
echo $1 $2 $3 $4 $5
[[email protected] ~]# sh a.sh a b c d e f
a b c d e
[[email protected] ~]# cat a.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[[email protected] ~]# sh a.sh {a..z}
a b c d e f g h i a0 a1 a2 a3 a4 a5
//输出第10个位置参数时就不正常了
[[email protected] ~]# cat a.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
[[email protected] ~]# sh a.sh {a..z}
a b c d e f g h i j k l m n o
//这样就正常了,位置变量大于9,数字必须用“{}”括起来

$#

[[email protected] ~]# cat a.sh
echo $#
[[email protected] ~]# sh a.sh a b c d e f
6

**$***

[[email protected] ~]# cat a.sh
echo $*
[[email protected] ~]# sh a.sh "a b" c d e
a b c d e

[email protected]

[[email protected] ~]# cat a.sh
echo [email protected]
[[email protected] ~]# sh a.sh "a b" c d e
a b c d e f

不带引号的“$*”和“[email protected]”输出的结果是一样的!

*"$"**

[[email protected] ~]# cat a.sh
for i in "$*";do echo $i;done
[[email protected] ~]# sh a.sh "a b" c d e
a b c d e

"[email protected]"

[[email protected] ~]# cat a.sh
for i in "[email protected]";do echo $i;done
[[email protected] ~]# sh a.sh "a b" c d e
a b
c
d
e

2、特殊状态变量

如图:

举例说明:
$?

[[email protected] ~]# pwd
/root
[[email protected] ~]# echo $?
0
[[email protected] ~]# fsdafasdf
bash: fsdafasdf: 未找到命令...
[[email protected] ~]# echo $?
127
//执行正确的命令返回值是0,不正确的是非0。
[[email protected] ~]# cat a.sh
if
    [ $# -ne 2 ]
then
    echo "cuowu!"
    exit 123              //执行脚本错误时,$?的值为123
fi
[[email protected] ~]# sh a.sh
cuowu!
[[email protected] ~]# echo $?
123

这个命令对于新手来说,非常有用!

“$?”返回值的用法:

  • 判断命令、脚本或函数等程序是否执行成功;
  • 若在脚本中调用执行“exit 数字”,则会返回这个数字给“$?”变量;
  • 如果是在函数里,则通过“return数字”把这个数字以函数返回值的形式传给“$?”变量;

剩下的有关“$$”、“$!”、“$_”不太常用,这里也不举例说明了!

二、shell内置变量命令

shell中包含一些内置命令,这些内置命令在目录列表里是看不到的,它们由shell本身提供。常用的内部命令有:echo、eval、exec、export、read、shift。接下来了解一下这些命令的功能。

echo命令
将echo命令后面指定的字符串及变量等内容显示到标准输出。

echo的常用的参数,如图:

举例说明:

[[email protected] ~]# echo one;echo two
one
two
[[email protected] ~]# echo -n one;echo two
onetwo
//不换行输出
[[email protected] ~]# echo -e "one\ttwo\nthree\tfour"
one two
three   four
//之间的空隙就是“\t”的作用,“\n”换行
[[email protected] ~]# echo -e "1\b23"
23
//“\b”的作用是退格,所以把1挡住了

关于echo命令很常用的,也没什么难度,所以就介绍这么多!

关于eval命令不太常用,本人也没怎么使用过,就不班门弄斧了!

exec命令:

exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程(也就是最初的Shell)也就终止了,示例如下:

[[email protected] ~]# exec date
Sun Sep 15 12:05:22 CST 2019
[[email protected] ~]$
//退回到特权模式

read命令:
从标准输入字符串等信息,传给Shell程序内部定义的变量。

shift命令:
将位置参数$1、$2等进行左移,如果位置变量是$1、$2、$3,那执行一次shift后,$3就变成了$2,$2就变成了$1,$1也就消失了。

三、shell变量字符串

常用的选项举例:

(1)查询字符长度值

举例说明:
定义变量:

[[email protected] ~]# a=abcdef
[[email protected] ~]# echo ${a}
abcdef
[[email protected] ~]# echo $a
abcdef

返回变量值的长度

[[email protected] ~]# echo ${#a}
6

扩展:

[[email protected] ~]# echo $a | wc -L
6
//使用wc命令统计长度
[[email protected] ~]# expr length "$a"
6
//使用expr的length函数计算
[[email protected] ~]# echo "$a" | awk ‘{print length($0)}‘
6
//使用awk的length函数计算变量长度

这几张方式,最快的就是${#变量名}这种方式

(2)截取字符长度

定义变量:

[[email protected] ~]# a="a b c d e f"
[[email protected] ~]# echo ${a}
a b c d e f

截取变量中的内容,从第二个字符开始截取(默认截取到最后)

[[email protected] ~]# echo ${a:2}
b c d e f

截取变量中的内容,从第二个字符开始截取2个字符
第一种方法:

[[email protected] ~]# echo ${a:2:4}
b c
//因为空格也算字符

第二种方法:

[[email protected] ~]# echo ${a} | cut -c 3-5
b c

(3)删除指定字符

定义变量:

[[email protected] ~]# a=abcABC123ABCabc
[[email protected] ~]# echo $a
abcABC123ABCabc
[[email protected]ost ~]# echo ${a#a*c}
ABC123ABCabc
[[email protected] ~]# echo ${a#a*C}
123ABCabc
//从变量内容的开头开始删除最短匹配a*c及a*C的字符串
[[email protected] ~]# echo ${a##a*c}

//因为全部符合要求,所以就不显示了
[[email protected] ~]# echo ${a##a*C}
abc
//从变量内容的开头开始删除最长匹配a*c及a*C的字符串
[[email protected] ~]# echo ${a%a*c}
abcABC123ABC
[[email protected] ~]# echo ${a%a*C}
abcABC123ABCabc
//从变量内容的结尾开始删除最短匹配a*c及a*C的字符串
[[email protected] ~]# echo ${a%%a*c}

[[email protected] ~]# echo ${a%%a*C}
abcABC123ABCabc
//从变量内容的结尾开始删除最长匹配a*c及a*C的字符串

关于删除字符的小结:

  • #:表示从开头删除匹配最短;
  • ##:表示从开头删除匹配最长;
  • %:表示从结尾删除匹配最短;
  • %%:表示从结尾删除匹配最长;

ac匹配的字符,表示所有,以a开头,以c结尾;
aC匹配的字符,表示所有,以a开头,以C结尾;

(4)替换指定字符

定义变量:

[[email protected] ~]# a="abc abc"
[[email protected] ~]# echo $a
abc abc
[[email protected] ~]# echo ${a/abc/ABC}
ABC abc
//替换第一个符合要求的字符
[[email protected] ~]# echo ${a//abc/ABC}
ABC ABC
//替换所有符合要求的字符

有关替换的小结:

  • 一个“/”表示替换匹配的第一个字符串;
  • 两个“//”表示替换匹配的所有字符串;

四、特殊扩展变量

常用选项,如图:


不太常用,这里就不举例说明了!

原文地址:https://blog.51cto.com/14157628/2438027

时间: 2024-08-03 00:07:32

Shell变量知识进阶的相关文章

《跟老男孩学Linux运维之shell编程实战》-第三章 shell变量知识进阶

本文讲解shell变量知识进阶. 以下为知识点的总结,关于练习,本文不不涉及,还需要各位小伙伴自己练习! 1.shell中的特殊位置参数变量,请见下表: 在企业场景下,"$?"的用法: (1)判断命令.脚本或函数等程序是否执行成功: (2)若在脚本中调用执行"exit 数字",则会返回这个数字给"$?"变量: (3)如果是在函数里,则通过"return  数字",把这个数字以函数返回值的形式传给"$?".

测试工程师需要了解的shell变量知识

欢迎访问个人博客 什么是变量 本地变量:手动定义的,在当前系统的某个环境下才能生效,作用范围小 普通变量: 单引号:原字符输出,变量名='变量值' ? shell name='tom' ? shell echo $name tom 双引号:变量名="变量值",看一下值当中有没有对其他变量的引用,如果有就获取变量值然后组合到一起输出 ? shell word="I am $name" ? shell echo $word I am tom 直接命名不加任何引号:变量名

Bash Shell脚本编程-变量知识

Shell:GUI  CLI 提供交互式接口:提高效率 命令行展开:~ ,{} 命令别名:alias 命令历史:history Globbing:*,?,[],[^] 命令补全:$PATH指定的目录下 路径补全:TAB键 管道:| 输入输出重定向:>    >> 提供编程环境: bash自动运行脚本机制 面向过程(以指令为中心组织数据)的编程模型 脚本编程 输入指令解决问题 程序是语句和表达式组成的 运行时根据一定流程来执行: 顺序执行 选择执行 循环执行 程序是指令+数据的 面向对象(

SHELL脚本编程进阶(二)

写在前面(最重要) 本文部分资料和示例援引自以下书籍.在此,感谢原作者的创作,以及所有译者的付出,向他们致敬. Advanced Bash-Scripting Guide <高级Bash脚本编程指南>Revision 10中文版 Linux脚本编程执导 其中 <高级Bash脚本编程指南>Revision 10中文版 是 <Advanced Bash-Scripting Guide> 的中文翻译版,文档翻译正在进行中,再次感谢译者付出. 前言 在之前的文章 Linux 基

shell脚本编程进阶练习题

这两天学习了shell脚本编程进阶,作为一枚文科生,小编觉得...恩..脚本很烧脑.....,不过小编还是做了些题,稍作总结后,呈给各位看官,内容如下: 一.条件选择if语句 选择执行: 注意:if语句可嵌套 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi 多分支 if 判断条件1; then 条件为真的分支代码 elif 判断条件2; then 条件为真的分支代码 elif 判断条件3; t

Shell基础知识

防伪码:长风破浪会有时,直挂云帆济沧海. 1.1 l Shell  简介 Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理, Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户. 下面是处理流程示意图: Shell 既然是工作在 Linux 内核之上,那我们也有必要知道下 Linux 相关知识. Linux 是一套免费试用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户.多

shell脚本基础进阶(四)----作业

20150913-15作业 1.描述shell程序的运行原理(可附带必要的图形说明) shell脚本基础进阶(一)----shell介绍 2.总结shell编程中所涉及到的所有知识点(如:变量.语法.命令状态等等等,要带图的哟) shell脚本基础进阶(二)----变量及运算符 3.总结课程所讲的所有循环语句.条件判断的使用方法及其相关示例:(if (jpg|png is not exist):echo "You say a XX") shell脚本基础进阶(三)----流程控制语句

《跟老男孩学Linux运维之shell编程实战》-第二章 shell变量的核心基础

这篇文章主要讲解 shell变量的核心基础. 1.变量是什么? 变量是什么?可能有好多人不明白,简单地说,变量就是用一个固定的字符串(也可能是字符.数字等的组合)代替更多.更复杂的内容,该内容里可能还会包含变量.路径.字符串等其他的内容. 变量的赋值方式为:先写变量名称,紧接着是"="这个字符,最后是值,中间无任何空格(变量的内容一般要加双引号,以防止出错,特别是当值里的内容之间有空格时). 如何打印变量?通过echo命令加上$变量名 打印变量的值: 例如:定义变量和打印变量: [[e

《Linux shell变量总结回顾》RHEL6

由于上篇文章总结的不是很详细,有很多方面并未涉及到shell各个方面,所以发表此文章对shell做了更全面的总结: 文章版权:http://www.cnblogs.com/linux-super-meng/ 环境变量路径: [[email protected] ~]# set   //查看到的是局部变量和全局变量2种 [[email protected] ~]# env  //查看系统的全局环境变量 [[email protected] ~]# echo $PATH  //查看系统环境变量路径