与Shell变量相关的几个命令:
变量只在当前Shell中生效.
source 这个命令让脚本影响他们父Shell的环境(. 可以代替source命令)
export 这个命令可以让脚本影响其子Shell的环境 ()
unset 从环境中删除变量
其他几个与变量有关的命令:
declare: 用于显示或设置变量
let: 用于求整数表达式的值
local: 用于创建不能传给子Shell的变量, 这个命令仅在过程内部有效
readonly: 用于显示或者设置只读变量
set: 用于设置或者重置各种Shell选项(不仅用于变量)
shift: 用于移动位置变量
typeset: 用于显示或者设置变量(同declare)
变量赋值
logfile="stdout.log" echo "$logfil"
1、变量赋值——没有类型,根据赋值的类型决定变量类型,可以多次随意赋值。赋值号两边不能有空格
1)显示定义:VAR=value
变量声明时使用的引号不会被保留,当变量值中有空格时必须使用引号
2)读取:read VAR
-
一次读入一行! 可以一次读入多个变量read。
-
read firstname lastname 输入:steve Parker Smith 以空格分,最后一个变量两个 输入:steve 给的少,后一个变量为空字符串,一直存在于shell中,可以在当前shell中用set | grep name=查看
-
- 从文件读入
-
read password < /etc/passwd读入一行 while read passwd do echo $passwd done < /etc/passwd一直循环读,直到不再输入
-
- read -p “what file do you want to test?" filename 命令替换:
- 命令赋值:VAR=`date`、 VAR=$(date)
- 数值计算:c=`expr $a +4`、c=let $a + 4 、$(($a+$b)) 但也有点区别:有的shell不支持,是否有对非数值进行的先验(expr没有)
- 将变量值设置为某个给定命令的输出,其时是第一种赋值方式的变种
-
TODAY=`date +%A`动态赋值
-
引用变量
2、引用变量——的格式是${变量名} $(variable)bar echo $variable bar ${variable}bar
访问不存在的变量只会返回空字符串或0,具体取决与上下文,所以当将某个变量名写错时,不会报错,还能有结果;
变量名区分大小写
3、支持一维数组变量:
[lixn@localhost ~]$ Users=(zsan lisi wangwu zhangsan lisi) 定义一维数组 [lixn@localhost ~]$ echo $Users 索引 zsan [lixn@localhost ~]$ echo ${Users[0]} zsan [lixn@localhost ~]$ echo ${Users[2]} wangwu [lixn@localhost ~]$ echo ${Users} zsan [lixn@localhost ~]$ echo ${Users[*]} zsan lisi wangwu zhangsan lisi [lixn@localhost ~]$ echo ${#Users[*]} 返回数组长度 5 [lixn@localhost ~]$ echo ${#Users[2]} 返回元素值的长度 6 [lixn@localhost ~]$ Users[1]=wlm 修改值 [lixn@localhost ~]$ Account=(${Users[*]}) 数组之间赋值 [lixn@localhost ~]$ echo ${Account[*]} zsan wlm wangwu zhangsan lisi
特殊变量
${#var} 变量的长度
特殊变量由bash自动定义和赋值,用户不能修改。
$$:当前进程号
$?:前一个命令的退出状态,0表示执行成功,1标志执行失败
$0:存储命令本身——位置参数
$1-$n:依次代表命令行参数,当大于9时,用{}括起来,如${10}——位置参数
$#:命令行参数的个数,不包括命令本身
$*:保存了全部的命令行参数。不包含命令本身 $@
$!:后台程序的pid
其他
basename命令——去掉位置参数的路径信息,所以./scropt.sh、/usr/local/bin/script.sh等会被转化为script.sh
Myname is `basename $0`
shift命令——多用于“下一个参数”,shift内置命令每次调用时将所有参数进行一次移位,首先截去$1,然后截去$2....无法将移位逆向进行。
shift也可以一次截去多个变量(shift 3 或者 shift shift shift)多用后者
#!/bin/bash echo "My name is `basename $0` - I was called as $0" echo "I was called with $# parameters." count=1 while [ "$#" -ge "1" ]; do echo "Parameter number $count is: $1" let count=$count+1 shift done [lixn@Fedora24 bash_learn]$ ./shift.sh My name is shift.sh - I was called as ./shift.sh I was called with 0 parameters. [lixn@Fedora24 bash_learn]$ ./shift.sh one two three My name is shift.sh - I was called as ./shift.sh I was called with 3 parameters. Parameter number 1 is: one Parameter number 2 is: two Parameter number 3 is: three
$*和$@的使用与区别
删除变量——unset myvar;将变量赋值为空字符串也能实现变量的删除,但与unset不完全相同