2.shell变量


Shell 语言是一种动态类型和弱类型语言, 因此,在Shell中无需显示地声明变量, 且变量的类型会根据不同的操作符而发生变化.

  • 静态类型语言: 在程序编译期间就确定变量类型的语言, 如java, C++等
  • 动态类型语言: 在程序运行期间才确定变量类型的语言, 如PHP, Python等.

2. 变量

2.1 变量命名

变量名的命名须遵循如下规则:

  • 变量名区分大小写
  • 变量名可以由字母,下划线,数字组成, 但是不能以数字开头.
  • 变量名和=号直接不能有空格
  • 变量名不能以数字开头, 首个字符只能为字母(A-Z, a-z)
  • 变量名直接不能有空格, 可以使用下划线
  • 变量名不能使用标点符号
  • 环境变量名建议全部大写
variable=value
variable='value'
variable="value"

2.2 变量赋值

  • 变量值与=号直接不能有空格
  • 变量类型默认都是字符串类型
  • 变量值可以使用特殊符号,转义符号, 如: name=“zhang\nsan”
  • 变量值可以是命令执行的结果, 用反引号, 如:dt=date
  • 变量值可以是包含其他变量的表达式, 如:result=“hello,$name”
# 声明数字,等号# 赋值字符串, 如果字符串没有空格,可以省略引号 
str1=hello

# 复制字符串,字符串包含空格的话,必须使用引号包裹
str2="hello,world"

# 赋值数字,认为123为字符串,不能直接进行数字计算,需要借助$(())或let 进行数字运算
str3=123
str3=$(( $str3 + 1 ))
let "str3=$str3+1"

# 声明数字,等号右边即便是表达式,也不能包含空格,如果非要有空格,则需要用小括号包裹
declare -i int1=1
int1=$int1+1
int1=( $int1 + 1 )

除了显式地直接赋值,还可以用语句给变量赋值,如:

for file in `ls /etc`
或
for file in $(ls /etc)
以上语句将 /etc 下目录的文件名循环出来。

2.3 变量声明

  • 通常Shell中的变量无须事先声明, 但对于需要限制变量类型或读写设置时,就需要实现声明了.声明变量使用 declare 命令
  • 命令格式: declare [-irA] varName
# 默认为字符串类型变量, 会将6/3设置为一个字符串
a=6/3
echo "$a"

# 声明数字类型变量
declare -i a
a=6/3
echo "$a"

# 声明关联数组变量
declare -A hash
hash[A]="aaa"
hash[B]="bbb"
hash[C]="ccc"

echo "${hash[@]}"

# 声明只读变量
declare -r x=10
# 报错
x=11
echo $x

2.4 使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

$variable
${variable}
your_name="liyq"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

如果不给skill变量加花括号,写成echo "I am good at s k i l l S c r i p t " , 解 释 器 就 会 把 skillScript",解释器就会把 skillScript"skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
推荐给所有变量加上花括号,这是个好的编程习惯。

已定义的变量,可以被重新定义,如:

your_name="laryy"
echo $your_name
your_name="alibaba"
echo $your_name

总结:

  • 双引号中: 美元符号$表示变量引用, 反引号``表示命令结果替换, 反斜线表示转移字符.其它字符为字面意思
  • 单引号中: 所有字符均为字面意思.
  • 反引号中: 字符串被认为是shell命令去执行
# 双引号- 美元符号, 反引号, 反斜线都会相应做引用替换
zone="+08:00Z"
time1="\$time:`date +'%T'`$zone"
echo $time1     # $time:15:08:19+08:00Z

# 单引号-  所有字符均为字面意义
time2='\$time:`date +"%T"`$zone'
echo $time2     # \$time:`date +"%T"`$zone

# 反引号会执行命令并返回命令执行结果
dir=`pwd`
echo $dir       # /home/zongf/tmp

# 必须使用${}情况,shell语言遇到$之后,会寻找最长变量名作为变量
hi=hi
# 正确引用方式
echo "${hi}lisi"    # hilisi
# 错误引用方式
echo "$hilisi"      # 空

2.3 只读变量

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

下面的例子尝试更改只读变量,结果报错:

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

运行脚本,结果如下:

/bin/sh: NAME: This variable is read only.

2.4 将命令的结果赋值给变量

 variable=`command`
 variable=$(command)

2.5 删除变量

使用 unset 命令可以删除变量,但是并不是很常用。
语法:

unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

#!/bin/sh
myUrl="https://www.baidu.com"
unset myUrl
echo $myUrl

以上实例执行将没有任何输出。

2.6 特殊变量

2.6.1变量类型

运行shell时,会同时存在三种变量:
1)局部变量 。局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问
2) 环境变量 。所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量 。是由shell程序设置的特殊变量。

特殊变量
在这里插入图片描述

2.6.2 命令行参数($n)

运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

例1

#!/bin/bash
echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

返回结果:

$./test.sh lyq Ali
File Name : ./test.sh
First Parameter : lyq
Second Parameter : Ali
Quoted Values: lyq Ali
Quoted Values: lyq Ali
Total Number of Parameters : 2

2.6.3 $* 和 $@ 的区别

  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。

例2

#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3

$* 以一个单字符串显示所有向脚本传递的参数。

例3

#!/bin/bash

echo "Shell 传递参数实例!";
echo "第一个参数为:$1";

echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3

在这里插入图片描述
例4

#!/bin/bash
echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@"
echo "print each param from \$*"
for var in $*
do
echo "$var"
done
echo "print each param from \$@"
for var in $@
do
echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done

执行 ./test.sh “a” “b” “c” “d”,看到下面的结果:

$*=  a b c d
"$*"= a b c d
$@=  a b c d
"$@"= a b c d
print each param from $*
a
b
c
d
print each param from $@
a
b
c
d
print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d

例5

#!/bin/bash

echo '参数数量 $#:' $#
echo '参数列表 $*:' $*
echo '参数数组 $@:' $@

echo '调用命令 $0:' $0
echo '第1 个参数 $1:' $1
echo '第2 个参数 $2:' $2
echo '第10个参数 $10:' ${10}

echo '============== 遍历输出: $* ========================'
# 只有一个元素
for i in "$*"
do
echo "arg:" $i
done

echo '============== 遍历输出: $@ ========================'
# 有多个元素
for y in "$@"
do
echo "arg:" $y
done

输出结果

[admin@localhost shell]$ ./var01.sh 1 2 3 4 5 6 7 8 9 10
参数数量 $#: 10
参数列表 $*: 1 2 3 4 5 6 7 8 9 10
参数数组 $@: 1 2 3 4 5 6 7 8 9 10
调用命令 $0: ./var01.sh
第1 个参数 $1: 1
第2 个参数 $2: 2
第10个参数 $10: 10
============== 遍历输出: $* ========================
arg: 1 2 3 4 5 6 7 8 9 10
============== 遍历输出: $@ ========================
arg: 1
arg: 2
arg: 3
arg: 4
arg: 5
arg: 6
arg: 7
arg: 8
arg: 9
arg: 10
[admin@localhost shell]$

2.6.4 退出状态($?)

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。
退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。
不过,也有一些命令返回其他值,表示不同类型的错误。

例6

$./test.sh lyqAli
File Name : ./test.sh
First Parameter : lyq
Second Parameter : Ali
Quoted Values: lyqAli
Quoted Values: lyqAli
Total Number of Parameters : 2
$echo $?
0
$

$?多判断预设命令是否完成

例7

if [ $? -ne 0 ]
then
#脚本不正常退出
exit 1
fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值