Linux shell编程
- 第一个shell脚本
- 变量
- 变量的定义及使用
- 预定义变量和位置变量
- 数值关系运算符、逻辑运算符和字符串运算符
- 文件运算符
- test结构
- 循环if、for、while
- TMOUT
- 函数参数
- shell循环打印图形
第一个shell脚本
vi test.sh 下面展示一些
代码
。
#!/bin/bashecho \"Hello,shell,u\'r very pretty.\"
chmod +x test.sh 赋予执行权限
运行几种方式:
1、./test.sh
2、sh test.sh
3、/bin/bash test.sh
变量
变量的定义及使用
#!/bin/bashabc=123123123 #不需要声明变量aab=abc # aab 直接引用aaa=${JAVA_HOME} #环境变量可以直接使用def=${!aab} # 间接引用。 将abc的值分配给defabc=${abc/\'1\'/\'h\'}# 将1转换成h#echo $aaaaa $abc #{}可以规定范围#echo ${aaa}aa $abc #输出#echo ${def} #输出/opt/jdk1.8.0_221aa h23123123#echo ${aab} #直接输出abc#path=`pwd` # 将命令的结果分配给变量#echo $path #输出pwd命令结果
计算表达式
a=123b=123#c=${a}+${b}*2 #输出123+123*2(( c=${a}+${b}*2 )) #输出369#c=$[${a}+${b}*2] #输出369echo $c
预定义变量和位置变量
预定义变量$#:命令行参数或位置参数的数量$?:最近一次执行的命令或shell脚本的出口状态$*:表示所有的位置参数,其值是所有位置参数的值$$:变量是shell脚本里面的进程ID。Shell脚本经常使用 $$ 变量组织临时文件名,确保文件名的唯一性位置变量$n:$0代表命令本身,$1-$9代表顺序参数编号,大于10的话使用括号,如${10}
#!/bin/basha=$1b=$2c=$[$1+$2*2]echo c变量:$cecho 变量个数:$#echo 状态:$?echo 命令本身:$0echo 所有参数:$*echo 进程:$$
./tmpParam.sh 3 4 输出结果
c变量:11变量个数:2状态:0命令本身:./tmpParam.sh所有参数:3 4进程:2817
./tmpParam.sh 3 5 6 4 9 6 输出结构
c变量:13变量个数:6状态:0命令本身:./tmpParam.sh所有参数:3 5 6 4 9 6进程:2824
数值关系运算符、逻辑运算符和字符串运算符
数值关系运算符-eq 等于-ne 不等于-gt 大于-lt 小于-le 小于等于-ge 大于等于逻辑运算符-a或&& 逻辑与-o或|| 逻辑或! 逻辑否字符串运算符= 等于!=不等于-z 判断是否为空
bash shell脚本中变量无法存储布尔值,布尔值只能用于条件判断
条件中非空都为true
vi yunsuan.sh
#!/bin/bashaaa=123bbb=123if [ ]then echo \"nihao\"else echo \"buhao\"fib=$[ aaa == 123 ]echo $aecho $bexport bb=$b #需要source yunsuan.sh,才能通过命令窗口echo $bb 输出值
输出结果
buhao1
文件运算符
-d 判断是否为目录-e 判断目录或文件是否存在-f 判读是否为文件-r 判断文件或目录只对当前用户是否可读-w 判断文件或目录针对当前用户是否可写-x 判断文件或目录针对当前用户是否可执行
使用脚本删除文件
#要根据文件名删除文件,删除前判断类型,如果是目录则不删除fullPath=$1echo $fullPathif [ ! -e $fullPath ]thenecho \"文件不存在,不可删除\"elif [ -d $fullPath ]thenecho \"要删除的是已经安装好的目录,不可删除\"elif [ -f $fullPath ]thenecho \"执行删除:\"`rm -f $fullPath`elseecho \"xxx\"fiecho \"状态为:\"$?echo \"执行脚本完成\"
test结构
和if用法差不多,但是可读性比较差if exit status # 返回0表示true,其他的返回值为falsethenif test comparison expression or file teststhenif [ comparison expression or file tests ]thenif [[ comparison expression or file tests ]]then
演示
#!/bin/bashvi=\"beijing\"v2=\"rotonto\"[[ $v1 != $v2 ]] && echo \"这两个不等\"
循环if、for、while
if语句ifthen...fiif-else语句ifthen...else...fiif-else-if语句:ifthen...elifthen...else...fifor循环:for((a=1;a<5;a++))do...done增强for循环:for a in parm1 parm2 parm3 parm4 ....do...donewhile循环:(())基本等同于[]a=1while [a -le 5]do...let \"a++\"donecase 判断case 变量 in:值1)...;;值2)...;;值3)...;;...*)...;;esac
例题
#!/bin/bash#var = 6对下面表达式无影响#for var in 1 2 3 4 5#do# echo $var# echo \"abc\"#done#a=0#while [ $a -lt 5 ]#do# echo \"循环次数\"+$[ ${a}+1 ]# let \"a++\"#done#for ((a=0;a<5;a++))#do# echo \"循环次数\"$[$a+1]#doneecho \"请输入1-4之内的数字\"read numcase $num in1)echo \"输入的是1\";;2)echo \"输入的是2\";;3)echo \"输入的是3\";;4)echo \"输入的是4\";;*)echo \"输入的不正确\"esac
TMOUT
TMOUT:在用户输入空闲一段时间后自动断开
#!/bin/bashTMOUT=3echo \"请在\"${TMOUT}\"秒内输入名称\"read nameif [ $? -eq 0 ]thenecho \"输入的姓名为:\"${name}elseecho \"输入超时\"fi
函数参数
#!/bin/bashfunction a(){echo \"first blood!\"}b(){return $[1+2]}aaa=$1bbb=$2c(){echo $aaaecho $[aaa+bbb]echo $1echo $[$1+$2]# echo $[ $#>0?\"不空\":\"空\" ]}c $1 $2b_rst=$?
脚本执行其他脚本
#!/bin/bash#用脚本执行其他脚本/bin/bash /tmpp/yunsuan.sh
shell循环打印图形
打印矩形,自定义大小
#!/bin/bashecho \"请输入你想要的长度:\"nread n#打印矩形square(){# for((a=1;a<=n;a++))for var in `seq 1 $n`dofor((b=1;b<=n;b++))doecho -n \"* \"doneecho \"\"done}square
打印直角三角形
#!/bin/bashthree_ancle(){for((a=1;a<=5;a++))dofor((b=1;b<=5-a;b++))doecho -n \" \"donefor((b=1;b<=a;b++))doecho -n \"*\"doneecho \"\"done}three_ancle
打印菱形
#!/bin/bashdiamond(){for((a=1;a<=5;a++))dofor((b=1;b<=5-a;b++))doecho -n \" \"donefor((b=1;b<=a;b++))doecho -n \"* \"doneecho \"\"donefor((a=1;a<=4;a++))dofor((b=1;b<=a;b++))doecho -n \" \"donefor((b=4;b>=a;b--))doecho -n \"* \"doneecho \"\"done}diamond