shell 脚本编程基础

timg

六、shell脚本编程

6.1bash脚本编程之变量

​ 作业提交地址:scp N wang@172.20.102.77:home/wang/bin

​ 执行脚本的方法: 以bash程序来执行: bash hello.sh或cat hello.sh |bash 直接指令下达: 加权限:chmod +x hello.sh 绝对路径:/home/hello.sh 相对路径:./hello.sh bash -n f1.sh #语法错误 bash -x f1.sh #执行调试

1、shell脚本入门和算述运算进阶

shell之变量 环境变量 在本shell与子shell中有效 export name=VALUE declare -x name=VALUE 本地变量 生效范围为当前shell进程中某代码片断,通常指函数 key=VAL 局部变量(标准变量、普通变量) 生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效 local key=VAL ( name=mage;echo $name) { name=mage;echo $name; } (ls;pwd) { ls;pwd }

不同点:小括号开启子shell,不影响当前的shell环境,大括号不开启shell,影响当前的shell环境 共同点:都是做为一个整体,把括号里的多个命令统一执行 x=1;echo “pid=;echo “subx=x”);echo x=$x pid=2887 subpid=2887 subx2=2 x=1 ​ 位置变量(特殊变量):在脚本代码中调用通过命令行传递给脚本的参数 2, …:对应第1、第2等参数,shift [n]换位置 $0: 命令本身 $*: 传递给脚本的所有参数,全部参数合为一个字符串 $@: 传递给脚本的所有参数,每个参数为独立字符串 $#: 传递给脚本的参数的个数 * 只在被双引号包起来的时候才会有差异 $?:代码执行返回值 $$:脚本或程序启动使用的PID set — 清空所有位置变量 ​ 变量的传递: N=NAME NAME=wang N1=${!N} eval N2=$$N //进行两次调用 ​ arg.sh

 

6.2bash脚本编程之算术运算

shell之计算

​ 算数运算: bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方) 实现算术运算:

(1) let var=算术表达式 (2) var=$[算术表达式] (3) var=$((算术表达式)) (4) var=$(expr arg1 arg2 arg3 …) (5) declare –i var = 数值 (6) echo ‘算术表达式’ | bc 乘法符号有些场景中需要转义,如* bash有内建的随机数生成器:$RANDOM(0-32767) echo RANDOM%50] :0-49之间随机数 let VAL1{+|-|*|/|**|%}VAL2 expr VAL1 {+|-|*|/|**|%} VAL2 $[VAL1{+|-|*|/|**|%}] eval echo {1..$1}:先将扫描将内含的变量替换为其值,然后再执行

1)使用let var=1 let “var+=1” echo $var

​ x=10 y=20 z=y let z=x+y a)参数在表达式中直接访问,不必加$ b)一般情况下算数表达式可以不加双引号,但是若表达式中有bash中的关键字则需加上 c)let后的表达式只能进行整数运算

2)使用$[] var=1 var=var+1] echo $var 输出结果位2 a)$[]将中括号内的表达式作为数学运算先计算结果再输出 b)对中的变量进行访问时前面需要加 c)$[]支持的运算符与let相同,但也只支持整数运算

3)使用(()) var=1 ((var+=1)) echo $var 输出结果为2 (())的使用方法与let完全相同

4)使用expr var=1 var=expr $var + 1 echo $var 输出结果为2 a)expr后的表达式个符号间需用空格隔开 b)expr支持的操作符有: |、&、<、<=、=、!=、>=、>、+、-、*、/、% c)expr支持的操作符中所在使用时需用\进行转义的有:|、&、<、<=、>=、>、* e)expr同样只支持整数运算 5)使用bc(可以进行浮点数计算) var=1 var=echo "$var+1"|bc echo $var 输出结果为2

 

6.3bash脚本编程之条件判断

​ &&(短路与)和&(逻辑与):有假则为假,全真则为真 ||(短路或)和|(逻辑或):有真则为真,全假则为假

​ 逻辑与和短路与的区别: 逻辑与的判断方式是:从左到右依次判断,直到结尾(逻辑全程运算) 短路与的判断方式是: 从左到右依次判断,直到出现false为止将不再判断,直接得到结果为false(短路遇false就停)

​ 逻辑与:& 0&0=0 0&1=0 1&0=0 1&1=1

​ 短路与 :&& 0&&0=0 0&&1=0 1&&0=0 1&&1=1 cmd1 && cmd2 cmd1为假,cmd2不需要执行,反之cmd1为真,需要执行cmd2

​ 逻辑或和短路或的区别 : 逻辑或的判断方式是:从左到右依次判断,直到结尾 短路或的判断方式是: 从左到右依次判断,直到出现true为止将不再判断,直接得到结果为true

​ 逻辑或: 0||0=0 0||1=0 1||0=0 1||1=1

​ 短路或 :||

!非:取相反的结果(!true为false,!false的结果为true) (!True即false;!false即true)

​ 亦或:^ 0^1=1 0^0=0 1^0=1 1^1=0 操作数相同则为真,操作数不同则为假 示例: a=2 b=3 let c=a+b echo $c

​ a=5;b=6;echo a=[a^b];a=a $b shell之比较

​ =,==,!=:比较字符串是否相同 -e:判断一个文件是否存在 -f:判断一个文件是否是一个普通文件 -d:判断一个文件是否是一个目录 -L:判断一个文件是否是一个软链接文件 -S:判断一个文件是否是一个socket文件 -z:判断一个字符串是否为空 -n:判断一个字符串是否不空

6.4bash脚本编程之test测试

​ 条件测试:test =[ ] 长格式的例子: test “B” && echo “Strings are equal” test “B” && echo “Integers are equal” 简写格式的例子: [ “B” ] && echo “Strings are equal” [ “B” ] && echo “Integers are equal” ​ test支持对字符串string、数字运算(arithmetic tests)、文件file的操作, ture echo $? 0 false echo $? 1

数字测试:

​ eq 相等; -ne 不等 ;-lt 小于 ; -le 小于等于 ;gt 大于 ;ge 大于等于

​ m=10 n=20 [ n ] && echo equal | | echo no equal no equal n=10 [ n ] && echo equal | | echo no equal equal

​ 变量如果在中括号中一般加双引号 [“b”],避免出问题

字符串测试:

​ == 是否等于 > ascii码是否大于ascii码 < 是否小于 != 是否不等于 =~ 左侧字符串是否能够被右侧的PATTERN所匹配 注意: 此表达式一般用于[[ ]]中;扩展的正则表达式 -z “STRING“ 字符串是否为空,空为真,不空为假 -n “STRING“ 字符串是否不空,不空为真,空为假  注意:用于字符串比较时的用到的操作数都应该使用引号 ​ str1=aaa str2=bbb test str2 (等号前后有空格) echo $? 1 #为假 str2=aaa test str2 echo $? 0 #为真 等价于[ ]的写法 [ str2 ] echo $? 0 #为真

​ 判断字符串长度是否为空:($?) 不为空,为真,显示0;为空,为假,显示1 [ -z $var ] echo $? 0 #为真

var=haha [ -z $var ] echo $? 1 #为假,不为空 (zero) [ “abc” ] echo $? 0 #为真,不为空 [ “” ] echo $? 1 #空,为假 [ ] echo $? 1 #空 为假 [ 0 ] echo $? 0 #不为空,为真 判断两个字符串、变量是否相同: x=haha y=hehe [ “y” ] echo $? 1

​ x=haha;y=haha; [ “y” ] && echo equal equal x=haha;y=haha; [ “y” ] && echo equal | | echo no equal equal x=haha;y=hehe; [ “y” ] && echo equal | | echo no equal no equal

文件测试:

​  存在性测试 -a FILE:同-e -e FILE: 文件存在性测试,存在为真,否则为假  存在性及类别测试 -b FILE:是否存在且为块设备文件 -c FILE:是否存在且为字符设备文件 -d FILE:是否存在且为目录文件 -f FILE:是否存在且为普通文件 -h FILE 或 -L FILE:存在且为符号链接文件 -p FILE:是否存在且为命名管道文件 -S FILE:是否存在且为套接字文件 判断是否为文件夹: [ -d /etc/ ] && echo true true [ -d /etc/redhat-release ] && echo true(加粗为文件,非文件夹) [ -d /bin/ ] && echo true true [ -L /bin ] && echo true (软链接) true

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/97317

发表评论

登录后才能评论

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班