变量的定义--(shell脚本03)

1. 变量的分类

1.1 分类

1.本地变量:当前用户自定义的变量,当前进程中有效,其他的进程与子进程中无效。
2.环境变量:当前进程有效,能被子进程调用
查看当前用户的环境变量 env
查看当前用户的所有变量 set
将当前变量变成环境变量: export

永久生效:

vim /etc/profile 或者~/.bashrc
export A=hello

3.全局变量
所有的用户和程序都能调用,继承,新建的用户也能使用
4.系统变量(内置bash中的变量):shell本身已经固定好了他的名字和作用:

$?  上一条命令的执行返回的状态,0表示正常,非0 表示异常出错
127表示没有找到命令
126 权限不够
1&2 没有那个文件或者目录


$$ 当前所在进程的进程号 
$! 后台运行的最后一个进程号
!$ 调用最后一条命令历史中的参数
!! 调用最后一条命令
$@ 脚本后边的所有参数
$0 当前执行的进程

$* $@区别
* 将变量看成一个整体
@ 表示变量时独立的

#!/bin/bash 
for i in "$@"
do 
 echo $i
done
echo "======"
for i in "$*"
do 
 echo $i
done


[root@sj  14:56:40 /shell01]# ./1.sh a b c
a
b
c
======
a b c

1.2 什么时候定义变量

1.在代码中重复出现
2.代码运行中需要把某些命令的执行结果保存起来,后边需要使用

2. 定义规则

默认定的情况下,shell里定义变是不分类型的,可以给变量赋予任何类型的值,等号两边不能有空格,有空格需要引号引起来

2.1 变量的获取方式

$变量名
${变量名]
${a:2:3} a表示变量名,2表示从下标位2开始,后边的3个子字符

2.取消变量

unset 变量名

3.变量名称区分大小写
4.变量名可以是字母或者下划线,但是不能以数字开头,或有特殊的字符
5.命令执行的结果可以保存到变量中

a=`uname -r`
name=$(uname -n)

6.有类型的变量declare

declare 参数
-i 整数
-r 只读
-x 通过环境导出export
-a 普通数组
-A 关联数组

declare -i a=1
declare -i b=2
declare -i c=$a+$b
echo $c

declare -x b=hello 
env|grep b

7.数组

普通数组:只能使用整数下标
arry[0]=v1
arry[1]=v2
arry[2]=v3
一次赋多个值
arry=(var1 var2 var3 )
将文件中的每一行赋值给
arry1=(` cat /etc/passwd`)
arry2=(`ls /root`)
数组的读取:
${arry[i]} i 表示下标
${arry[*]} 所有元素
${#arry[*]}元素的个数
${!arry[*]} 元素的索引下标
${array[@]:1:2}    访问指定的元素;1代表从下标为1的元素开始获取;2代表获取后面几个元素


关联数组:
声明关联数组
declare -A arry1
declare -A arry2
一次赋一个值
arry[linux]=one
arry[java]=two
arry[php]=three

一次多个值
arry2=([name1]=harry [name2]=hello)

查看关联数组
declare -A
echo ${arry[linux]}

2.2 交互式定义变量的值

read 参数
-p 提示信息 
-n 字符数
-s 不显示
-t 超时

示例:

cat 1.txt
yq 30
read -p "input your name and age: " name age < 1.txt
name age是用空格进行的,所以文件1.txt中的也需要用空格进行

3. 简单的四则运算

shell运算的四种方式:默认的情况下是shell只支持简单的整数运算

1.使用 ( ( ) ) 2. 使 用 (()) 2.使用 (())2.使[]
3.使用expr 外部程式
4.使用let命令
let n=n+1
i++与++i的区别

总结:

$(())  $[]
expr 注意空格,*要进行转义 \

let n+=1  等价   let n=n+1
let n=n**5		n有初值,然后求次幂

i++	++i	
对变量本身没有影响(自己+1);
表达式中有影响;i++ 先赋值再运算  ++i先运算再赋值

4. 条件判断

格式1:test 条件表达式
格式2:[ 条件表达式 ]
格式3:[[ 条件表达式 ]] 支持正则

4.1 判断文件存在与否

-e 是否存在,不管是文件还是目录,存在就成立 
-d 是否为目录
-f 是否为文件
-S	socket
-p	pipe
-c	character
-b	block
-L	软link

示例:注意[]两边需要空格

test -e file
[ -d /shell01/1.txt ]
[ ! -d /shell02/1.txt ]
[[ -f /shell01/1.txt ]]

判断文件是否为空-s 
非空
test -s 1.sh
空
test ! -s 1.sh

4.2 文件权限相关的判断

-r	当前用户对其是否可读
-w	当前用户对其是否可写
-x	当前用户对其是否可执行
-u	是否有suid
-g	是否sgid
-k	是否有t位

4.3 两个文件比较判断

file1 -nt  file2	比较file1是否比file2新	
file1 -ot  file2 	比较file1是否比file2旧
file1 -ef  file2	比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode

test file1 -nt file2	
[ file1 -ot file2 ]

4.4 整数之间的判断

-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于

4.5 字符串之间的判断

-z 是否为空字符串
-n  非空
string1 = string2 		是否相等
string1 != string2 		不等
[ $AAA != $BBB ]
test -n $AAA

4.6 多重条件判断

逻辑判断符号:
 -a     和 &&  	(and 逻辑与) 		两个条件同时满足,整个大条件为真
 -o     和 ||	(or 逻辑或)		  	两个条件满足任意一个,整个大条件为真
 
[ 1 -eq 1 -a 1 -ne 0 ]				整个表达式为真
[ 1 -eq 1 ] && [ 1 -ne 0 ]			

[ 1 -eq 1 -o 1 -ne 1 ]				整个表达式为真
[ 1 -eq 1 ] || [ 1 -ne 1 ]

&&:前面的表达式为真
||:前面的表达式为假

总结:
1; && ||都可以用来分割命令或者表达式
2; 完全不考虑前面的语句是否正确执行,都会执行;号后面的内容
3&& 需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然
make && make install
4|| 需要考虑||前面的语句的非正确性,前面语句执行错误才会执行||后的内容;反之亦然
5、如果&&||一起出现,从左往右依次看,按照以上原则
注意:在(( ))中,=表示赋值;==表示判断
字符串比较:
注意:双引号引起来,看作一个整体;===[ 字符串 ] 比较中都表示判断
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长安有故里y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值