折腾

everything about EP (Engineering Productivity)
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

4.1 变量替换 $

1)如果variable1是变量名,${variable1}是这个变量的值,$variable1是简写形式

2)当变量被声明或被赋值,被unset,被export,或者代表一种信号时,变量前不用$

3)除了可以用=赋值,还可以在read或者循环头被赋值(for var2 in 1 2 3)

4)双引号允许变量替换,单引号阻止变量替换

5)用引号引用一个变量将保留其中的空白, 当然, 如果是变量替换就不会保留了。

hello="A B C     D"
echo $hello # A B C D
echo "$hello" # A B C     D

6)一个未初始化的变量是null值,但并不总表示值为0。但是在做算术操作的时候, 这个未初始化的变量看起来值为0。例如:

let "uninitialized += 5"
echo "$uninitialized" # 5

4.2 变量赋值 =

1)赋值操作,等号前后不能有空白

2)如果对变量不使用引号引用,则echo时会去掉多余的tab和换行符,例如:

a=`ls -l`
echo $a # 如果没有引号的话将会删除ls结果中多余的tab和换行符
echo "$a" #如果加上引号的话, 那么就会保留ls结果中的空白符

3)使用$(…)进行赋值,比反引号`更新的方法,都是命令替换的一种形式。

arch=$(uname -m)

4.3 Bash变量是不区分类型的

bash变量不区分类型,本质都是字符串。是否允许整数操作和比较操作,取决于变量中是否只有数字

4.4 特殊的变量类型

1)局部变量。只有在代码块或者函数中才可见的的局部变量 local

2)环境变量。

脚本设置环境变量,需要执行export才生效。

一个脚本只能够export变量到这个脚本所产生的子进程,如果脚本是从命令行中调用的, 这个脚本所export的变量是不能影响命令行环境的。子进程不能export变量来影响产生自己的父进程的环境。

3)位置参数。从命令行传递到脚本的参数。

$0就是脚本文件自身的名字,$1 是第一个参数。。。,$9之后的位置参数就必须用大括号括起来${10}。$*和$@ 表示所有的位置参数。

4)一种提取从命令行传递到脚本的最后一个位置参数的简单办法

args=$#
lastarg=${!args}
# 或: lastarg=${!#}
# 注意, 不能直接使用 lastarg=${!$#} , 这会产生错误.

5)如果命令行参数没有提供,最好的防止错误产生的方式是进行参数替换,设置默认值

${1:-$DefaultVal}

6)shift命令。

是把所有的位置参数都向左移动一个位置,$1 <--- $2, $2 <--- $3, $3 <--- $4。原来的$1就消失了, 但是$0 (脚本名)是不会改变的。

如果传递了大量的位置参数到脚本中,shift命令允许你访问的位置参数的数量超过10个,当然{}标记法也提供了这样的功能。

在函数参数的处理中也可以用shift,处理方式一样。

在bash 3.0.0.15版本,做了如下实验:

#!/bin/bash
#sh test.sh 1 2 3 4 5 6 7 8 9 10 11
echo $1      #1
echo $11     #11
echo ${11}   #11
shift 
echo $1      #2
echo $10     #20 ??what happened after shift
echo ${10}   #11

反正无论如何,大于9的位置参数都使用{}总是没有错的

注意事项:

$0参数是由调用这个脚本的进程所设置的. 按照约定, 这个参数一般就是脚本的名字。