闲来无事,研究shell脚本
shell基本演示
#!xxx:xx是解释此脚本的shell程序所在位置
例如:
创建一个test.sh文件:vim test.sh
shell代码:
#!/bin/bash
echo "first shell program!"
赋予test.sh可执行权限:chmod +x test.sh
执行test.sh:./test.sh
输出:

shell变量命名及引用
变量名和值之间用“=”分割,不能有空格,变量名开头不能有数字,不能使用bash里的关键
引用变量使用$变量名
例如:
vim test02.sh
#!/bin/bash
my_var01="这是我的第一个变量"
echo $my_var01
记得要给文件授予执行权限:chmod +x test02.sh
输出:

变量及字符串
#! /bin/bash
#只读变量,使用readonly修饰之后,再次赋值无法成功
my_var02="one only"
readonly my_var02
my_var02="two"
echo ${my_var02}
#字符串拼接
par0="head info str"
par01="一个旺财"
echo "拼接结果:${par0} \"${par01}\""
#删除变量 unset,删除之后不会有任何输出
param01="one param"
unset param01
echo "delete result:${param01}"
#获取字符串长度,从0开始
paramLen="test length"
echo ${paramLen:1:3}
#查找字符串:查找w所在的索引
paramSeach="nwjtest seach str"
echo `expr index "${paramSeach}" w`
:<<!
巴拉巴拉巴拉了多行注释
!
数组
#! /bin/bash
#数组,数组之间用空格分隔,字符串用""
#获取某一个数组元素${数组名[下标]}
arr01=("a" "b" 1 3)
echo ${arr01[0]} ${arr01[2]}
#获取所有元素:@
echo "all arr:" ${arr01[@]}
#数组长度
length=${#arr01[@]}
legth2=${#arr01[*]}
echo "length:"${length}",length2:"${length2}
执行shell脚本时传递参数
与java -jar xxx.jar param1 param2 效果相同,java在执行.jar文件时给主函数传递参数
shell传递:./xxx.sh param1 param2 param3 … 传递参数
shell获取参数:$n
具体代码:创建shell文件:vim test04_param.sh
#! /bin/bash
#shell脚本传递参数:参照java jar命令启动时给主函数传递参数
echo "参数传递实例";
echo "获得参数0:$0";
echo "获得参数1:$1";
echo "获得参数2:$2";
# $@与$*的区别:$*传递的参数相当于 "1 2 3"(三个参数一次性传递) ,$@传递的参数相当于 "1" "2" "3"(传递了三个参>数)
echo "打印系列参数:$0 $1 $2"
echo "打印系列参数2: $@"
echo "打印系列参数3:$*"
echo "脚本执行进程ID号:"$$
echo "参数个数:$#"
#效果演示
for idx in "$*" ;do
echo "result 1:"$idx
done
for idx in "$@";do
echo "result 2:"$idx
done
执行:chmod +x test04_param.sh
./test04_param.sh 旺财1 旺财2
执行结果:

逻辑判断
逻辑判断表达式[]中,前后需要空格,否则判断报错:[空格$a == $b空格]
#! /bin/bash
#运算符演示,运算符前后需要空格分隔,否则变成了字符串了
a=20;
b=40;
res=`expr ${a} + ${b}`;
echo "a+b:"${res};
res=`expr ${a} - ${b}`;
echo "a-b:"${res};
res=`expr ${a} \* ${b}`;
echo "a*b:"${res};
res=`expr ${a} % ${b}`;
echo "a % b:"${res};
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
echo输出
#! /bin/bash
#echo输出测试,-e表示开启转义
echo -e "test \n other word"
#开启转义,不换行
echo -e "test two \c"
echo "one space"
#输出到指定文件,当前路径下的one文件
echo "test info write to file" > one
#输出日期
echo `date`
printf输出
#! /bin/bash
#printf演示,printf默认是不带换行的,需要手动换行
printf "输出一句话\n"
#按照格式输出
#语法 printf format-string [param]
printf "%-10s %-8s %-4s\n" 产品 分类 出口量
printf "%-10s %-8s %-4s\n" 牛奶 食品 1000kg
printf "%-10s %-8s %-4s\n" 苹果 水果 5000kg
printf "%-10s %-8s %-4s\n" 桉树 植物 1000棵
:<<!
%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
!
printf "%-4.3f \n" 10.987654
#输出一个字符串和一个整型数字
printf "%s %d\n" "abcdef" 123.456
printf "%s\n" hhhhh
test判断
#! /bin/bash
#test演示:test用于测试条件是否成立
#数值测试: -eq:等于, -ne :不等于 , -gt:大于 , -ge:大于等于,-lt:小于 ,-le:小于等于
a=10;
b=20;
if test $[a] -eq $[b]
then
echo "相等"
else
echo "不相等"
fi
#[]:用于执行基本运算,如下
x=9;
y=11;
res=$[x+y];
echo "res:${res}"
#字符串测试
str1="abc"
str2="abd"
if test ${str1} = ${str2}
then
echo "字符串相等"
else
echo "字符串不相等"
fi
#文件测试: -e :文件存在返回真 ,-r:文件可读返回真,-w:文件可写返回真,-x:文件可执行返回真,-s...:查API去吧
#演示:进入/data_mine目录下查看是否有day_1文件
cd /data_mine
if test -e ./day_1
then
echo "is exist"
else
echo "is no exist"
fi
本文介绍了Shell脚本的基础知识,包括脚本的创建与执行、变量定义与引用、字符串操作、数组使用、参数传递、逻辑判断及输出控制等内容。
33万+

被折叠的 条评论
为什么被折叠?



