每天学一点儿shell:变量的基本操作

shell变量的定义

定义变量

  1. 定义变量的时候直接使用变量名就行,不需要加$符号
  2. 变量名和变量值、等号之间不能有空格

变量命名规范

  1. 命名只能使用英文字母、数字、下划线,首字母不能以数字开头
  2. 不能使用系统预留的关键字
命令 含义
! 保留字,逻辑非
: 不做任何事,只做参数展开
. 读取文件并在shell中执行它
alias 设置命令或命令行别名
bg 将作业置于后台运行
bind 将关键字序列与readline函数或宏捆绑
break 保留字,跳出for、while、until、select循环
builtin 调用命令的内建命令格式,而禁用同名的函数。或者同名的扩展命令
case 保留字,多重选择
cd 切换当前工作目录
command 找出内建和外部命令;寻找内建命令而非同名函数
continue 保留字,到达下次for、while、until、select循环
declare 声明变量定义变量属性
dirs 显示当前存储的列表
disown 将作业从列表中移除
do 保留字,for、while、until、select循环的一部分
done 保留字,for、while、until、select循环的一部分
echo 打印参数
elif 保留字,if结构的一部分
else 保留字,if结构的一部分
enable 开启和关闭内建命令
esac 保留字,case的一部分
eval 将参数作为命令再次处理一遍
exec 以特定程序取代shell或为shell改变I/O
exit 退出shell
export 将变量声明为环境变量
fc 与历史命令一起运行
fg 将作业置于后台运行
fi 保留字,if循环的一部分
for 保留字,for循环的一部分
function 定义一个函数
getops 处理命令行选项
hash 记录并指定命令的路径名
help 显示内建命令的帮助信息
history 显示历史信息
if 保留字,if循环的一部分
in 保留字,case、for、select循环的一部分
jobs 显示后台运行的作业
kill 向进程传送信号
let 使变量执行算术运算
local 定义局部变量
logout 从Shell中注销
popd 从目录栈中弹出目录
pushd 将目录压入栈
pwd 显示当前工作目录
read 从标准输入中读取一行
readonly 将变量定义为只读
return 从函数或脚本返回
select 保留字,生成菜单
set 设置Shell选项
shift 变换命令行参数
suspend 终止Shell的执行
test 评估条件表达式
then 保留字,if结构的一部分
time 保留字,输出统计出来的命令执行时间,其输出格式由TIMEFORMAT变量来控制
times 针对Shell及其子Shell,显示用户和系统CPU的时间和
trap 设置扑捉程序
type 确定命令的源
typeset 声明变量,定义变量属性,与declare等价
ulimit 设置和显示进程占用的资源限制
umask 设置和显示文件权限码
unalias 取消别名定义
unset 取消变量或函数定义
until 保留字,一种循环结构
wait 等待后台作业完成
while 保留字,一种循环结构

变量的使用

使用变量只需要在前面加$即可

[root@hadoop-master ~]# my_name="leo825"
[root@hadoop-master ~]# echo $my_name
leo825
[root@hadoop-master ~]# echo ${my_name}
leo825

花括号加不加都行,主要视情况而定,如果会引起编译器歧义需要添加来区分变量边界

[root@hadoop-master ~]# echo "my name is ${my_name}"
my name is leo825

删除变量

[root@hadoop-master ~]# unset my_name
[root@hadoop-master ~]# echo ${my_name}

[root@hadoop-master ~]# 

字符串的操作

单引号、双引号

[root@hadoop-master ~]# my_name="leo825"
[root@hadoop-master ~]# echo '单引号输出:${my_name}'
单引号输出:${my_name}
[root@hadoop-master ~]# echo "双引号输出:${my_name}"
双引号输出:leo825
[root@hadoop-master ~]# echo "双引号输出:\"${my_name}\""
双引号输出:"leo825"

根据上面的比较总结如下:

  1. 单引号的任何字符串都会原样输出,所以不要用单引号放置变量
  2. 双引号可以放置变量,并且可以使用转义字符

其他常见操作

获取字符串长度

[root@hadoop-master ~]# echo ${my_name}
leo825
[root@hadoop-master ~]# echo ${#my_name}
6

截取字符串

截取格式,这个是从左边开始计数:

${string: start :length}

其中,string 是要截取的字符串,start是起始位置(从左边开始,从0开始计数),lenth是要截取的长度(省略的话表示直到字符串的末尾)

[root@hadoop-master ~]# echo ${my_name}
leo825
[root@hadoop-master ~]# echo ${my_name:1:2}
eo
[root@hadoop-master ~]# echo ${my_name:1}
eo825

截取格式,这个是从右边开始计数:

${string: 0-start :length}

这种格式比上一种多了0-,这个是固定写法,代表是从字符串右边开始计数的。
这种方式要注意两点

  1. 从左边开始计数时,起始数字是0;从右边开始计数时,起始数字是1。计数方向不同,起始数字也不同。
  2. 不管从哪个方向开始计数,截取方向都是从左到右。
[root@hadoop-master ~]# echo ${my_name}
leo825
[root@hadoop-master ~]# echo ${my_name:0-3:2}
82

从右开始计数不太好理解,这个步骤是首先从右边开始第1个向左查第3个位是8,然后向右数2位就是82

获取字符串位置

[root@hadoop-master ~]# echo ${my_name}
leo825
[root@hadoop-master ~]# echo `expr index "$my_name" 8`
4

以上脚本中 “`” 是反引号,而不是单引号 “’”,不要看错了,需要执行指令的都需要反引号,就是Esc键正下方的那个键。

猜你喜欢

转载自blog.csdn.net/u011047968/article/details/107928947