shell编程一

shell编程一

一、起步

新建脚本

vim test.sh

#!/bin/bash
date; who
echo '我的第一个"shell"脚本'
  • 第一行指定shell,注释也用#
  • 第二行执行两个指令,用;分开,也开一用&&
  • 第三行使用echo指定输出,如果输出内容有引号,使用单引号如此联合使用,echo默认回车,如果不想回车,添加-n 选项

执行

方式一:

chmod +x test.sh
./test.sh

方式二:

sh test.sh
sh -x test.sh  #输出执行

二、变量

shell脚本中可以使用系统变量和自定义变量。

  1. 声明变量:区分大小写,变量名=值之间没有空格
  2. 使用变量:$变量,在变量和其他字符紧临时,使用${}把变量包起来
  3. 获取命令结果给变量,可以使用``,$() 示例:
#!/bin/bash
echo $JAVA_HOME
Var=123
var=456
echo ${var}--$Var
echo `pwd`
echo $(pwd)

结果

/usr/local/java/jdk1.8.0_91 456–123 /root /root

只读变量:

myUrl="http://www.w3cschool.cc"
readonly myUrl
myUrl="http://www.runoob.com"

删除变量

unset variable_name

二、输入输出重定向

输出

> 输入重定向
>> 追加方式
[root@zz01 home]# date >>/home/t.sh 
[root@zz01 home]# cat t.sh 
2016年 01月 04日 星期一 05:29:12 CST
2016年 01月 04日 星期一 05:29:40 CST

&»文件名把错误命令信息也写入文件 &>/dev/null把所有信息放入垃圾箱 ls »abc 2>cde 正确放入abc,错误放入cde文件

输入

<:把文件内容给命令

三、数学运算

#!/bin/bash
a=`expr 1 + 1`
echo $a #2

# 注意下列的空格
expr 15 / 5 	# 3
expr 10 / 6 	# 1
expr 10 % 6 	# 4
expr 10 \* 5	# 50
expr 10 - 5		# 5
expr 10 \> 9 	# 1
expr 10 \< 9 	# 0

echo "-----分割--------"
echo $[1 + 5]	# 6
echo $[2 * 5] 	# 10

以上expr$[]只支持整数,如果计算小数,需要用bc yum install bc

#!/bin/bash
# scale 表示保留小数位数
echo $(echo "scale=4; 10 / 3" | bc) # 3.3333
echo `echo "scale=1;10.0 / 5" | bc` # 2.0

echo "-----下面给几个计算统一添加小数位--------"
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc << EOF
scale = 4
a1 = ( $var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
echo $var5 # 2813.9882

四、退出脚本

脚本或者命令执行结果可以使用$?查看,正常退出时为0,错误退出时为0--255之间的错误码。

#!/bin/bash
pwd
echo ll执行状态码:$?
pwdd
echo sdf执行状态码:$?
exit 1
echo 这条命令不被输出

执行结果:

/root ll执行状态码:0 ./test.sh:行5: pwdd: 未找到命令 sdf执行状态码:127

再执行 echo $?输出 1 exit 可以没有参数,为0,可以为1到255数字,可以为数字变量

默认情况下,执行到错误语句还会继续执行下面的脚本,如果想出现错误就停止,可以使用set -e

五、实例

删除某个目录下需要删除的文件

#!/bin/bash
set -e
BASE_DIR=$1
if [ "$1" == "" ] || [ "$1" == " " ]
then
        echo "请输入目录作为参数"
        exit 1
fi

files=`find "${BASE_DIR}" -regex '.*/\(service\|app\|session\|quartz\|env_.*\)\.properties'`

if [ "X${files}" == "X" ]
then
        echo "没有相关文件"
        exit 0
fi
for file in ${files}
do
        rm -f ${file}
        echo "remove ${file}"
done
CONTENTS