《跟老男孩学Linux运维之shell编程实战》-第三章 shell变量知识进阶
2017-04-20 09:46
429 查看
本文讲解shell变量知识进阶。
以下为知识点的总结,关于练习,本文不不涉及,还需要各位小伙伴自己练习!
1.shell中的特殊位置参数变量,请见下表:
在企业场景下,“$?”的用法:
(1)判断命令、脚本或函数等程序是否执行成功;
(2)若在脚本中调用执行“exit 数字”,则会返回这个数字给“$?”变量;
(3)如果是在函数里,则通过“return 数字”,把这个数字以函数返回值的形式传给“$?”。
在应用上述特殊位置变量时,也可能会用到下述知识点:
获取脚本的路径:dirname path/script-name
获取脚本文件名:basename path/script-name
比如用for循环做简单测试时,for i;do echo $i;done,可能很多网友看到会有些不理解,一般for循环
会写for i in ...,此处省略了in变量列表,在此相当于有引号的in“$@”
用shift将位置参数移位(左移)
2.Bash Shell内置变量命令
(1)echo:在屏幕上输出信息
命令格式:echo args xxx ==>xxx可以是字符串和命令的组合
功能说明:将echo命令后面args指定的字符串及变量等显示到标准输出。
常见参数如下:
(2)eval
命令格式:eval cmd ==>cmd包含变量等命令
功能:当shell程序执行到eval语句时,shell读入参数cmd,并将它们组合成一个新的命令,然后去执行,简单点说,
就是eval会对后面的cmd进行两遍扫描,如果第一遍扫描后,cmd是个普通的命令,则执行此命令,如果cmd中含
有变量,则第一遍扫描先确认变量的值,然后进行第二遍扫描,得出结果,例如:
[root@www ]# set -- arg1 arg2 ==>通过set设置两个参数
[root@www ]# echo $# ==>$#表示传参的个数
2
[root@www ]# echo \$$# ==>由于$#为2,所以此命令就变为echo $2 ,但此时并未输出$2的值,而是输出了$2,
这也就是上述提到的提一次扫描,将$#替换为$2
$2
[root@www ]# eval "echo \$$#" ==>eval进行第2次扫描,直接输出echo $2的值arg2
arg2
(3)exec
命令格式:exec 命令参数
功能:exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程也就
终止了,如果是远程连接的会话,则执行完命令后,该会话直接退出。
如下:
[root@www scripts]# exec date ==>执行完此命令,直接退出当前会话
Wed Apr 19 16:18:31 CST 2017
Connection closed.
Type `help' to learn how to use Xshell prompt.
Xshell:\>
Connection closed by foreign host.
另外,当使用exec打开文件后,read命令每次都会将文件指针移动到文件的下一行进行读取,直至文件末尾,
利用这个可以实现处理文件内容。
例如:
[root@www ~]# seq 5 > /tmp/seq.txt
[root@www scripts]# cat exec.sh
exec </tmp/seq.txt
while read line
do
echo $line
done
echo ok
[root@www scripts]# sh exec.sh
1
2
3
4
5
ok
(4)read
命令格式:read 变量名表
功能:从标准输入读取字符串等信息,传给shell程序内部定义的变量(后续章节中讲解)
(5)shift:用shift将位置参数移位(左移),将位置参数$1、$2等进行左移,即如果位置参数是$3、$2、$1,
那么执行一次shift后,$3变为$2,$2变为$1,$1就消失了。
(6)exit:shell程序,当然exit也可以选择执行的数字作为返回值。
3.shell变量子串知识
提示:
上述ID为11-14中表达式的冒号可以省略,如果省略了其中的冒号,则将每个定义中的“为空或未赋值”部分改为“未赋值”。
为了方便理解,这里对${#parameter##word}举例说明一下:
${#parameter%% a*c} :这里的a*c表示匹配的字符串,*表示匹配所有,a*c表示匹配开头为a、中间为任意多字符,结尾为c的字符串。
以上为本人在读《跟老男孩学Linux运维之shell编程实战》这本书时的笔记,如有任何版权问题,请联系留言。
以下为知识点的总结,关于练习,本文不不涉及,还需要各位小伙伴自己练习!
1.shell中的特殊位置参数变量,请见下表:
在企业场景下,“$?”的用法:
(1)判断命令、脚本或函数等程序是否执行成功;
(2)若在脚本中调用执行“exit 数字”,则会返回这个数字给“$?”变量;
(3)如果是在函数里,则通过“return 数字”,把这个数字以函数返回值的形式传给“$?”。
在应用上述特殊位置变量时,也可能会用到下述知识点:
获取脚本的路径:dirname path/script-name
获取脚本文件名:basename path/script-name
比如用for循环做简单测试时,for i;do echo $i;done,可能很多网友看到会有些不理解,一般for循环
会写for i in ...,此处省略了in变量列表,在此相当于有引号的in“$@”
用shift将位置参数移位(左移)
2.Bash Shell内置变量命令
(1)echo:在屏幕上输出信息
命令格式:echo args xxx ==>xxx可以是字符串和命令的组合
功能说明:将echo命令后面args指定的字符串及变量等显示到标准输出。
常见参数如下:
(2)eval
命令格式:eval cmd ==>cmd包含变量等命令
功能:当shell程序执行到eval语句时,shell读入参数cmd,并将它们组合成一个新的命令,然后去执行,简单点说,
就是eval会对后面的cmd进行两遍扫描,如果第一遍扫描后,cmd是个普通的命令,则执行此命令,如果cmd中含
有变量,则第一遍扫描先确认变量的值,然后进行第二遍扫描,得出结果,例如:
[root@www ]# set -- arg1 arg2 ==>通过set设置两个参数
[root@www ]# echo $# ==>$#表示传参的个数
2
[root@www ]# echo \$$# ==>由于$#为2,所以此命令就变为echo $2 ,但此时并未输出$2的值,而是输出了$2,
这也就是上述提到的提一次扫描,将$#替换为$2
$2
[root@www ]# eval "echo \$$#" ==>eval进行第2次扫描,直接输出echo $2的值arg2
arg2
(3)exec
命令格式:exec 命令参数
功能:exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程也就
终止了,如果是远程连接的会话,则执行完命令后,该会话直接退出。
如下:
[root@www scripts]# exec date ==>执行完此命令,直接退出当前会话
Wed Apr 19 16:18:31 CST 2017
Connection closed.
Type `help' to learn how to use Xshell prompt.
Xshell:\>
Connection closed by foreign host.
另外,当使用exec打开文件后,read命令每次都会将文件指针移动到文件的下一行进行读取,直至文件末尾,
利用这个可以实现处理文件内容。
例如:
[root@www ~]# seq 5 > /tmp/seq.txt
[root@www scripts]# cat exec.sh
exec </tmp/seq.txt
while read line
do
echo $line
done
echo ok
[root@www scripts]# sh exec.sh
1
2
3
4
5
ok
(4)read
命令格式:read 变量名表
功能:从标准输入读取字符串等信息,传给shell程序内部定义的变量(后续章节中讲解)
(5)shift:用shift将位置参数移位(左移),将位置参数$1、$2等进行左移,即如果位置参数是$3、$2、$1,
那么执行一次shift后,$3变为$2,$2变为$1,$1就消失了。
(6)exit:shell程序,当然exit也可以选择执行的数字作为返回值。
3.shell变量子串知识
提示:
上述ID为11-14中表达式的冒号可以省略,如果省略了其中的冒号,则将每个定义中的“为空或未赋值”部分改为“未赋值”。
为了方便理解,这里对${#parameter##word}举例说明一下:
${#parameter%% a*c} :这里的a*c表示匹配的字符串,*表示匹配所有,a*c表示匹配开头为a、中间为任意多字符,结尾为c的字符串。
以上为本人在读《跟老男孩学Linux运维之shell编程实战》这本书时的笔记,如有任何版权问题,请联系留言。
相关文章推荐
- 《跟老男孩学Linux运维之shell编程实战》-第一章 shell脚本初步入门
- 《跟老男孩学Linux运维之shell编程实战》-第五章 shell脚本的条件测试
- Linux运维高薪入门及进阶全新经典视频-老男孩Linux(免费)
- linux变量及shell基础知识
- Linux运维高薪入门及进阶全新经典视频-老男孩Linux第一部(下)
- 【Linux系列】【基础版】第三章 Shell基础知识
- 20170111L06-03-2老男孩Linux运维实战培训-硬盘分区的相关知识介绍03
- 《跟老男孩学习Linux运维:Shell编程实战》之expr和RETVAL
- 执行shell脚本的多种方法及重要区别---摘取自“老男孩linux运维培训”(自己通过视频整理)
- Linux基础知识之————shell学习总结之变量引用
- 老男孩教育每日一题-第60天-一道实用Linux运维问题的9种Shell解答方法!
- SHELL (3) —— 变量知识进阶和实践
- <<跟着老男孩学linux运维>>第三章总结
- Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)
- 20161220L05-02和L05-04老男孩Linux运维实战培训-硬盘的基础知识介绍01和02
- shell脚本开发的6点基本规范和习惯---摘取自“老男孩linux运维培训”(自己通过视频整理)
- 《跟老男孩学习Linux运维:Shell编程实战》之比较两个整数的大小
- 老大让我学Linux之shell变量替换,cat指令,head和tail指令