shell变量名后跟着 t_shell编程之变量

Shell变量核心基础知识与实践

1.shell变量知识

1.什么是变量?

就是用一个字符或字符串,表示一堆的内容,这个字符或字符串就叫变量,如x=1,x就是变量,=赋值,=表示相等,等号右边的内容,变量的内容。

2.Shell变量特性

默认情况下,在bash Shell中是不会区分变量是什么类型 的,例如:常见的变量类型为整数、字符串、小数等。

3.Shell变量分类

变量可分为两类:环境变量(全局变量)和普通变量 (局部变量)。环境变量也可称为全局变量,可以在创 建他们的Shell及其派生出来的任意子进程Shell中使用, 环境变量又可分为自定义环境变量和bash内置的环境变 量。普通变量也可称为局部变量,只能在创建他们的 Shell函数或Shell脚本中使用。普通变量一般由开发者在开发脚本程序时创建。

1.2 shell环境变量(全局变量)介绍

环境变量一般是用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行。Shell通过环境变量来确定登录用户名、命令路径、 终端类型、登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、Shell脚本和各类应用。

1.2.1 操作shell环境变量

1.显示环境变量

echo $变量名字

env,set

2.定义环境变量,3种方法:变量名尽量大写

1)export A=1

2)B=1

export B

3)declare

declare -x A=1

3.取消环境变量

unset 变量名

1.2.2 环境变量初始化与对应文件生效顺序

1.环境变量的文件:

全局文件

/etc/profile

/etc/bashrc

用户环境变量文件

~/.bashrc

~/.bash_profile

2.环境变量初始化与对应文件生效顺序:优先加载/etc/profile,然后加载~/.bash_profile再次加载~/.bashrc,最后加载/etc/bashrc

~/.bash_profile 4

~/.bashrc 3

/etc/bashrc 2

/etc/profile 1

1.3 普通变量(局部变量)

当前用户或者脚本中生效,离开当前用户或者脚本就会失效

1.3.1 操作shell普通变量

1.定义普通变量

规则:见名知意,字母、数字、下划线,3者组合,以字母开头

1)OldboyAge=1

2)oldboy_age=1

3) oldboyAge=1 ###驼峰语法

2.变量内容

字符串:

变量名=value #<==不加引号。 ##解析变量或者命令,然后输出,纯数字选择不加引号。

变量名=’value’ #<==加单引号。 ###所见即所得

变量名=”value” #<==加双引号。 ##解析变量或者命令,然后输出,字符串默认选择双引号,可以把要定义的内容作为一个整体。

3.命令变量

变量名=`ls`

变量名=$(ls)

1.3.2 普通变量定义及输出小结

针对变量名:

1)变量名的定义要有一定的命令规范,并且要见名知意,OldboyAge=1,推荐使用驼峰语法。

2)变量名仅能使用字母、数字、下划线中的任意多个字符,并且要字母开头。

针对变量内容:

3)在脚本中定义普通字符串变量,尽量把变量的内容用双引号括起来。

4)单纯数字的变量内容可以不加引号。

5)希望变量的内容原样输出需加单引号。

6)希望变量值引用命令并获取命令的结果就用反引号或$()。

针对赋值符号:

7)变量定义使用赋值符号(=),赋值符号两端不要有空格。

针对变量输出:

8)使用或者输出变量的内容,可用$变量名,例如:echo $OldboyAge。

9)若变量名(db)后面有其他字符连接的时候,就必须给变量名加上大括号{},例如:$db_t就要改成${db}_t

1.4 Shell特殊重要变量

1.4.1 shell特殊位置变量

在Shell中存在一些特殊且重要的变量,例如:、0、1、$#,我们称之为特殊位置参数变量,要从命令行、函数、或脚本执行等处传递参数时,就需要在 Shell脚本中使用位置参数变量

位置变量作用说明企业应用

$0

获取当前脚本的名称,如脚本前面跟着路径的话,那就获取脚本的路径加名称

一般在启动脚本的结尾会使用$0获取脚本的路径和名字给用户提示用

$n

获取当前脚本的第n个参数值,n=1..9,当n为0时表示文件名,如果n大于9,则需要用大括号括起来,例如${10},接的参数以空格分隔

一般用于选择脚本的启动,停止等

$*

获取当前脚本所有传参的参数,不加引号作用同$@,如果给$加上引号,例如:"$",则表示将所有的参数视为单个字符,例如"$1 $2 $3"

当需要接收脚本后面所有参数时,但是又不知道参数个数就用这个变量

$@

获取当前脚本所有传参的参数,不加引号作用同$*,如果给$@加上引号,例如:"$@",则表示将所有的参数视为不同的独立字符串,例如"$1" "$2" "$3"

当需要接收脚本后面所有参数时,但是又不知道参数个数就用这个变

1.4.2 shell进程特殊状态变量

状态变量作用说明

$?

获取上一个指令的执行状态返回值(成功为0,不成功非0)

$$

获取当前脚本的进程号(PID)

$!

获取上一个在后台工作进程的进程号

$_

获取上一个命令或脚本的最后一个参数

1.4.3 shell变量子串知识

ID表达式作用说明

1

${parameter}

返回${parameter}变量内容

2

${#parameter}

返回${parameter}内容长度(按字符)

3

${parameter:offset}

在变量${parameter}中,从位置offset之后提取子符串到结尾

4

${parameter:offset:length}

在变量${parameter} 中,从位置offset之后提取长度为length的字符串

5

${parameter#word}

从变量${parameter}开头删除最短匹配的word字符串

6

${parameter##word}

从变量${parameter}开头删除最长匹配的word字符串

7

${parameter%word}

从变量${parameter}结尾开始删除最短匹配的word字符串

8

${parameter%%word}

从变量${parameter}结尾开始删除最长匹配的word字符

9

${parameter/pattern/string}

使用string替换第一个匹配pattern

10

${parameter//pattern/string}

使用string替换所有匹配pattern

1.4.4 shell特殊变量扩展

表达式作用说明用途

${parameter:-word}

如果parameter变量为空或未赋值,就会返回字符串替代变量的值

如果变量未定义,则返回备用的值,防止变量为空或者未定义而导致异常

${parameter:=word}

如果parameter变量为空或未赋值,就设置这个变量值为word并返回其值。位置变量与特殊变量不适用

基本同上一个${parameter:-word}相同,不同的是会额外给parameter变量赋值

${parameter:?word}

如果parameter变量为空或未赋值,word字符串将被作为标准错误输出,否则输出变量的值

用于捕捉由于变量未定义而导致的错误,并退出程序

${parameter:+word}

如果parameter变量为空或未赋值,则什么不做,否则word字符串会替代变量的值

2. shell变量的数值计算

2.1 算术运算符

2.2 bash编程常见运算命令汇总

运算操作符与运算命令意义

(())

用于整数运算的常用运算符

let

用于整数运算,类似(())

expr

用于整数运算,但还有其它的额外功能

s[]

用于整数运算

bc

用于小数或整数运算

awk

用于小数或整数运算

declare

定义变量值和属性,-i参数可以用于定义整形变量,做运算

2.3 双小括号“(())”数值运算的基础语法

运算操作符与运算命令意义

((i=i+1))

此种书写方法,先运算后赋值法,即将i+1的结果赋值给变量i,不能使用echo"((i=i+1))"的输出形式,可以使用echo $((i=i+1))输出其值

i=可以在前加((i+1))|可以在(())前加符,将表达式运算后赋值给i

((8>7&&5==5))

可以进行比较操作,还可以加入逻辑或与逻辑与,用于条件判断

echo 需要直接输出运算表达式结果可以在前加((2+1))|需要直接输出运算表达式结果可以在(())前加

2.4 let运算语法

语法格式: let 赋值表达式

let赋值表达式同等于((赋值表达式))

[root@ci-node1 scripts]# aa=12

[root@ci-node1 scripts]# let i=$aa+10

[root@ci-node1 scripts]# echo $i

22

[root@ci-node1 scripts]#

2.5 expr命令计算基本用法

[root@ci-node1 scripts]# expr 2 + 2

4

[root@ci-node1 scripts]# expr 2 \* 2

4

[root@ci-node1 scripts]# expr 2 / 2

1

注意:使用expr时,运算符与计算的数所必须要有空格隔开,使用*号时需要使用转义符\进行转义

2.5.1 expr其它用法,判断一个数字是否为整数

[root@ci-node1 scripts]# i=5

[root@ci-node1 scripts]# expr $i + 6 &>/dev/null #&>/dev/null表示不保留任务的输出

[root@ci-node1 scripts]# echo $?

0

[root@ci-node1 scripts]# expr $i + 6a &>/dev/null

[root@ci-node1 scripts]# echo $?

2

使用expr判断数字是否为整数,如果echo $?返回0则表示是一个整数,返回非0则表示不是一个整数

#!/bin/bash

expr 2 + $1 & >/dev/null

if [ $? -ne 0 ]

then

echo "这不是一个整数"

else

echo "这是一个整数"

fi

2.5.2 使用expr判断文件扩展名是否符合要求

#!/bin/bash

expr "$1" : ".*\.txt" &>/dev/null

if [ $? -eq 0 ]

then

echo "$1 是文本"

else

echo "$1 不是文本"

fi

2.5.3 使用expr来计算字符串长度

[root@ci-node1 scripts]# oldboy="I am oldboy"

[root@ci-node1 scripts]# expr length "$oldboy"

11

2.6 适合小数运算的bc命令(需先安装bc命令)

[root@ci-node1 scripts]# echo 1.2+3.3|bc

4.5

[root@ci-node1 scripts]# echo 1.2*3.3|bc

3.9

[root@ci-node1 scripts]# echo 1.2/3.3|bc

0

[root@ci-node1 scripts]# echo 1.2%3.3|bc

1.2

[root@ci-node1 scripts]# echo "scale=2;335/113"|bc # scale表示保留几位小数

2.96

2.7 适合小数运算的awk命令

[root@ci-node1 scripts]# echo "335 113"|awk '{print ($1-$2)}' # $1表示第一个数字,$2表示第二个数字

222

[root@ci-node1 scripts]# echo "335 113"|awk '{print ($1*$2)}'

37855

[root@ci-node1 scripts]# echo "335 113"|awk '{print ($1+10)*$2}'

38985

3.特殊内置命令read

shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入中获取,read为bash内置命令,可以通过help read获取帮助

语法格式:read [参数] [变量名]

常用参数:

-p prompt:设置提示信息

-t tiemout:设置输入等待时间,单位默认为秒

3.1 基于shell变量输入read命令

将加减乘除计算的脚使用read方式读入整数变量

[root@ci-node1 scripts]# cat 4.sh

#!/bin/bash

read -p "请输入两个数字:" a b

echo "a-b=$(($a-$b))"

echo "a+b=$(($a+$b))"

echo "a*b=$(($a*$b))"

echo "a**b=$(($a**$b))"

echo "a/b=$(($a/$b))"

echo "a%b=$(($a%$b))"

[root@ci-node1 scripts]# sh 4.sh

请输入两个数字:11 22

a-b=-11

a+b=33

a*b=242

a**b=-2732210440490168087

a/b=0

a%b=11

4.shell脚本的条件测试与比较

4.1 条件表达式常见语法

条件测试语法说明

test

利用test命令进行测试表达式的方法,test与测试表达式之间有一个空格

[测试表达式]

这是通过中括号进行测试表达式的方法,与test用法相同,[]边界和内容之间至少 有一个空格

[[测试表达式]]

这是通过双中括号进行测试表达式的方法 ,[[]]边界和内容之间至少 有一个空格

((测试表达式))

这是通过双小括号进行测试表达式的方法,一般用于if语句里,(())两端不需要空格

(命令表达式)

这是通过小括号进行测试表达式的方法

`命令表达式`

这是通过反引号进行测试表达式的方法

4.2 文件测试表达式的常见功能说明

常用文件测试参数说明

-d(directory)

文件存在且为目录则为真

-f文件,f全拼为file

文件存在且为普通文件则为真

-e(exist)

文件存在则为真,-e不辩别是目录还是文件

-r(read)

文件存在且可读则为真

-s(size)

文件存在且文件大小不为0则为真

-w(write)

文件存在且文件可写则为真

-x(executable)

文件存在且文件可执行则为真

-L(link)

文件存在且为链接文件则为真

f1 -nt(newer than) f2

文件f1比文件f2新则为真,根据修改时间来算

f1 -ot(older than) f2

文件f1比文件f2旧则为真,根据修改时间来算

4.3 字符串测试表达式的常见功能说明

字符串参数说明

-n "字符串"

若字符串长度不为0则为真

-z "字符串"

若字符串长度为0则为真

"字符串" = "字符串"

若字符串相等则为真

"字符串" != "字符串"

若字符串不相等则为真

4.4 整数测试表达式知识

[]与test中使用的比较符号(()) 与[[]]使用的符号说明

-eq(equal)

==

等于

-ne(not equal)

!=

不等于

-gt(greater than)

>

大于

-lt(less than)

<

小于

-ge(greater equal)

>=

大于等于

-le(less equal)

<=

小于等于

ps:可以使用man test来查看更多的文件比较符号

4.5 逻辑测试表达式

4.6 条件表达式符号的语法对比

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 shell 脚本中定义局部变量可以使用如下方法: 1. 在函数内部定义局部变量: ``` myfunc() { local var1=value1 echo $var1 } ``` 2. 使用 declare 命令定义局部变量: ``` declare -l var1=value1 echo $var1 ``` 注意:在 shell 脚本中,使用 local 命令或者 declare 命令定义的变量都是局部变量,只能在定义它们的函数或者脚本块中使用。 参考文献: - 《Linux Shell Scripting Cookbook》 - 《Linux命令行与Shell脚本编程大全》 ### 回答2: 在Shell脚本中,我们通常使用局部变量来存储只在特定代码块中有效的值。要定义一个局部变量,可以使用函数。 首先,在脚本中定义一个函数,例如: ```shell my_function() { local my_variable="这是一个局部变量" echo $my_variable } ``` 在函数内部,使用关键字`local`来声明一个局部变量。这样,`my_variable`就成为了函数`my_function`中的局部变量,其作用范围仅限于该函数内部。 当我们调用函数时,局部变量会被创建和赋值。在函数中,我们可以使用`echo`等命令来输出局部变量的值。 举个例子,我们调用函数`my_function`来验证: ```shell my_function ``` 这里,函数会输出`这是一个局部变量`,证明了局部变量的定义和使用。 需要注意的是,局部变量在函数外部是不可见的。如果我们尝试在函数外部使用`my_variable`,将会报错。 通过使用函数和`local`关键字来定义局部变量,我们可以更灵活地控制变量作用的范围,使得Shell脚本更加模块化和可维护。 ### 回答3: 在shell脚本中,可以通过以下方式定义局部变量: 1. 使用函数来定义局部变量:可以在需要的函数内部使用`local`关键字,后跟变量名进行定义。例如: ```shell my_function() { local my_var="局部变量" echo "$my_var" } ``` 2. 使用子shell来定义局部变量:通过在一对小括号中执行命令,使命令在子shell中运行,并在子shell中定义的变量只在子shell中可见。例如: ```shell ( my_var="局部变量" echo "$my_var" ) ``` 3. 通过函数调用传递参数作为局部变量:可以将需要的变量作为函数的参数传递,并在函数内部进行处理。例如: ```shell my_function() { local my_var="$1" echo "$my_var" } my_var="全局变量" my_function "$my_var" ``` 无论使用哪种方式,定义的局部变量只在其所在的函数或子shell中有效,出了函数或子shell后就不能再访问该变量了。这样可以防止变量污染和命名冲突,提高脚本的可维护性和可读性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值