当前位置:网站首页>Shell运维开发基础(一)
Shell运维开发基础(一)
2022-08-03 06:56:00 【java_prinln】
Shell变量
在命令行提示符直接执行env、set查看系统或环境变量。env显示用户环境变量,set显示Shell预先定义好的变量以及用户变量。可以通过export导出成用户变量。
一些写Shell脚本时常用的系统变量:
$SHELL | 默认Shell |
---|---|
$HOME | 当前用户家目录 |
$IFS | 内部字段分隔符 |
$LANG | 默认语言 |
$PATH | 默认可执行程序路径 |
$PWD | 当前目录 |
$UID | 当前用户ID |
$USER | 当前用户 |
$HISTSIZE | 历史命令大小,可通过HISTTIMEFORMAT变量设置命令执行时间 |
$RANDOM | 随机生成一个0至32767的整数 |
$HOSTNAME | 主机名 |
1.1.2 普通变量与临时环境变量
普通变量定义:VAR=value
临时环境变量定义:export VAR=value
变量引用:$VAR
下面看下他们之间区别:
Shell进程的环境变量作用域是Shell进程,当export导入到系统变量时,则作用域是Shell进程及其Shell子进程。
ps axjf输出的第一列是PPID(父进程ID),第二列是PID(子进程ID)
当SSH连接Shell时,当前终端PPID(-bash)是sshd守护程序的PID([email protected]/0),因此在当前终端下的所有进程的PPID都是-bash的PID,比如执行命令、运行脚本。
所以当在-bash下设置的变量,只在-bash进程下有效,而-bash下的子进程bash是无效的,当export后才有效。
进一步说明:再重新连接SSH,去除上面定义的变量测试下
所以在当前shell定义的变量一定要export,否则在写脚本时,会引用不到。
还需要注意的是退出终端后,所有用户定义的变量都会清除。
在/etc/profile下定义的变量就是这个原理,后面有章节会讲解Linux常用变量文件。
1.1.3 位置变量
位置变量指的是函数或脚本后跟的第n个参数。从$ 1 到 $ n,需要注意的是从第10个开始要用花括号调用,例如${10}
shift可对位置变量控制,例如:
#!/bin/bash
echo "1: $1"
shift
echo "2: $2"
shift
echo "3: $3"
# bash test.sh a b c
1: a
2: c
3:
每执行一次shift命令,位置变量个数就会减一,而变量值则提前一位。shift n,可设置向前移动n位。
1.1.4 特殊变量
$0 | 脚本自身名字 |
---|---|
$? | 返回上一条命令是否执行成功,0为执行成功,非0则为执行失败 |
$# | 位置参数总数 |
$* | 所有的位置参数被看做一个字符串 |
[email protected] | 每个位置参数被看做独立的字符串 |
$$ | 当前进程PID |
$! | 上一条运行后台进程的PID |
1.5 变量引用
赋值运算符 | 示例 |
---|---|
= | 变量赋值 |
+= | 两个变量相加 |
1.5.1 自定义变量与引用
# VAR=123
# echo $VAR
123
# VAR+=456
# echo $VAR
123456
Shell中所有变量引用使用 符,后跟变量名。有时个别特殊字符会影响正常引用,那么需要使用 符,后跟变量名。 有时个别特殊字符会影响正常引用,那么需要使用 符,后跟变量名。有时个别特殊字符会影响正常引用,那么需要使用{VAR},例如:
# VAR=123
# echo $VAR
123
# echo $VAR_ # Shell允许VAR_为变量名,所以此引用认为这是一个有效的变量名,故此返回空
# echo ${VAR}
123
还有时候变量名与其他字符串紧碍着,也会误认为是整个变量:
# echo $VAR456
# echo ${VAR}456
123456
1.5.2 将命令结果作为变量值
# VAR=`echo 123`
# echo $VAR
123
# VAR=$(echo 123)
# echo $VAR
123
这里的反撇号等效于$(),都是用于执行Shell命令。
1.6 双引号和单引号
在变量赋值时,如果值有空格,Shell会把空格后面的字符串解释为命令:
# VAR=1 2 3
-bash: 2: command not found
# VAR="1 2 3"
# echo $VAR
1 2 3
# VAR='1 2 3'
# echo $VAR
1 2 3
看不出什么区别,再举个说明:
# N=3
# VAR="1 2 $N"
# echo $VAR
1 2 3
# VAR='1 2 $N'
# echo $VAR
1 2 $N
单引号是告诉Shell忽略特殊字符,而双引号则解释特殊符号原有的意义,比如$、!。
1.7 注释
Shell注释也很简单,只要在每行前面加个#号,即表示Shell忽略解释。
边栏推荐
猜你喜欢
【图像去噪】基于matlab稀疏表示KSVD图像去噪【含Matlab源码 2016期】
【OpenCV】 - 显示图像API之imshow()对不同位深度(数据类型)的图像的处理方法
- display image API OpenCV 】 【 imshow () to a depth (data type) at different image processing methods
【云原生--Kubernetes】kubectl命令详解
LeetCode 264:丑数
23届微软秋招内推
训练正常&异常的GAN损失函数loss变化应该是怎么样的
开放域OOD主要数据集、评价指标汇总
postman将接口返回结果生成csv文件到本地
线程基础(二)
随机推荐
伦敦银现货市场如何使用多条均线?
从学生到职场的转变
excel高级绘图技巧100讲(二十一)- Excel层叠柱形图
CDGA|如何加强数字政府建设?
【图像去雾】基于matlab暗通道和非均值滤波图像去雾【含Matlab源码 2011期】
Charles capture shows
solution information_schema
postman将接口返回结果生成json文件到本地
测试用例设计方法之因果图详解
【图像去噪】基于matlab稀疏表示KSVD图像去噪【含Matlab源码 2016期】
Multi-Head-Attention principle and code implementation
最新版图书馆招聘考试常考试题重点事业单位
千万级别的表分页查询非常慢,怎么办?
Roson的Qt之旅#106 QML在图片上方放置按钮并实现点击按钮切换图片
“碳中和”愿景下,什么样的数据中心才是我们需要的?
解读 refresh 十二步骤
控制bean的加载
Umi 4 快速搭建项目
qt学习之旅--MinGW编译FFmpeg(32bit)
static数据成员