CentOS shell中的变量

shell中的变量

变量的介绍

变量即变化的量,核心是”变”与”量”二字,变即变化,量即衡量状态。

量:是记录现实世界当中的某种状态
变:指的是记录的状态是可以发送变化的

name=wsh
age=22

如何使用变量

变量名    赋值符号 变量值
name=wsh    //shell中定义变量
name:wsh    //yaml中定义的变量
  • 变量名

相当于一个门牌号,便于取出变量值,是访问到值的唯一方式

  • 赋值符号

将值的内存地址,绑定给变量名

  • 变量值

用来表示状态

变量的使用规则:先定义,再通过变量名去引用

变量名的命名规则

1.大前提:变量名的命名应该能够反映出值记录的状态
2.变量是用来访问变量值的,所以变量名应该遵循一定规范,来方便我们标识存到内存中值的功能

1.变量名只能是字母、字母、数字或下划线的任意组合(区分大小写)
2.变量名不可以使用中文
3.变量名不可以使用命令来命名
4.不要用拼音
5.变量名不能以数字开头

变量名定义的方式

1.下划线+纯小写
name_of_wsh='wushihang'
name_of_oldboy='laonanhai'

2.驼峰体
nameOfWsh='wushihang'
nameOfOldboy='laonanhai'
ageOfOldboy=88

3.下划线+纯大写
NAME_OF_OLDBOY='laonanhai'

不好的方式:
1.变量名为中文、拼音
2.变量名过长
3.变量名词不达意

变量的分类

## 查看系统环境变量
env
declare
export

## 环境变量
LANG        ## 字符集语言
PATH        ## 该变量中路径里的所有可执行文件,都可以直接执行,不需要加路径
PS1         ## 命令提示符
UID         ## 当前登录用户的uid
HOSTNAME    ## 当前主机
PWD         ## 当前工作路径
USER        ## 当前登录的用户名

## 历史记录相关
HISTSIZE
HISTFILESIZE
HISTFILE
TMOUT
HISTCONTROL:    export HISTCONTROL=ignorespace  # 离职专用变量(强制历史记录不记住该命令)
PROMPT_COMMAND
DATE=$(date +%F-%T)
IP=$(ifconfig eth0|awk 'NR==2{print $2}')

mkdir $DATE_$IP_$HOSTNAME ## 基本凉了

### 注意使用大括号分隔变量
mkdir ${DATE}_${IP}_${HOSTNAME}
$n: N正整数,$1 $2 $3....$n        两位数要使用{}, ${10} ${11}
$0: 执行脚本的路径和名字
$#: 传递参数的个数
$*: 1.不适合数组使用          2.调用时加双引号  ## 接收脚本后面所有的参数
$@: 1.适合后面数组数据类型使用  2.调用时加双引号  ## 接收脚本后面所有的参数
$?:表示上一个命令执行的状态(上一条命令的返回值) 0,成功执行 非0,失败
特殊命令:
    - false
    - diff
$$:表示当前脚本执行的pid
$!:上一个脚本或程序运行的pid
$_:获取上一条命令的最后一个参数(以空格为分隔符)   ## 相当于 Esc + .

变量的子串

${#变量名}:获取该变量的长度
[root@web01 ~]# vim a.sh
#!bin/bash
name=wsh
echo ${#name}
[root@web01 ~]# . a.sh
3

[root@web01 ~]# vim a.sh
#!bin/bash
name=$1
echo ${#name}
[root@web01 ~]# . a.sh  123456
6

[root@web01 ~]# vim a.sh
#!bin/bash
read -p '请输入用户名:' name
read -p '请输入密码:' pas

if [ ${#pas} -lt 8 ];then
  echo '密码必须大于等于八位'
else
  echo '密码符合要求'
fi
[root@web01 ~]# . a.sh
请输入用户名:www
请输入密码:111
密码必须大于等于八位
[root@web01 ~]# . a.sh
请输入用户名:www
请输入密码:12345678
密码符合要求

${变量名}:调用变量
${变量名:偏移量}:字符串的截取
[root@web01 ~]# vim a.sh
#!bin/bash
name=wsh
echo ${name:1}
[root@web01 ~]# . a.sh
sh

${变量名:偏移量:步长}:字符串的截取
[root@web01 ~]# vim a.sh
#!bin/bash
name=wsh_blog51CTO
echo ${name:3:5}
[root@web01 ~]# . a.sh
_blog

${变量名#字符串}:从变量开头,删除最短匹配word的子串
${变量名##字符串}:从变量开头,删除最长匹配word的子串
[root@web01 ~]# vim a.sh
#!bin/bash
name=/tmp/abc/1.txt
echo ${name#*/}
echo ${name##*/}
[root@web01 ~]# . a.sh
tmp/abc/1.txt
1.txt

[root@web01 ~]# vim 1.txt
/tmp/abc/1.txt
/root/2.txt
/usr/local/src/3.txt

[root@web01 ~]# vim a.sh
#!bin/bash
for line in cat 1.txt;do
  echo ${line##*/}
done
[root@web01 ~]# . a.sh
1.txt
2.txt
3.txt

${变量名%字符串}:从变量结尾,删除最短匹配word的子串
${变量名%%字符串}:从变量结尾,删除最长匹配word的子串

#!bin/bash
for line in cat 1.txt;do
  echo ${line%%/*}
  echo ${line%/*}
done
[root@web01 ~]# . a.sh

/tmp/abc

/root

/usr/local/src

${变量名/匹配内容/替换内容}:使用string替换第一个pattern
[root@web01 ~]# vim a.sh
#!bin/bash
read -p '请输入用户名:' name
echo ${name/ww/wsh}
[root@web01 ~]# . a.sh
请输入用户名:ww_fff_ggg_ww
wsh_fff_ggg_ww

${变量名//匹配内容/替换内容}:使用string替换所有pattern
[root@web01 ~]# vim a.sh
#!bin/bash
read -p '请输入用户名:' name
echo ${name//ww/wsh}
[root@web01 ~]# . a.sh
请输入用户名:ww_ff_ww_gg
wsh_ff_wsh_gg

扩展变量

给变量默认值

${变量名:-字符串}:如果parameter没被赋值或其值为空,就以string作为默认值,它不会赋值给变量
[root@web01 ~]# echo $gender

[root@web01 ~]# echo ${gender:-male}
male
[root@web01 ~]# gender=female
[root@web01 ~]# echo $gender
female
[root@web01 ~]# echo ${gender:-male}
female
${变量名:=字符串}:如果parameter没被赋值或其值为空,就以string作为默认值,它会赋值给变量(用户没有传递值)
[root@web01 ~]# echo $gender

[root@web01 ~]# echo ${gender:=male}
male
[root@web01 ~]# gender=female
[root@web01 ~]# echo $gender
female
[root@web01 ~]# echo ${gender:=male}
female

${变量名:?报错信息}:如果parameter没被赋值或其值为空,就以?后面的字符串作为报错输出
[root@web01 ~]# unset gender
[root@web01 ~]# echo ${gender:?male}
-bash: gender: male
${变量名:+字符串}:如果parameter没被赋值或其值为空,就什么都不做,否则用string替换变量内容
[root@web01 ~]# gender=female
[root@web01 ~]# echo ${gender:+wsh}
wsh

变量的赋值方式

直接赋值: name=wsh
间接赋值:将一个命令执行的结果赋值给一个变量,IP=ifconfig eth0|awk 'NR==2{print $2}'
交互赋值:read -p '请输入xxx' 变量名
传参赋值:执行脚本的时候,将需要传递的变量值,写在脚本的后面 $1 $2 $3
read:
read 选项 变量名
read 选项 -p '一句话' 变量名

## 选项
-p:打印一句话
-s:不显示输入内容
-t:设置超时时间
-a:将后面的结果放入数组

[root@web01 ~]# vim a.sh
#!bin/bash
passwd=123
read -p 'm01 login:' name
read -s -p 'password:' pass

if [ $pass == $passwd ];then
  echo '登录成功'
else
  echo '密码错误'
fi
[root@web01 ~]# . a.sh
m01 login:www
password:密码错误
[root@web01 ~]# . a.sh
m01 login:www
password:登录成功

[root@web01 ~]# vim a.sh
#!bin/bash
passwd=123
read -p 'm01 login:' -a name
read -t 5 -s -p 'password:' pass

if [ $pass == $passwd ];then
  echo '登录成功'
  echo $name
else
  echo '密码错误'
fi
[root@web01 ~]# . a.sh
m01 login:www
password:-bash: [: ==: unary operator expected

[root@web01 ~]# . a.sh
m01 login:www wsg ww rrr
password:登录成功
www

shell中的数据类型

`

字符串类型

赋值:
name=’字符串’

取值:
$name

整型

age=18

数组类型

赋值:
list=(python java golang shell)

list[0]=’abc’
list[1]=’efg’
list[2]=’hij’
list[3]=’xyz’

取值:
${list[0]}
${list[1]}
${list[2]}
${list[3]}

list=(python java golang shell)
echo $list
echo ${list[1]}
echo ${list[2]}
echo ${list[3]}

list=(python java golang shell)
list[0]=’abc’
list[1]=’efg’
list[2]=’hij’
list[3]=’xyz’

echo $list ${list[1]} ${list[2]} ${list[3]}

Original: https://www.cnblogs.com/helong-123/p/16533087.html
Author: 萌褚
Title: CentOS shell中的变量

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581581/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • UE4游戏上架Steam全流程

    本人使用的是UE4.27.2, Windows 11操作系统。 首先,在ue4项目的插件设置中,勾选Online Subsystem 和 Online Subsystem Stea…

    Linux 2023年6月6日
    0102
  • Linux之Nginx模块扩展

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    Linux 2023年5月27日
    079
  • 面试题:Java中为什么只有值传递?

    作者:小牛呼噜噜 | https://xiaoniuhululu.com计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 经典的问题 形参&实参…

    Linux 2023年6月6日
    0138
  • 【论文笔记】(模型压缩)Do Deep Nets Really Need to be Deep?

    摘要 作者通过模型压缩(model compression)使浅层的网络学习与深层网络相同的函数,以达到深层网络的准确率(accuracy)。当与深浅模型的参数量相同时,浅层模型可…

    Linux 2023年6月7日
    0106
  • Vim 文本替换介绍与使用

    range 作用范围 空 # 默认为光标所在的行 . # 光标所在的行 n # 第 n 行(1表示第 1行,10表示第 10行),可使用:set nu 显示vim行号 $ # 最后…

    Linux 2023年6月6日
    093
  • 【安全框架】快速了解安全框架

    【安全框架】快速了解安全框架 🏆 一个有梦有戏的人 @怒放吧德德🌝分享学习心得,欢迎指正,大家一起学习成长! 这篇文章就来说说市面上的安全框架,并没有详细解释。 【安全框架】快速了…

    Linux 2023年6月6日
    0126
  • linux-0.11分析:进程初始化函数init(),第一部分setup((void *) &drive_info) ,第十二篇随笔

    进程的初始化函数, init() 先看看这个函吧: void init(void) { int pid,i; setup((void *) &drive_info); (v…

    Linux 2023年6月7日
    0102
  • Identity Server 4资源拥有者密码认证控制访问API(二)

    基于上一篇文章中的代码进行继续延伸,只需要小小的改动即可,不明白的地方可以先看看本人上一篇文章及源码: Identity Server 4客户端认证控制访问API 一、 Quick…

    Linux 2023年6月13日
    0114
  • NoteOfMySQL-08-视图

    视图是从一个表或多个表中导出的表,是一种虚拟存在的表,不占用存储空间。视图可以使用户的操作更方便,并且可以保障数据库系统安全性。 1. 视图概述 视图中保存的仅仅是一条select…

    Linux 2023年6月14日
    089
  • tiddlywiki-nodejs 安装部署

    安装 tiddlywiki (root) 确认 npm 包全局&amp…

    Linux 2023年6月14日
    092
  • @EnableFeignClients注解源码解析

    转载请注明出处: @EnableFeignClients 注解定义的源码 这个注解通过@Import注解导入一个配置类FeignClientsRegistrar.class ;Fe…

    Linux 2023年6月14日
    0100
  • 初识前后端

    初识前后端 在学习了解前后端的过程中,自己看到了这一篇好的文章,摘下了一些当下用的的内容,供复习参考。 什么是前端开发? 前端开发主要涉及网站和 App,用户能够从 App 屏幕或…

    Linux 2023年6月13日
    0115
  • .NET服务治理之限流中间件-FireflySoft.RateLimit

    FireflySoft.RateLimit自2021年1月发布第一个版本以来,经历了多次升级迭代,目前已经十分稳定,被很多开发者应用到了生产系统中,最新发布的版本是3.0.0。 它…

    Linux 2023年6月13日
    0102
  • 【镜像取证篇】DD系统镜像仿真问题的一些补充说明

    【镜像取证篇】DD系统镜像仿真问题的一些补充说明 ​ 系统千千万,环境占一半,遇到问题建议多重新挂载镜像,多尝试,站在岸上永远学不会游泳。—【蘇小沐】 【镜像取证篇】D…

    Linux 2023年6月13日
    0125
  • zabbix 报表动作日志 报错”503“

    本文来自博客园,作者:xiao智,转载请注明原文链接:https://www.cnblogs.com/yuwen01/p/16216868.html Original: https…

    Linux 2023年6月13日
    0108
  • Fastadmin引入Layui模块

    Fastadmin,PHP,Fastadmin引入layui模块,Fastadmin使用layui。 ​ Fastadmin基于 RequireJS进行JS模块的管理,因此如果我们…

    Linux 2023年6月6日
    098
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球