bash中变量的种类
根据变量的生效范围等标准: 本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效 环境变量:生效范围为当前shell进程及其子进程 局部变量:生效范围为当前shell进程中某代码片断(通常指函数) 位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数 注:脚本运行是在当前shell的子shell下运行的,如有(command)括号中的再开一个子shell,脚本shell之下开启的子shell,不可以调用的其他脚本的本地变量 特殊变量:$?, $0, $*, $@, $#
本地变量
变量赋值:name=‘value’, 可以使用引用value: (1) 可以是直接字串; name=“root" name=var name=“xxx xxx xx”多个字符串中间有空格的需要用引号如果不引用其他变量或引用命令的话单双引号都可以。 (2) 变量引用: $name, ${name} $a $b $ab ${a}b name="$USER" 通过引用起它变量的值赋值 (3) 命令引用:name=`COMMAND`, name=$(COMMAND) 注:可以多行内容赋值到一个变量。 变量引用:${name}, $name "":弱引用,其中的变量引用会被替换为变量值 '':强引用,其中的变量引用不会被替换为变量值,而保持原字符串 "弱引用----双引号 [root@localhost ~]# echo "echo $USER" echo root ''强引用------单引号 [root@localhost ~]# echo 'ehco $USER' ehco $USER ``命令引用----~下的符号 [root@localhost ~]# echo `echo $USER` Root 显示已定义的所有变量:set 删除变量:unset name 脚本运行完毕要释放变量。养成良好习惯。
环境变量
环境变量的使用必须先声明 变量声明、赋值: export name=VALUE declare -x name=VALUE declare - name=number 声明变量为数值型 变量引用:$name, ${name} 显示所有环境变量: export env printenv 删除:unset name bash有许多内建的环境变量:PATH, SHELL, USRE,UID, HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1 声明环境变量后,shell的子进程及其子进程的子进程都可使用。 新的终端后就不可以使用。 注 source 脚本 和 . 脚本 执行脚本效果是一样的,都是在当前shell下执行。 当前shell下的用户可调用该脚本的本地变量 通过 bash 脚本和直接执行 ./脚本 效果是一样的,都是在当前shell下开启子shell后运行的。 当前shell不可以调用该脚本定义的本地变量。
只读和位置变量
只读变量:只能声时,但不能修改和删除,不能使用unset撤销。 readonlyname=VLAUE declare -r name=VLAUE 可以与-x一起使用 declare -rx name=VALUE 只读的环境变量 位置变量:在脚本代码中调用通过命令行传递给脚本的参数 $1, $2, ...:对应第1、第2等参数,shift [n]换位置 $0: 命令本身,脚本名称。 $*: 传递给脚本的所有参数,全部参数合为一个字符串 $@: 传递给脚本的所有参数,每个参数为独立字符串 $#: 传递给脚本的参数的个数 $@ $* 只在被双引号包起来的时候才会有差异 [root@yangyouwei ~]# ./test1.sh a b first a b secd all a b ======== first a secd b all a b [root@yangyouwei ~]# cat test1.sh #!/bin/bash ./test2.sh "$*" echo ======== ./test2.sh "$@" [root@yangyouwei ~]# cat test2.sh #!/bin/bash echo first "$1" echo secd "$2" echo all "$*"
shift
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。
脚本test1加上参数a和b 调用脚本test2 test1中 test2运行两次但是调用的 参数不同 (虽然某些情况下$*和$@效果是一样的,在这里这两个变量的值作为test2的参数,参与test2的执行。) 示例:判断给出的文件的行数 linecount="$(wc-l $1| cut -d' ' -f1)" echo "$1 has $linecountlines."
declare
-i 声明为整数 -a 声明为数组 -f 声明为函数 -r 声明为只读
local 局部变量
定义局部变量 多用于函数内部的变量定义。定义后该变量只在该函数体内部生效。
原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/38465