shell - 01 - Shell入门:扎好马步 走的更稳
自定义变量
在任何编程语言中,变量都是一个基础的适用方法,这些变量代表某些逻辑运算后的值,也可以对这些变量进行自定义,比如声明变量就是一个常量字符串或者某些特定的值。
唯一不同的是,在高级语言中,变量属于强类型的,在高级语言中,定义一个变量后,在内存中这个变量的数据、格式、类型就固定了。
但是在shell中,变量是属于弱类型的,因为shell是解释型语言,只有在解释器实际执行中执行变量的时候才会决定变量的数据类型是什么类型的。
变量名遵循原则
变量是由任何字母、数字和下划线组成的字符串,且不能以数字开头。[这一点与高级语言是一样的]
区分字母大小写,例如Age1、Book2。[建议shell中尽量使用大写的变量,便于区分]
变量、符号、值中间不能出现任何空格
变量的引用
声明变量
VAR1=hello world
引用变量[引用时加上’$'符号]
echo $VAR1
再次注意: “=” 左右不能有空格
一个小案例
位置变量
什么是位置变量?
当一条命令或脚本执行时,后面可以跟多个参数,我们使用位置参数变量来表示这些参数
比如如下的命令
sh 1.sh hello world 123 456
我们就可以通过 $1 引用 hello、$2 引用world...
以此类推
位置参数变量
$n : n位数字,$0代表脚本本身,$1~$9 代表 第1~9个参数,10以上的参数需要大括号包含,如 ${10
$@ : 命令行所有参数,但是每个参数区别对待
$* : 命令行所有参数,所有的参数视为一个整体。这在某些极端的情形下会出现不同的效果
$# : 表示参数的个数
编写一个 location_var.sh 脚本
#! /bin/bash
echo "The First Para: $1"
echo "The Secont Para: $2"
echo "The Third Para: $3"
echo "The Fourth Para: $4"
echo "The Fifth Para: $5"
echo $*
echo $@
echo $#
环境变量
了解即可,shell脚本中使用的并不是很多。
什么是环境变量?
Linux是一个多用户的操作系统,针对不同的用户都会有一个专有的运行环境。
不同用户的专有环境就是一组默认环境变量的组合。[这样解释并不准确,从专有环境来说可以延伸到内存隔离等等,但是现在这么理解也未尝不可。]
环境变量分类
对所有用户都生效的环境变量[系统级的变量],比如在 /etc/profile
设置的环境变量是对所有用户都生效的
对特定用户生效的环境变量,比如特定用户家目录下的 ~/.bashrc 或者 ~/.bash_profile
文件下的变量。这两个文件对于不同操作系统来说,可能只有一个或者两种都有,通常情形下找到任何一个在其中写入变量都会生效的。
临时有效的环境变量,比如脚本或命令行使用的 export
。 有时候需要特定的用户启用特定的进程,而且启用这些进程的时候,可能需要特定的环境变量。这时候就可以用 export
定义这些临时的环境变量以被我们启动进程的时候使用
附:一般情况下在脚本中利用export
定义很多变量,方便被其他命令所使用的
常见的环境变量
PATH : 命令搜索的路径
HOME : 用户家目录的路径
LOGNAME : 用户登录名
PWD : 当前所在路径
HISTFILE : 历史命令的保存文件
HISTSIZE : 历史命令保存的最大行数
HOSTNAME : 主机名
SHELL : 用户当前使用SHELL
PS1 : 一级命令提示符
TMOUT : 用户和系统交互过程的超时值
IFS : 系统输入分隔符
OFS : 系统输出分割符
管道
思考一个问题:我们现在想要查找目前系统中python相关的包,在不使用管道符的情况下?
解决方法之一:使用命令列出系统已有的所有的软件包,然后把结果重定向到文件中,然后在文件中搜索关键字python。
命令: rpm -qa > all_soft.txt
[将系统资源安装的rpm包重定向到 all_soft.txt 文件]
在利用 vim 或者 less等命令查看 all_soft.txt 文件
那么如果使用 管道符 的情况下呢?
列出所有的python软件包,然后将结果传递给后续命令处理,并输出
命令:rpm -qa | grep python
如果再进行统计呢?
命令:rpm -qa | grep python | wc -l
[输出 python 相关包的数量]
管道的定义
将一个命令的输出作为另一个命令的输入。
从某种意义上来说,其实就是一种重定向上的简易实现。[本质上就是一个过滤的功能]
如 rpm -qa | grep less
退出状态码
在shell脚本中,退出状态码使用的场景还是比较多的。
其实在shell命令中,每一条shell命令在执行结束之后都会得到一个"值",不管是正确的"值"还是非正确的"值"。
什么是退出状态码
所有的shell命令都使用退出状态码
来告知shell,它已经执行完毕。退出状态码
的不同,代表着执行结果的不同。
退出状态码
是一个 0~255 的整数值
Linux提供了一个 $? 来捕获退出状态码的值
状 态 码 含义
0 命令成功结束
1 一般性位置错误
2 不适合的shell命令
126 命令不可执行
127 没找到命令
128 无效的退出参数
128+X 与Linux信号 X 相关的严重错误
130 通过 Ctrl + C 终止的命令
255 正常范围之外的退出
其实只需要记住 0 为成功,非 0 为不成功就好!
改变退出状态码的 exit 命令
现在我们都知道,其实 退出状态码
实际上是以上一条指令的返回结果为准。也就是说上一条指令执行结果直接决定了 退出状态码
的值。
其实在某些逻辑中我们可以使用 exit
来改变这一种默认的行为。
比如说,我们可以使用 exit $exit_code 改变一个具体的状态码。
exit 48 或者 exit 125
示例:
#!/bin/ash
date
if [ $? -eq 0 ];then
echo "Success..."
else
echo "failed"
fi
再来看一个 错误状态码
的示例
#!/bin/ash
this is a error date
if [ $? -eq 0 ];then
echo "Success..."
else
echo "this is a failed"
exit 25
fi
echo $?
这里需要注意的是,当执行 exit
命令之后, 下面的 echo $?
将不再执行。
所以说 exit
也是一个脚本退出指令,在以后写脚本的过程中可以在脚本中去引用脚本的时候会用到 exit
的指令.
相关文章
- shell脚本--continue、break
- linux shell 脚本攻略学习17--正则表达式入门
- Shell - 简明Shell入门
- Shell - 简明Shell入门04 - 判断语句(If)
- Shell - 简明Shell入门01 - 第一个脚本(HelloShell)
- Linux Shell脚本自动化编程实战- shell函数
- Linux Shell脚本自动化编程实战-shell变量(二)
- 常用的shell脚本(安全方向)
- Shell - 简明Shell入门06 - 循环语句(Loop)
- Shell - 简明Shell入门05 - 条件语句(Case)
- Shell - 简明Shell入门04 - 判断语句(If)
- Linux Shell脚本自动化编程实战- shell函数
- 获取shell脚本自身所在目录的Shell脚本分享
- Linux 的shell 字符串截取很有用。有八种方法。
- [shell]Shell经常使用特殊符号
- 学习一个shell 变量$IFS
- 21.第六章 Shell脚本编程基础入门-- shell 脚本语言的基本用法(四)
- 19.第六章 Shell脚本编程基础入门 -- shell 脚本语言的基本用法(二)
- shell中tr命令遇到的小问题记录
- Shell脚本运行hive语句 | hive以日期建立分区表 | linux schedule程序 | sed替换文件字符串 | shell推断hdfs文件文件夹是否存在
- Linux 的 Shell
- shell script 入门 笔记
- MYSQL提权之反弹SHELL——数据库提权属于webshell到管理员的纵向提权,本质还是利用udf提权,无非是在mysql自定义函数中使用了反弹shell而已
- Linux tips: shell中启动多进程并行批处理的技巧
- Shell脚本一键安装-----MYSQL数据库
- shell脚本实现zabbix监控信息收集
- jenkins调用shell脚本实现自动上线完整项目---此项目中用到了git parameter、choise parameter参数化构建(五)