Linux shell编程
第一个shell脚本
vi test.sh 下面展示一些 代码
。
#!/bin/bash
echo "Hello,shell,u'r very pretty."
chmod +x test.sh 赋予执行权限
运行几种方式:
1、./test.sh
2、sh test.sh
3、/bin/bash test.sh
变量
变量的定义及使用
#!/bin/bash
abc=123123123 #不需要声明变量
aab=abc # aab 直接引用
aaa=${JAVA_HOME} #环境变量可以直接使用
def=${!aab} # 间接引用。 将abc的值分配给def
abc=${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=123
b=123
#c=${a}+${b}*2 #输出123+123*2
(( c=${a}+${b}*2 )) #输出369
#c=$[${a}+${b}*2] #输出369
echo $c
预定义变量和位置变量
预定义变量
$#:命令行参数或位置参数的数量
$?:最近一次执行的命令或shell脚本的出口状态
$*:表示所有的位置参数,其值是所有位置参数的值
$$:变量是shell脚本里面的进程ID。Shell脚本经常使用 $$ 变量组织临时文件名,确保文件名的唯一性
位置变量
$n:$0代表命令本身,$1-$9代表顺序参数编号,大于10的话使用括号,如${10}
#!/bin/bash
a=$1
b=$2
c=$[$1+$2*2]
echo c变量:$c
echo 变量个数:$#
echo 状态:$?
echo 命令本身:$0
echo 所有参数:$*
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/bash
aaa=123
bbb=123
if [ ]
then echo "nihao"
else echo "buhao"
fi
b=$[ aaa == 123 ]
echo $a
echo $b
export bb=$b #需要source yunsuan.sh,才能通过命令窗口echo $bb 输出值
输出结果
buhao
1
文件运算符
-d 判断是否为目录
-e 判断目录或文件是否存在
-f 判读是否为文件
-r 判断文件或目录只对当前用户是否可读
-w 判断文件或目录针对当前用户是否可写
-x 判断文件或目录针对当前用户是否可执行
使用脚本删除文件
#要根据文件名删除文件,删除前判断类型,如果是目录则不删除
fullPath=$1
echo $fullPath
if [ ! -e $fullPath ]
then
echo "文件不存在,不可删除"
elif [ -d $fullPath ]
then
echo "要删除的是已经安装好的目录,不可删除"
elif [ -f $fullPath ]
then
echo "执行删除:"`rm -f $fullPath`
else
echo "xxx"
fi
echo "状态为:"$?
echo "执行脚本完成"
test结构
和if用法差不多,但是可读性比较差
if exit status # 返回0表示true,其他的返回值为false
then
if test comparison expression or file tests
then
if [ comparison expression or file tests ]
then
if [[ comparison expression or file tests ]]
then
演示
#!/bin/bash
vi="beijing"
v2="rotonto"
[[ $v1 != $v2 ]] && echo "这两个不等"
循环if、for、while
if语句
if
then
...
fi
if-else语句
if
then
...
else
...
fi
if-else-if语句:
if
then
...
elif
then
...
else
...
fi
for循环:
for((a=1;a<5;a++))
do
...
done
增强for循环:
for a in parm1 parm2 parm3 parm4 ....
do
...
done
while循环:(())基本等同于[]
a=1
while [a -le 5]
do
...
let "a++"
done
case 判断
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]
#done
echo "请输入1-4之内的数字"
read num
case $num in
1)echo "输入的是1"
;;
2)echo "输入的是2"
;;
3)echo "输入的是3"
;;
4)echo "输入的是4"
;;
*)echo "输入的不正确"
esac
TMOUT
TMOUT:在用户输入空闲一段时间后自动断开
#!/bin/bash
TMOUT=3
echo "请在"${TMOUT}"秒内输入名称"
read name
if [ $? -eq 0 ]
then
echo "输入的姓名为:"${name}
else
echo "输入超时"
fi
函数参数
#!/bin/bash
function a(){
echo "first blood!"
}
b(){
return $[1+2]
}
aaa=$1
bbb=$2
c(){
echo $aaa
echo $[aaa+bbb]
echo $1
echo $[$1+$2]
# echo $[ $#>0?"不空":"空" ]
}
c $1 $2
b_rst=$?
脚本执行其他脚本
#!/bin/bash
#用脚本执行其他脚本
/bin/bash /tmpp/yunsuan.sh
shell循环打印图形
打印矩形,自定义大小
#!/bin/bash
echo "请输入你想要的长度:"n
read n
#打印矩形
square(){
# for((a=1;a<=n;a++))
for var in `seq 1 $n`
do
for((b=1;b<=n;b++))
do
echo -n "* "
done
echo ""
done
}
square
打印直角三角形
#!/bin/bash
three_ancle(){
for((a=1;a<=5;a++))
do
for((b=1;b<=5-a;b++))
do
echo -n " "
done
for((b=1;b<=a;b++))
do
echo -n "*"
done
echo ""
done
}
three_ancle
打印菱形
#!/bin/bash
diamond(){
for((a=1;a<=5;a++))
do
for((b=1;b<=5-a;b++))
do
echo -n " "
done
for((b=1;b<=a;b++))
do
echo -n "* "
done
echo ""
done
for((a=1;a<=4;a++))
do
for((b=1;b<=a;b++))
do
echo -n " "
done
for((b=4;b>=a;b--))
do
echo -n "* "
done
echo ""
done
}
diamond