目录
一、变量替换与赋值
1.$变量替换(引用变量的内容) Variablr substitution
1.1 变量的名字就是变量保存值的地方
1.2 引用变量的值就叫做变量替换
1.3 在一下情况下,变量名没有前缀名$
1.3.1 变量别声明或被赋值
1.3.2 变量被unset
1.3.3 变量被export
1.3.4 变量代表一种信号
1.4 在引用时,$的变化
1.4.1 双引号(“ ”),弱引用,发生变量替换
1.4.2 单引号(‘ ’),强引用,保存字面意思
例:
[root@server1 ~]# variable=11
[root@server1 ~]# echo variable
variable
[root@server1 ~]# echo $variable
11
[root@server1 ~]# echo ${variable}
11
#!/bin/bash
#变量赋值和替换
a=123
hello=$a
#强烈注意:赋值时,等号前后一定不要有空格
#1,如果等号前面有空格?
#VARIABLE =value
#将执行带一个参数=value的命令 VARIABLE
#2,如果等号后面有空格?
# VARIADLE= value
#将执行后面这个小写的value命令,并且一个赋值为“”的变量VARIABLE
echo hello #这不是一个变量,所以只会输出hello
echo $hello
echo ${hello} #结果同上
echo "$hello"
echo '$hello'
echo
# 例1:
# 引用变量,会保留其中的空白。变量替换就不保留空白
hello="A B C D"
echo $hello #输出A B C D
echo "$hello" #输出A B C D
echo
#全引用将$解释为单独的字符,而不是变量的前缀
echo '$hello' #会输出$hello
echo
#设置变量,但没有赋值,即值为null空
#这与unset一个变量是不一样的,虽然结果一样
hello=
echo "\$hello (null value) = $hello"
echo
#例2:
#可以在同一行上设置多个变量,变量之间通过空格来分隔
#由于这会降低了可读性,可移植性,所以不推荐
var=1 var2=2 var3=3
echo "var=$var var2=$var2 var=$var3"
echo
#例3
#如果一个变量存在空白,必须加处引用
# numbers=1 2 3 # 这是错误的写法
numbers="1 2 3"
echo "numbers=$numbers"
echo
#例4
#没有声明(初始化)变量,就直接引用,是一个空值
echo "uninitialized_variable = $uninitialized_variable"
#声明了变量,但没有赋值(初始化),也是一个空值
uninitialized_variable=
echo " uninitialized_variable = $uninitialized_variable"
#unset一个变量,会清除占用的内存空间
uninitialized_variable=123
unset uninitialized_variable #unset bash中的一个命令,可以删除变量和函数,从内存中删除·
echo "uninitialized_variable = $uninitialized_variable"
#还是一个空值
echo
exit 0
输出结果
2.变量赋值 variable assignment
2.1变量的赋值有多种方法
2.1.1 使用=
2.1.2 使用let
2.1.3 使用for循环
2.1.4 使用read
2.2 使用命令替换
2.2.1 `command`
2.2.2 $(…)
#!/bin/bash
# 赋值
a=1
echo "The value of \"a\" is $a."
echo
#使用let赋值
let a=1+2
echo "The value of \"a\" is now $a."
echo
# 在for循环中
echo -n "Values of \"a\" in the loop are:"
for a in 7 8 9 10
do
echo -n "$a"
done
echo
#使用read命令
echo -n "Enter \"a\" "
read a
echo "The value of \"a\" is now $a."
echo
exit 0
输出结果
#!/bin/bash
#简单赋值与命令替换式的赋值
# 简单赋值
a=1
echo a$
b=2
echo b$
#命令替换式赋值
c=`echo Hello!`
echo $c
#如果将在命令行来执行第11行,会出错
#这是因为感叹号!会触发Bash的“命令历史”机制
d=`ls -l`
#对比以下两次echo变量D的值,有什么不同
echo $d
echo
echo "$d"
echo
exit 0
二、 变量类型
1.Bash变量是不区分分类型的 Untyped
1.1 本质来说,Bash变量都是字符串
1.2 根据不同的上下文环境,Bash也允许比较操作和整数操作
1.2.1 如果全部是“数字”,可以被当作整型,否则,就是字符串
#!/bin/bash
#整数还是数字?
a=2334 #全是数字,所以是整数
let "a += 1"
echo "a = $a" #a=2335,还是整型
echo
#变量扩展,子串替换,将23替换BB,就变成字符串了
b=${a/23/BB}
echo "b = $b" #b = BB35
echo
#即使被declare命令声明为整型,也是无效的
declare -i b
echo "b = $b" # b =BB35
echo
#在四则运算时,let命令会将字符串当作零
let "c += 1" #BB35 +1 =
echo "b = $b" # b = 1
echo
c=BB34
echo "c = $c" # c = BB34
d=${c//BB/23} #替换后,$d编变成一个整型
echo "d = $d" #d = 2334
let "d += 1" #2334+1
echo "d = $d" # d = 2334
echo
#空字符串呢?
e=""
echo "e = $e" #e =
let "e += 1" #空字符串也被当作零
echo "e = $e" # e = 1
echo
# 未声明的变量呢?
echo "f = $f" # f =
let "f += 1" #为声明的变量也被当作零
echo "f = $f" # f = 1
echo "d = $d"
exit 0
2 特殊的变量类型
2.1 局部变量 Local variable
2.1.1 只有在代码块或者函数中才可见
() 圆括号 parenthesis
1.命令组
[root@server1 ~]# a=123 父进程
[root@server1 ~]# (echo "a = $a"; a=321; echo "a = $a") 子进程
a = 123
a = 321
[root@server1 ~]# echo "a = $a" 只能读取父进程
a = 123
2.数组初始化
Array=(element1 element2 elemet2)
2.2 环境变量 environmental variable
2.2.1 环境变量将影响用户接口和shell的行为
2.2.2 需要将变量export,才能成为环境变量
2.2.3 添加新的或者更现有环境变量,会立即生效
2.2.4 子进程时不能通过export变量来影响产生自己的父进程的环境的
Export示例
[root@server1 ~]# VILLAIN="Lord Voldemort"
[root@server1 ~]# bash
[root@server1 ~]# echo "$VILLAIN"
[root@server1 ~]# export VILLAIN="Lord Voldemort"
[root@server1 ~]# bash
[root@server1 ~]# echo "$VILLAIN"
Lord Voldemort
2.3 位置参数 positional parameters
三、 位置参数
1.$#,$*,$@....位置参数
1.1 $0,$1,$2,等的
1.1.1位置参数,从命令行传递到脚本,或者传递给函数
1.1.2 $0是脚本文件自身的名字,$1是第一个参数,$2是第二个参数
1.1.3 $9之后的必须用大括号括起来了。比如,${10},${11},${12}
#!/bin/bash
# 调用这个脚本,至少需要10个参数
# ./variable1.sh 1 2 3 4 6 7 8 9 10
MINPARAMS=10
#脚本名称
echo "The name of this script is \"$0\"."
echo "The name of this script id \"`basename $0`\"."
echo
# 测试变量引用
if [ -n "$1" ]
then
echo "Parameter #1 is $1"
fi
if [ -n "$2" ]
then
echo "Parameter #2 is $2"
fi
if [ -n "$3" ]
then
echo "Parameter #3 is $3"
fi
# . . . 以后,用循环
if [ -n "${10}" ]
then
echo "Parameter #10 is ${10}"
fi
echo "-----------------"
echo "All the command-line parameters are: \"$*\""
if [ $# -lt "$MINPARAMS" ]
then
echo
echo "This script needs at lesat $MINPARAMS command-line arguments!"
fi
exit 0
[root@server1 ~]# ./variable1.sh 1 2 3 4 5 6 7 8 9 10
The name of this script is "./variable1.sh".
The name of this script id "variable1.sh".
Parameter #1 is 1
Parameter #2 is 2
Parameter #3 is 3
Parameter #10 is 10
-----------------
All the command-line parameters are: "1 2 3 4 5 6 7 8 9 10"
[root@server1 ~]# ./variable1.sh
The name of this script is "./variable1.sh".
The name of this script id "variable1.sh".
-----------------
All the command-line parameters are: ""
This script needs at lesat 10 command-line arguments!
a. Shift命令会重新分配位置参数
a1 把所有的位置参数都向左移动一个位置
a2 $1 <-- $2, $2 <-- $3, $3 <-- $4 ……
a3 原来的$1就消失了,但是$0(脚本名)不会改变
#!/bin/bash
# 使用shift来逐步存取所有位置参数
# 需要传递脚本多个位置参数,比如:
# variable2.sh a b c d 1 2 3 4
until [ -z "$1" ]
do
echo -n "$1"
shift
done
echo
exit 0
[root@server1 ~]# ./variable2.sh a b c d 1 2 3 4
abcd1234
1.2 $#
1.2.1 命令行参数或者位置参数的个数
1.3 $*
1.3.1 所有的位置参数都被看作一个单词
1.4 $@
1.4.1 与$*相同,但是每个参数都是一个独立的引用字符串
2.使用${}参数替换来实现默认参数
2.1如果变量未被声明或赋值,那么就替换为默认值
2.2 语法:
2.2.1 ${parameter-default}
2.2.2 ${parameter:-default}
例
[root@server1 ~]# echo ${username-`whoami`}
root
DEFAULT_FILENAME=generic.data
filename=${1:-$DEFAULT_FILENAME}