shell逻辑运算符优先级_shell学习笔记(二)shell变量与运算符

Shell学习:变量与运算符详解
这篇博客详细介绍了Shell中的变量类型,包括局部变量、环境变量,以及各种变量替换和特殊变量。此外,还讨论了位置变量、标准shell变量,并深入讲解了位运算符、逻辑运算符、关系运算符和赋值运算符。文章还涵盖了运算符的优先级,为理解Shell脚本的执行逻辑提供了清晰的指导。

shell学习笔记(二)shell变量与运算符目录:

====================================================

本地变量—局部变量

本地变量—局部变量

变量替换

位置变量

标准shell变量

特殊变量

影响变量的命令

引号

运算符

位运算符

逻辑运算符

关系(条件)运算符

赋值运算符

表达式替换

运算符的优先级

====================================================

变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell中可用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shell变量

变量名必须以字母或下划线字符开头。其余的字符可以是字母、数字(0~9)或下划线字符。任何其他的字符都标志着变量名的终止。名字是大小写敏感的。给变量赋值时,等号周围不能有任何空白符。为了给变量赋空值,可以在等号后跟一个换行符。创建一个局部变量最简单的格式是给一个变量赋值

本地变量—局部变量

只限于现在的shell

设置变量 eg: viong=“123”

echo $viong

Set 查看本地变量

Readonly 查看只读变量

Unset viong 清除变量

环境变量—全局变量

所有用户进程

Export 设置环境变量 eg:export viong=“123”

Env 查看环境变量 也可以直接执行export

修改环境变量目录 /etc/profile

变量替换

variable['vεəriəbl]变量

value['vælju:]值

variable是通过echo显示出来

${ variable name}

${ variable name:+value}如果设置了variable name,则显示其值,否则为空

${ variable name:?Value}如果未置了variable name,则显示用户定义错误信息

${ variable name:-value}如果未置了variable name,则显示其值

${ variable name:= value}如果未置了variable name,则设置其值并显示

eg:export viong=“123”

echo ${viong:+”5”}5

echo ${viong1:+”5”}为空

echo ${viong1:?”no defined”} no defined

echo ${viong1:=”5”} 5并且把viong1=“5”

位置变量

位置变量有10个 从$0-$9其中$0是显示脚本名字

Eg:[root@viong_app1 soft]# cat find.sh

#!/bin/bash

#find

find / -name $1 -print

[root@viong_app1 soft]# ./find.sh soft

/root/soft

/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/vgacon/soft

/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/soft

标准shell变量

(大写)

Bash默认设置了,会自动解析

EXINIT 定义初始化VI

HOME 主目录

IFS字行页之间分割 默认是用空格

LOGNAME 登录名

MAIL标准用户邮箱存储的位置

MAILCHECK 检查邮箱的时间间隔

MAILPATH 多个邮箱的时候显示路径

TERM 终端类型

PATH 可执行文件的路径

TZ表示时区

PS1 登录系统提示符

eg:[root@viong_app1 soft]#

PS1='[\u@\h \W]\$ '

‘[ \u 用户名@\h 主机名字 \W当前目录]\$’ ROOT登录是#提示符其它用户是$提示符

ps2 在一行上面运行多个命令的时候 会有“>“提示符

PWD 查看当前目录

特殊变量

$# 传递到脚本的参数个数

$* 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可超过9个

$$脚本运行的当前进程ID号

$! 后台运行的最后一个进程的进程ID号

$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数

$- 显示shell使用的当前选项,与set命令功能相同

$?显示最后命令的退出状态,0表示没有错误,其它任何值表明有错误

eg:

[root@viong_app1 soft]# cat find.sh

#!/bin/bash

#find

find / -name $1 -print

echo "$2"

echo "$3"

echo "$#"

echo "$*"

echo "$$"

echo "$?"

[root@viong_app1 soft]# ./find.sh soft viong lin

/root/soft

/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/vgacon/soft

/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/soft

viong

lin

3

soft viong lin

11349

0

影响变量的命令

declare

-设置或显示变量

-f 只显示函数名

-r 创建只读变量

-x 创建转出变量

-i 创建整数变量

使用+替代-,可以颠倒选项的含义,但是无法颠倒-r参数

可以通过export或者readonly查看获取 readonly一旦设置无法删除及更改

想删除只读变量,只有重启系统才能自动取消

export

-- 直接加实参

-f 表明在“名-值“对中的名字是函数名

-p 显示全局变量列表

-n 把全局变量转换成局部变量,换句话说,命令的变量不再传给shell

readonly 把变量设置为只读状态,一旦设置无法更改

set设置或者重设变量的定义

unset 取消变量的定义,但不能取消shell环境中删除指定的变量和函数 PATH PS1

shift[n]用于移动位置变量,调整位置变量,使$3的值赋予$2,$2的值赋予$1

[root@viong_app1 soft]# cat find.sh

#!/bin/bash

#find

find / -name $1 -print

echo "$2"

echo "$3"

ech0 "4"

echo "$#"

echo "$*"

echo "$$"

echo "$?"

shift

echo "$2" /显示相当于$3

echo "$3" /显示相当于$4

[root@viong_app1 soft]# ./find.sh soft viong lin lee

/root/soft

/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/vgacon/soft

/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/soft

viong

lin

./find.sh: line 6: ech0: command not found

4

soft viong lin lee

11364

0

lin

lee

typeset用于显示或者设置变量 与declare是同义词

引号

双引号可引用除了字符$, `(反引号), \外的任意字符或字符串

eg:

echo viong *与echo “viong *”

[root@viong_app1 soft]# echo -e "viong5,$HOME '\n* lin`echo viong3`"

viong5,/root '

* linviong3

'\n是单引号\n因为符合比较小难辨别

\n代表回车

单引号会将引号里的所有字符,包括引号都作为一个字符串,如前面加 –e 转移字符 后面\n会被定义为回车换行

eg:

[root@viong_app1 soft]#echo -e 'viong5,$HOME \n* lin`echo viong3`'

viong5,$HOME

* lin`echo viong3`

去掉\n前面单引号做演示

反引号用于设置系统命令的输出到变量,shell将反引号中的内容作为一个系统命令,并执行其内容

eg:

[root@viong_app1 soft]# echo $viong

123

[root@viong_app1 soft]# echo "lin`echo $viong`"

lin123

反斜杠  如果一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义

如特殊含义字符:& * + $ | ?

eg:

[root@viong_app1 ~]# echo *

anaconda-ks.cfg install.log install.log.syslog soft

[root@viong_app1 ~]# echo \*

*

运算符

运算符是对计算机发的指令

运算对象

-数字 字符

-变量

-表达式

位运算符

$[ ]表达式的值

~ A

反运算符 所有的二进制为1变0,0变1

eg:

[root@viong_app1 ~]# echo $[~4]

-5

4100

所以~4 =011

-5 既然是负数,那么这个数一定是按有符号数的规则来表示的,一个二进制按位取反

并加一,就可得到它自己的负数的补码

~x+1=-x

所以我们把~5按位取反 -5= 010(~5 101取反010)+1 ->011即=~4

更简单就是~x=-x-1规则去计算

位运算符大部分用在汇编语言中来表示内存中的存储逻辑位,很复杂

A<

A中的二进制位左移B位 ,忽略最左端移出的各位,最右端各位补上0,每做一次换位左移就有实现A乘以2^B

eg:

010 左移三位 10000 =2^4

2<<3 相当于2x2x2x2=16

A>>B 右移运算符

A中的二进制位右移B位 ,忽略最右端移出的各位,最左端各位补上0,每做一次换位左移就有实现A除以2 ^B

eg:

10000 右移三位 100

16>>2 相当于 16/2/2=4

A&B 与比较运算符

A与B对于位,对于每个二进制位来说,如果二者该位都是1,则结果位1,否则位为0

eg:

4 100

2 010

echo $[4&2] 则为0

A^B 异或运算符

比较A与B的对应位,对于每个二进制位来说,如果二者该为互补,则结果为1,否则为0

eg:

4 100

2 010

echo $[4^2] 则为6

echo $[2^2] 则为0

|    或运算符

比较A与B的对应位,对于每个二进制位来说,如果二者该位有一个是1或者都是1,则结果为1,否则结果位为0

eg:

4 100

2 010

6 110

echo $[4|2] 则为6

echo $[2|6] 则为6

逻辑运算符

&&  与运算符

AB     A&&B

00      0

10      0

01      0

11      1

eg:

4 100

2 010

echo $[4&&2]则为0

echo $[2&&2]则为1

|| 或运算符

对于每个二进制位来说,如果二者该位都是1,则结果值为1,否则结果值为0

AB     A||B

00      0

10      1

01      1

11      1

eg:

4 100

2 010

echo $[4||2] 则为1

echo $[0||0] 则为0

! 非运算符

关系(条件)运算符

, >=, ~(匹配正则表达式), !~(不匹配正则表达式)

赋值运算符

用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种

let count= $count + $change

let count+= $count

eg:

[root@viong_app1 ~]# viong=12

[root@viong_app1 ~]# echo viong

viong

[root@viong_app1 ~]# echo $viong

12

[root@viong_app1 ~]# let viong+=5let是bash内置的整数运算

[root@viong_app1 ~]# echo $viong

17

[root@viong_app1 ~]# let viong-=5

[root@viong_app1 ~]# echo $viong

12

[root@viong_app1 ~]# let viong*=5

[root@viong_app1 ~]# echo $viong

60

表达式替换

$[ ]和$[]一样 ,所有shell的求值都是用整数完成

$[ ] 可以接受不同基数的数字

[base#n] n 表示基数从2到36的任何基数

运算符的优先级

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值