shell学习之路——变量与参数

目录

 

一、变量替换与赋值

二、 变量类型

三、 位置参数


一、变量替换与赋值

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}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值