现在的位置: 首页 > 综合 > 正文

[shell]Shell变量

2019年01月09日 ⁄ 综合 ⁄ 共 3853字 ⁄ 字号 评论关闭

变量 

#!/bin/bash

name="Job"
echo $name,you is ${name} or lili  #-->Job,you is Job or lili   变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
name="Lili"
echo $name  #-->LIli

readonly age=4 #<==>age=4;readonly age
echo $age #-->4 可以访问
age=22  #-->age: readonly variable
echo $age  #-->4 

echo $name #-->Lili
unset $name  #--无效
echo $name #-->Lili
unset name
echo $name #-->输出为空

unset $age #-->not a valid identifier(不是一个有效的标识符)
unset age #--> age cannot unset: readonly variable

定义变量:定义变量时,变量名不加美元符号($),若使用则提示“变量未找到” 

在 Shell Script 中,所有的变量都视为字符串,因此并不需要在定义变量前先定义变量类型。在定义变量时,不必加 $,但是在使用它时,必须加上 $。
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

  1. 首个字符必须为字母(a-z,A-Z)。
  2. 中间不能有空格,可以使用下划线(_)。
  3. 不能使用标点符号。
  4. 不能使用bash里的关键字(可用help命令查看保留关键字)。 
  • 使用变量:使用一个定义过的变量,只要在变量名前面加美元符号($)即可
  • 重新定义变量:已定义的变量,可以被重新定义
  • 只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
  • 删除变量:使用 unset 命令可以删除变量。变量被删除后不能再次使用;unset 命令不能删除只读变量
总结:定义变量、重新定义变量、只读变量(readonly)、删除变量(unset)直接跟变量名,不要在变量名前加$

特殊变量

上面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。

  • $0 当前脚本的文件名(包含路径)
  • $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
  • $# 传递给脚本或函数的参数个数。
  • $* 传递给脚本或函数的所有参数。(所有一起)
  • $@ 传递给脚本或函数的所有参数。(一个一个)被双引号(" ")包含时,与 $* 稍有不同。
  • $? 上个命令的退出状态(退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1),或函数的返回值
  • $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
$* 和 $@ 的区别

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

  • "$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;
  • "$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
系统内定的标准变量:你可以使用 set 这个指令来看目前系统中内定了哪些参数。一般而言会有 $HOME, $SHELL, $USER, $PATH 等。

变量替换(为空变量的处理)

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

形式

说明
${var}

变量本来的值

${var:-word} 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
${var:=word}

如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。

${var:+word}

如果变量 var 被定义,那么返回 word,但不改变 var 的值。

${var:?message}

如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。

若此替换出现在Shell脚本中,那么脚本将停止运行。

#!/bin/bash

echo ${var:-1};echo var1=$var  #--> 1 var1=空
echo ${var:=2};echo var2=$var #--> 2 var2=2
echo ${v:+55};echo v=$v #--> 空 va=空
#var已被定义,通过(echo ${var:=2})
echo ${var:+3};echo var3=$var #--> 3 var3=2
unset var
echo ${var:?"Print this message"} #/CentOS/script/test.sh: line 10: var: Print this message
echo "var = ${var}" #没有打印,脚本在上一行时就停止了运行

数组

Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
#!/bin/bash  

#定义数组
#在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为: array_name=(value1 ... valuen)
arr_name=("852" v1 v2 v3)
arr_str[45]="me"
arr_str[20]='and'
arr_str[10]="you"
arr_str[1]=123123

#读取数组 一般格式是:${array_name[index]}
echo ${arr_name[2]} #-->v2 
echo $arr_name  #-->852;数组元素的下标由0开始编号
echo $arr_name[2]  #-->852[2] ;字符串连续
echo $arr_str[1]  #-->[1];数组元素的下标由0开始编号

#使用@ 或 * 可以获取数组中的所有元素
echo ${arr_name[*]} #-->852 v1 v2 v3
echo "--${arr_str[@]}" #-->--123123 you and me;按先后顺序读取

#获取数组的长度(元素的个数), 与获取字符串长度的方法相同
len=${#arr_name[*]}
echo $len #-->4
len=${#arr_str[@]}
echo $len #-->4

#获取单个数组元素的长度
len=${#arr_name[0]}
echo $len  #-->3
len=${#arr_name[1]}
echo $len  #-->2
len=${#arr_name[10]}
echo $len  #-->0;不存在的元素的长度为0

len=${#arr_str[1]}
echo $len  #-->6;数值的话,也按字符串的方式计算其长度

#删除数组
#unset array[1]   # 删除数组中第一个元素
#unset array     # 删除整个数组
  • 定义数组:在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为: array_name=(value1 ... valuen) 
  • 读取数组: 一般格式是:${array_name[index]} ;使用@ 或 * 可以获取数组中的所有元素  
  • 获取数组的长度(元素的个数), 与获取字符串长度的方法相同 
  • 获取单个数组元素的长度  
  • 删除数组:unset array[1]   删除数组中第一个元素;unset array   删除整个数组

字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号(-->在shell编程中其实只要一种字符串数据类型,数字是一种特殊的字符串)

#!/bin/bash

#'
str='this is a string\n'
#"
your_name="bai du"
str2="hello,I know your name\"$your_name\"!\n"
#connect
str3="Hello,"$your_name"!"
str4="Hello,${your_name}!"
echo $str   #-->this is a string\n
echo $str2 #-->I know your name"bai du"!\n
echo $str3 #-->Hello,bai du!
echo $str4 #-->Hello,bai du!

#get len
echo "your_name.len =" ${#your_name} #-->6;包含空格

#get substr,===>${string:position:length}
echo '${str2:1:6} = '${str2:1:6} #2:1:6} = ello,I  ;字符串也是从0开始计数的

单引号:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;单引号字串中不能出现单引号 

双引号:双引号里可以有变量;双引号里可以出现转义字符

命令替换

命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。
语法:`command`  注意是反引号,不是单引号,这个键位于 Esc 键下方。

#!/bin/bash
DATE=`date`
echo "Date is $DATE" #Date is 2014年 08月 19日 星期二 14:01:09 CST

抱歉!评论已关闭.