shell 变量的缺点?
弱类型
默认类型是字符串
1 declare 命令
declare 声明变量类型
declare [+/-] [选项] 变量名
+ 取消变量的设定类型属性
- 给变量设定类型属性
-a 将变量声明为数组类型
-i 将变量声明为整型
+a 取消数值类型
+i 取消变量的整数类型
-x 将变量声明为环境变量
-r 将变量声明为只读的变量
-p 显示指定变量的被声明类型
[root@aliyun247 ~]# aa=11
[root@aliyun247 ~]# bb=22
[root@aliyun247 ~]# cc=$aa+$bb
[root@aliyun247 ~]# echo $cc
11+22
[root@aliyun247 ~]# declare -i cc=$aa+$bb
[root@aliyun247 ~]# echo $cc
33
[root@aliyun247 ~]# declare -p $cc
-bash: declare: 33: not found
[root@aliyun247 ~]# declare -p cc
declare -i cc="33"
数组的定义和查看
[root@aliyun247 ~]# movies[0]=lixiaolong
[root@aliyun247 ~]# movies[1]=jakechan
[root@aliyun247 ~]# movies[2]=Tonnyjaa
[root@aliyun247 ~]# echo $movies
lixiaolong
[root@aliyun247 ~]# echo ${movies}
lixiaolong
[root@aliyun247 ~]# echo ${movies[1]}
jakechan
[root@aliyun247 ~]# echo ${movies[2]}
Tonnyjaa
[root@aliyun247 ~]# echo ${movies[3]}
[root@aliyun247 ~]# declare -a movie_star
[root@aliyun247 ~]# echo $movie_star
[root@aliyun247 ~]# movies_star=TonyJaa
[root@aliyun247 ~]# echo $movies_star
TonyJaa
[root@aliyun247 ~]# movies_star[1]=zhouxun
[root@aliyun247 ~]# echo ${movies_star[*]}
TonyJaa zhouxun
#声明环境变量
declare -x test=1233
'与export作用相似 ,但其实是declare的作用
[root@aliyun247 ~]# kk=dxm
[root@aliyun247 ~]# export kk
[root@aliyun247 ~]# declare -x test=123
declare -p
#查询系统下所有变量的属性
declare -p 变量名
#查询指定变量的属性
[root@aliyun247 ~]# declare -p
declare -- BASH="/bin/bash"
declare -r BASHOPTS="checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -A BASH_CMDS='()'
declare -- BASH_COMMAND=""
declare -a BASH_LINENO='()'
declare -a BASH_SOURCE='()'
declare -- BASH_SUBSHELL=""
declare -ar BASH_VERSINFO='([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -- BASH_VERSION="4.1.2(1)-release"
declare -x CLASSPATH=".:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:"
declare -- COLORS="/etc/DIR_COLORS"
declare -- COLUMNS="157"
declare -- COMP_WORDBREAKS=""
declare -x CVS_RSH="ssh"
declare -a DIRSTACK='()'
declare -ir EUID="0"
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -x G_BROKEN_FILENAMES="1"
declare -i HISTCMD=""
declare -x HISTCONTROL="ignoredups"
declare -- HISTFILE="/root/.bash_history"
declare -- HISTFILESIZE="1000"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="aliyun247"
declare -- HOSTTYPE="x86_64"
declare -- ID="0"
declare -- IFS="
"
declare -- JAVA_HOME="/usr/local/jdk"
declare -x JRE_HOME="/usr/local/jdk/jre"
declare -x LANG="en_US.UTF-8"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -i LINENO=""
declare -- LINES="38"
declare -x LOGNAME="root"
declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:"
declare -- MACHTYPE="x86_64-redhat-linux-gnu"
declare -x MAIL="/var/spool/mail/root"
declare -i MAILCHECK="60"
declare -x OLDPWD
declare -- OPTERR="1"
declare -i OPTIND="1"
declare -- OSTYPE="linux-gnu"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin"
declare -a PIPESTATUS='([0]="0")'
declare -ir PPID="7064"
declare -- PROMPT_COMMAND="printf \"\\033]0;%s@%s:%s\\007\" \"\${USER}\" \"\${HOSTNAME%%.*}\" \"\${PWD/#\$HOME/~}\""
declare -- PS1="[\\u@\\h \\W]\\\$ "
declare -- PS2="> "
declare -- PS4="+ "
declare -x PWD="/root"
declare -i RANDOM=""
declare -- SECONDS=""
declare -x SHELL="/bin/bash"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -x SHLVL="1"
declare -x SSH_CLIENT="59.109.32.90 1171 22"
declare -x SSH_CONNECTION="59.109.32.90 1171 182.92.238.207 22"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -ir UID="0"
declare -x USER="root"
declare -- _="env"
declare -- aa="11"
declare -- bb="22"
declare -i cc="33"
declare -- colors="/etc/DIR_COLORS"
declare -a movie_star='()'
declare -a movies='([0]="lixiaolong" [1]="jakechan" [2]="Tonnyjaa")'
declare -a movies_star='([0]="TonyJaa" [1]="zhouxun")'
[root@aliyun247 ~]# declare test=123
[root@aliyun247 ~]# declare -p test
declare -- test="123"
[root@aliyun247 ~]# declare -r test
[root@aliyun247 ~]# declare -p test
declare -r test="123"
[root@aliyun247 ~]# test=234
-bash: test: readonly variable
[root@aliyun247 ~]# declare +r test
-bash: declare: test: readonly variable
[root@aliyun247 ~]# declare -p test
declare -r test="123"
2 数值运算的方法
运算方法2 expr 或 let 数值运算工具
[root@aliyun247 ~]# aa=11
[root@aliyun247 ~]# bb=22
[root@aliyun247 ~]# dd=$(expr $aa + $bb)
[root@aliyun247 ~]# echo $dd
33
[root@aliyun247 ~]# ee=$(let $dd + $aa + $bb)
-bash: let: +: syntax error: operand expected (error token is "+")
[root@aliyun247 ~]# ee=$(let $dd + $aa )
-bash: let: +: syntax error: operand expected (error token is "+")
http://www.imooc.com/video/6830
运算方法3 $(( 运算符 )) 或者 $[ 运算符 ]
[root@aliyun247 ~]# ff=$(($aa + $dd))
[root@aliyun247 ~]# echo $ff
44
[root@aliyun247 ~]# gg=$[$aa+$ff]
[root@aliyun247 ~]# echo $gg
55
3 变量测试
变量测试方式,好奇怪的测试规则,变态的逻辑 让人难以记住和理解
[root@aliyun247 ~]# unset y
[root@aliyun247 ~]# x=$(y-1)
-bash: y-1: command not found
[root@aliyun247 ~]# x=${y-1}
[root@aliyun247 ~]# echo x
x
[root@aliyun247 ~]# echo $x
1
[root@aliyun247 ~]# y=""
[root@aliyun247 ~]# echo $x=${y-1}
1=
[root@aliyun247 ~]# echo x=${y-1}
x=
[root@aliyun247 ~]# x=${y-1}
[root@aliyun247 ~]# echo $x
[root@aliyun247 ~]# y=3
[root@aliyun247 ~]# x=${y-1}
[root@aliyun247 ~]# echo $x
3