shell学习笔记-变量

变量分类

hello world

#!/bin/bash

# hello world

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

普通变量

定义变量

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

variableName="value"

变量的定义规则:segmentfault

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

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

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

  4. 不能使用标点符号。spa

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

使用变量

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

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

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

从新定义变量

已定义的变量,能够被从新定义,如:ip

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
相关文章
相关标签/搜索