1

变量分类

hello world

#!/bin/bash

# hello world

echo "what' s your name ?"
#read 命令从 stdin 获取输入并赋值给 PERSON 变量,最后在 stdout 上输出
read name 
echo "My name is $name"

普通变量

定义变量

定义变量时,变量名不加美元符号($),如:

variableName="value"

变量的定义规则:

  1. 变量名和等号之间不能有空格

  2. 首个字符必须为字母(a-z,A-Z)。

  3. 中间不能有空格,可以使用下划线(_)。

  4. 不能使用标点符号。

  5. 不能使用 bash 里的关键字(可用 help 命令查看保留关键字)

使用变量

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

your_name=“weixuan”
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

重新定义变量

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

myUrl="http://segmentfault.com/"
echo ${myUrl}
myUrl="http://segmentfault.com/questions/newest"
echo ${myUrl}

只读变量

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

#!/bin/bash

url="http://segmentfault.com/questions/newest"

readonly url

url="http://segmentfault.com/"

报错:

[root@iZ285svxip6Z shell]# ./myshell.sh 
./myshell.sh: line 7: url: readonly variable

删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

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

变量类型

  1. 局部变量
    局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其他 shell 启动的程序不能访问局部变量。

  2. 环境变量
    所有的程序,包括 shell 启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候 shell 脚本也可以定义环境变量。

  3. shell 变量

  4. 变量是由 shell 程序设置的特殊变量。shell 变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了 shell 的正常运行

特殊变量

特殊变量表

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

示例代码

#!/bin/bash

echo "File name : $0"

echo "First param : $1"

echo "second param : $2"

echo "quoted values : $@"

echo "quoted values 2 : $*"

echo "Total number of params : $#"

echo "shell id : $$"

-----------------------------------------

运行结果:

[root@iZ285svxip6Z shell]# ./demo.sh weixuan nicholas
File name : ./demo.sh
First param : weixuan
second param : nicholas
quoted values : weixuan nicholas
quoted values 2 : weixuan nicholas
Total number of params : 2
shell id : 3094

$* 和$@ 的区别

$*$@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

退出状态

$?可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。

退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1。

替换

转义

-e 表示对转义字符进行替换。如果不使用 -e选项,将会原样输出

demo

#!/bin/bash

name="weixuan"

echo -e "My name is $name \n"

echo "My name is $name \n"

----------------------------

结果

My name is weixuan 

My name is weixuan \n

echo 命令的 -E 选项禁止转义,默认也是不转义的。

shell命令替换

shell命令替换是指可以先执行命令,将输出结果暂时保存,在适当的地方输出。
命令替换的语法: `command` 注意是反引号


#!/bin/bash

# 等于执行shell命令date,将date的值保存给变量DATE

DATE=`date`

echo "The Date is $DATE"

USERS=`who | wc -l`

echo "Logged in user are $USERS"

UP=`date;uptime`

echo "Uptime is $UP"

-------------------------

结果:

The Date is Mon Oct 12 13:22:54 CST 2015
Logged in user are 1
Uptime is Mon Oct 12 13:22:54 CST 2015
 13:22:54 up 16 days, 21:16,  1 user,  load average: 0.00, 0.00, 0.00

变量替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。

形式 说明
${var} 变量本来的值
${var:-word} 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值
${var:=word} 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
${var:?message} 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标 准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在 Shell 脚本中,那么脚本将停止运行。
${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值

demo

#!/bin/bash

# 输出变量var 的本身的值,没有定义 ,那么返回word,不会改变var本身的值
echo ${var:-"value is not set"}
echo "1 - value of var is ${var}"

# var没有定义,返回word,并将var的值设为word
echo ${var:="value is not set"}
echo "2 - value of var is ${var}"

# var被定义,返回word,不改变var的值
var="weixuan"
echo ${var:+"my name is not weixuan"}
echo "3 - value of var is ${var}"

#var被删除,打印messqge,同时退出shell
unset var
echo ${var:?"Error"}
echo "4 - value of var is ${var}"

-----------------------
结果:

value is not set
1 - value of var is 
value is not set
2 - value of var is value is not set
my name is not weixuan
3 - value of var is weixuan
./demo4.sh: line 18: var: Error

韦轩
890 声望6 粉丝

Javaer and Pythoner


引用和评论

0 条评论