shell脚本之变量类型、算数运算符、条件测试_java

bash中的变量类型本地变量:仅对当前shell有效,对其子shell无效变量赋值:name=value                    name=$user                    name=`Command` ,name=$(Command):这里需要注意的是“ 和 $()的意义是不同的。从下图可以总结如下:如果将命令的执行结果赋值给一个参数时,且包含多对反引号嵌套的时候,最好外层用$() #!/bin/bash#Sum=$(echo `seq $1 $2` | tr " " "+" | bc)   #################可以正确输出echo "$1到$2的和为:$Sum" Sum1=`echo `seq $1 $2` | tr " " "+" | bc`   #################输出报错echo "$1到$2的和为:$Sum1"root@cenots6.8  /testdir # ./13sum.sh 1 100
1到100的和为:5050./13sum.sh: command substitution: line 7: syntax error near unexpected token `|'./13sum.sh: command substitution: line 7: ` | tr " " "+" | bc'./13sum.sh: line 7: 1: command not found1到100的和为:root@cenots6.8  /testdir # echo `seq 1 10`
1 2 3 4 5 6 7 8 9 10root@cenots6.8  /testdir # echo `echo `seq 1 10``seq 1 10root@cenots6.8  /testdir # echo $(echo `seq 1 10`)1 2 3 4 5 6 7 8 9 10root@cenots6.8  /testdir # echo "echo `seq 1 10`"echo 12345678910   变量引用:$name,${name}显示已定义的所有变量:set删除变量:unset name
环境变量:对当前shell及其子shell有效变量赋值:export name=value                   declare -x name=value显示所有环境变量:export、env、printenv删除变量:unset namebash内置的环境变量有:PATH, SHELL, USRE,UID,HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1局部变量:对当前shell进程中某段代码片段有效(通常指函数)
位置变量:$1 $2……表示,用于让脚本在脚本代码中通过调用命令行中的传递的参数,1和2 分别代表第一个参数和第二个参数,shift可以替换参数特殊变量:$?:判断执行结果0-255                    $0:脚本名称                    $*:命令行中传递的所有参数,且当做一个整体                    $@:命令行传递的所有参数,每个参数当做一个整体                    $#:命令行中传递的参数总数,与$@只在被双引号包起来才会看出差异,可从下段脚本中看去区别root@Centos7.2  /testdir # cat arg1.sh arg2.sh #!/bin/bash#echo 1st is $1echo 2st is $2echo all args are is "$*"#!/bin/bash#./arg1.sh "$*" echo ============i ./arg1.sh "$@" echo ============== echo $*echo $@root@Centos7.2  /testdir # ./arg2.sh 1 2 3
1st is 1 2 32st isall args are is 1 2 3============i1st is 12st is 2all args are is 1 2 3==============1 2 31 2 3只读变量:只读变量不能修改删除变量赋值:readonly name=value 、declare -r  name=value PATH变量定义位置:.bash_profile  –>  $PATH:$HOME/binPATH=$PATH:$HOME/.local/bin:$HOME/bin     –.local/bin  centos7普通用户有的隐藏的目录,可以放写隐藏的脚本
写脚本的时候可以先mkdir /home/bin 在bin目录下写脚本,可省去相对路径。source bash.sh 也可以执行脚本:其执行过程相当于直接在当前shell进程中进行,而不是开一个子进程进行,所有脚本执行完,echo 变量,还可以查看到变量的值。(正常父进程是不能查看子进程的变量的)shadow 默认权限000  但是root用户属于超级用户 可读可写,但是如果文件没有x权限,root也不能执行算数运算符bash中的算数运算符:+、-、*、/、%、**(平方) 注意:在使用expr的时候“*” 要转义“\*”实现算数运算:                let var=算数表达式                var=$[算数表达式]                var=$((算数表达式))                var=$(expr arg1 arg2 arg3)   注意:每个参数之间要用空格隔开 root@cenots6.8 # echo $(expr 5 \* 2 - 1)
            9declare -i var=数字
echo ‘算数表达式’| bc随机数生成器:echo $[RANDOM%50]:0-49之间的随机数                           echo $[RANDOM%50+1]:1-50之间的随机数                           $RANDOM :1-32767
聚合命令 #!/bin/bash
echo xxx;(echo zzz;exit)     ############():代表开个子shell,exit退出子shell非当前shell
echo yyy
退出状态码0 代表成功, 1-255代表失败
$? 变量保存最近的命令退出状态我们也可以指定程序退出的状态码,根据状态码的数值,来判断工作状态,脚本中一旦遇到exit命令,脚本会立即终止,终止,终止退出状态取决于exit命令后面的数字,如果没有执行exit,则取脚本最后一条命令的执行状态结果。条件测试测试命令:test [expression]
                   [ $a = $b ]           判断 一对[]或两对[[]] 都可以
                   [[ $a == $b ]]      两个等号也可以                    [ -f /bin/cat -a -x /bin/cat ]    此时必须使用 一对[]  否则会报错 数值测试:                        -gt:大于                        -ge:大于等于                        -lt:小于                        -le:小于等于                        -eq:等于                        -ne:不等于字符串测试:                          ==:是否相等                          >:大于(比较ascll码)                          <:小于                          !=:是否不等于                          =~:左侧字符串是否能够被右侧的PATTERN所匹配,注意: 此表达式一般用于[[ ]]中;                          -z “string”:判断字符串是否为空,如果为空则为真                           -n “string”:判断字符串是否为空,如果不为空则为真 注意:用于字符串比较的时候,操作数应该使用引号存在性测试:               -a file:文件存在为真,否则为假               -e file:同-a              存在性及类别测试:         -b FILE:是否存在且为块设备文件            block
         -c FILE:是否存在且为字符设备文件         char
          -d FILE:是否存在且为目录文件                dir
          -f FILE:是否存在且为普通文件                 
          -h FILE 或 -L FILE:存在且为符号链接文件 
         -p FILE:是否存在且为命名管道文件
         -S FILE:是否存在且为套接字文件文件权限测试:            -r FILE:是否存在且可读
           -w FILE: 是否存在且可写
           -x FILE: 是否存在且可执行                     文件特殊权限测试:            -g FILE:是否存在且拥有sgid权限
            -u FILE:是否存在且拥有suid权限
            -k FILE:是否存在且拥有sticky权限文件大小测试:             -s FILE: 是否存在,非空为真,否则为假文件是否打开:             -t fd: fd表示文件描述符是否已经打开且与某终端相关
            -N FILE:文件自动上一次被读取之后是否被修改过
            O FILE:当前有效用户是否为文件属主
            -G FILE:当前有效用户是否为文件属组双目测试:                              FILE1 -ef FILE2: FILE1与FILE2是否指向同一个设备上的相同inode
                              FILE1 -nt FILE2: FILE1是否新于FILE2;
                              FILE1 -ot FILE2: FILE1是否旧于FILE2;组合测试条件:第一种方式:
         COMMAND1 && COMMAND2 并且
         COMMAND1 || COMMAND2 或者
         ! COMMAND 非
如: [ -e FILE ] && [ -r FILE ]
第二种方式:
         EXPRESSION1 -a EXPRESSION2 并且
         EXPRESSION1 -o EXPRESSION2 或者
         ! EXPRESSION