浅学一下Shell脚本(3)--变量

一.Shell中的变量

1.变量的定义规则

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线 _。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。
  • 环境变量建议大写,便于区分

2.bash中的引号

  • 双引号"" :会把引号的内容当成整体来看待,允许通过$符号引用其他变量值。
  • 单引号’’ :会把引号的内容当成整体来看待,禁止引用其他变量值,shell中特殊符号都被视为普通字符
  • 反撇号`` :反撇号和$()一样,引号或括号里的命令会优先执行,如果存在嵌套,反撇号不能用

$()用于 命令 替换,${}用于 变量 替换,$[]是整数运算

[root@server ~]# echo "$(hostname)"
server
[root@server ~]# echo '$(hostname)'
$(hostname)

[root@server ~]# echo $(date +%F)
2022-04-12
[root@server ~]# echo `date +%F`
2022-04-12

3.自定义变量

自定义变量是由系统用户自己定义的变量,只在用户自己的 Shell 环境中有效,因此又称为本地变量。

# 1.定义
yourname="laowang"		
#注意:变量名和等号之间不能有空格!

# 2.使用
echo $yourname
echo ${yourname}		
# 花括号是为了帮助解释器识别变量的边界
# 推荐给所有变量加上花括号

# 3.删除
unset yourname

4.特殊的Shell变量

☆环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。

env				# 查看当前用户的环境变量
set				# 查询当前用户的所有变量(临时变量与环境变量)
export			# 将当前变量变成环境变量
#1.环境级别 
export a=1 
#在环境关闭后失效 

#2.用户级别(针对当前用户)
vim ~/.bash_profile 
export a=1 

source ~/.bash_profile 

#3.系统级别(针对所有用户)
vim /etc/profile 
export a=2

source /etc/profile 


用户登录系统读取相关文件的顺序:
/etc/profile——>$HOME/.bash_profile——>$HOME/.bashrc
——>/etc/bashrc——>$HOME/.bash_logout
  • PATH变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux 系统将在 PATH 变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”。
  • 若希望能直接通过文件名称来运行脚本,可以 修改 PATH 变量(/etc/profile,$HOME/.bash_profile) 以添加搜索路径。

☆系统变量(内置bash中变量)

系统变量说明
$$当前所在进程的进程号
$!后台运行的最后一个进程号
$?上一条命令执行后的返回值,当返回值为0时表示执行正常,非0值表示执行异常
$*脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开
$@脚本后面所有参数,参数是独立的
$#脚本后面接的参数的个数
$0当前执行的进程/程序名
$1~$9位置参数变量
${10}~${n}扩展位置参数变量 第10个位置变量必须用{}大括号括起来

☆只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.baidu.com"

#这个脚本运行结果如下
/bin/sh: NAME: This variable is read only.

二.脚本的传参

1.非交互式传参

运行脚本时,直接在后面跟参数,多个参数以空格隔开。

[root@server ~]# cat para.sh
#!/bin/bash
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

[root@server ~]# chmod +x para.sh
[root@server ~]# ./para.sh 1 2 3
执行的文件名:./para.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

2.交互式传参

read [选项][变量名]
#选项:
-a:后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认以空格为分割符。
-p:“提示信息”:在等待read输入时,输出提示信息
-t:秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
-n:数字:read命令只接受指定的字符数,就会执行
-s:隐藏输入的数据,适用于机密信息的输入

#变量名:
可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY.

案例:

#!/bin/bash

read -t 30 -p "Please input your name: " name
echo "Name is $name"

read -s -t 30 -p "Please enter your passwd: " passwd
echo -e "\n"			# -e表示开启转义
echo "Your passwd is $passwd"

read -n 1 -t 30 -p "Please select your gender[M/F]:" gender
echo -e "\n"
echo "Sex is $gender"

三.命令的别名设定

alias xie='vim'		#临时设定 

vim ~/.bashrc		#只针对当前用户生效 
alias xie='vim'		

vim /etc/bashrc		#针对所有用户生效 
alias xie='vim' 

unalias xie			#删除当前环境中的alias

四.数组

# 一次赋一个值:
array[0]=v1
array[1]=v2
array[2]=v3


# 一次赋多个值:
array=(var1 var2 var3 var4)
array1=(`cat /etc/passwd`)			#将文件中每一行赋值给array1数组
array2=(`ls /root`)

# 读取数组:
echo ${array[i]}				#i表示元素的下标
echo ${array[*]}				#获取数组里的所有元素
echo ${#array[*]}				#获取数组里所有元素个数
echo ${!array[@]} 				#获取数组元素的索引下标
echo ${array[@]:1:2}    		#访问指定的元素;
								#1代表从下标为1的元素开始获取;
								#2代表获取后面几个元素

五.简单的四则运算

# 默认情况下,shell就只能支持简单的整数运算(+-*/)

Bash shell 的算术运算有四种方式:
# 1. 使用 $(( ))
$((1+1))

# 2. 使用$[ ]
$[1+1]

# 3. 使用 expr 外部程式
expr 3 \* 3					#表达式和运算符之间要有空格,乘号需要转义

# 4. 使用let 命令
let i++

# 要计算小数需要借助bc工具
echo 1+1.5|bc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cross-Attention指的是Transformer架构中的一种注意力机制,它用于混合两个不同嵌入序列的注意力。这两个序列必须具有相同的维度,并且可以是不同的模式形态,比如文本、声音、图像等。在Cross-Attention中,一个序列作为输入的Q,定义了输出的序列长度,而另一个序列提供输入的K和V。 Cross-Attention与Self-Attention不同之处在于,Cross-Attention的输入来自不同的序列,而Self-Attention的输入来自同一个序列。但除此之外,它们的基本原理是一致的。在Transformer中,Cross-Attention通常是指编码器和解码器之间的交叉注意力层。在这一层中,解码器会对编码器的输出进行注意力调整,以获得与当前解码位置相关的编码器信息。具体的计算过程包括:编码器输入(通常是来自编码器的输出)和解码器输入(已生成的部分序列)被分别表示为enc_inputs和dec_inputs。解码器的每个位置会生成一个查询向量(query),用来在编码器的所有位置进行注意力权重计算。编码器的所有位置会生成一组键向量(keys)和值向量(values)。通过对查询向量和键向量进行点积操作,并通过softmax函数获得注意力权重。注意力权重与值向量相乘,并对结果进行求和,得到编码器调整的输出。这样,Cross-Attention机制帮助解码器能够有效地建模当前生成位置的上下文信息。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【科研】Cross-attention?](https://blog.csdn.net/MengYa_Dream/article/details/126688503)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [交叉注意力机制CrossAttention](https://blog.csdn.net/m0_63097763/article/details/132293568)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值