shell编程入门(一)
输出打印
先来一个最简单的吧,echo,其实就是将内容输出到控制台上而已。
#! /bin/bash
echo "法外狂徒张三"
为脚本添加执行权限,要不然是没办法执行的
ZHR:md zc$ ./test.sh
bash: ./test.sh: Permission denied
ZHR:md zc$ chmod +x test.sh
ZHR:md zc$ ./test.sh
法外狂徒张三
输出到文件
#! /bin/bash
ls>wangwu.txt
然后发现和test.sh文件同级别目录下新增了一个wangwu.txt,打开后发现里面有与脚本同级目录的所有文件名,执行多次的结果是一致的
上面的方法如果文件中已经有内容了,那就要覆盖,如果想要在文件末尾添加新内容就要使用下面的方式
#! /bin/bash
ls>>wangwu.txt
变量的引用${}
其实这个{}可以加可以不加,但是推荐加上去,因为如果你的脚本如果很复杂的话,{}可以很好的让你看出来哪里是引用的变量。
#! /bin/bash
zhangsan="法外狂徒张三"
echo ${zhangsan}
结果
ZHR:md zc$ ./test.sh
法外狂徒张三
命令的替换$()
#! /bin/bash
echo $(pwd)
结果
ZHR:md zc$ ./test.sh
/Users/zc/Desktop/md
单引号和双引号
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
#! /bin/bash
zhangsan="法外狂徒张三"
echo 'luoxiangshuo,${zhangsan}'
使用单引号结果
ZHR:md zc$ ./test.sh
luoxiangshuo,${zhangsan}
双引号里可以有变量
#! /bin/bash
zhangsan="法外狂徒张三"
echo "luoxiangshuo,${zhangsan}"
使用双引号的结果
ZHR:md zc$ ./test.sh
luoxiangshuo,法外狂徒张三
日期
#! /bin/bash
echo $(date +%Y%m%d%H%M%S)
结果
ZHR:md zc$ ./test.sh
20210706151741
if判断
if
#! /bin/bash
if [ 0 -eq 0 ];then
echo "hi";
fi
这里的[ 0 -eq 0 ]在下面讲,现在就将其想像成java中的if(00)中的(00)就可以
⚠️:[]后面要加上;
结果
ZHR:md zc$ ./test.sh
hi
if else
#! /bin/bash
if [ 0 -eq 1 ];then
echo "hi";
else
echo "no hi";
fi
结果
ZHR:md zc$ ./test.sh
no hi
if else-if else
#! /bin/bash
if [ 0 -eq 1 ];then
echo "one";
elif [ 0 -eq 2 ];then
echo "two";
else [ 0 -eq 0 ]
echo "three";
fi
注意,最后一个else后面是没有then的
结果
ZHR:md zc$ ./test.sh
three
test
test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,其实test分为两种,第一种是使用test命令,第二种是使用[],但是大家常用的都是[]模式,所以我们也用[],注意,[]里的表达式,必须在左括号的右侧和右括号的左侧各加一个空格,否则会报错
数值测试
-eq 等于 equal
-ne 不等于 no equal
-gt 大于 great than
-ge 大于等于 great equal
-lt 小于 little then
-le 小于等于 little equal
#! /bin/bash
a=10
b=20
c=30
a_1=10
b_1=20
if [ ${a} -eq ${a_1} ];then
echo "one";
fi
echo "======我是分割线======="
if [ ${b} -lt ${c} ];then
echo "two";
fi
echo "======我是分割线======="
if [ ${c} -gt ${a} ];then
echo "three";
fi
echo "======我是分割线======="
if [ ${a} -le ${a_1} ];then
echo "four";
fi
echo "======我是分割线======="
if [ ${b} -ge ${b_1} ];then
echo "five";
fi
结果
ZHR:md zc$ ./test.sh
one
======我是分割线=======
two
======我是分割线=======
three
======我是分割线=======
four
======我是分割线=======
five
字符串测试
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真 zero
-n 字符串 字符串的长度不为零则为真
#! /bin/bash
a="蔡文姬"
b="郭嘉"
c=""
d_1="郭嘉"
if [ ${b} = ${d_1} ];then
echo "${b}=${d_1}";
fi
echo "======我是分割线======="
if [ ${b} != ${a} ];then
echo "${b}不等于${a}";
fi
echo "======我是分割线======="
if [ -z ${c} ];then
echo "${c}是0个字符";
fi
echo "======我是分割线======="
if [ -n ${b} ];then
echo "${b}大于0个字符";
fi
echo "======我是分割线======="
结果
ZHR:md zc$ ./test.sh
郭嘉=郭嘉
======我是分割线=======
郭嘉不等于蔡文姬
======我是分割线=======
是0个字符
======我是分割线=======
郭嘉大于0个字符
======我是分割线=======
文件测试
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-s filename 如果文件长度不为0,则为真
filename1 -nt filename2 如果 filename1比 filename2新,则为真。 new than
filename1 -ot filename2 如果 filename1比 filename2旧,则为真。old than
#! /bin/bash
a=$(pwd)
b="111.txt" #是一个非空文件
c="222.txt" #是一个空文件,创建时间更晚
if [ -d ${a} ];then
echo "${a}是一个目录";
fi
echo "======我是分割线======="
if [ -e ${a}/${b} ];then
echo "${a}/${b}是一个文件";
fi
echo "======我是分割线======="
if [ -f ${a}/${b} ];then
echo "${a}/${b}是一个常规文件";
fi
echo "======我是分割线======="
if [ -s ${a}/${b} ];then
echo "${a}/${b}的长度为0";
else
echo "${a}/${b}的长度不为0";
fi
echo "======我是分割线======="
if [ -s ${a}/${c} ];then
echo "${a}/${c}的长度为0";
else
echo "${a}/${c}的长度不为0";
fi
echo "======我是分割线======="
if [ ${a}/${b} -nt ${a}/${c} ];then
echo "${a}/${b}比${a}/${c}新";
else
echo "${a}/${b}比${a}/${c}老";
fi
echo "======我是分割线======="
结果
ZHR:md zc$ ./test.sh
/Users/zc/Desktop/md是一个目录
======我是分割线=======
/Users/zc/Desktop/md/111.txt是一个文件
======我是分割线=======
/Users/zc/Desktop/md/111.txt是一个常规文件
======我是分割线=======
/Users/zc/Desktop/md/111.txt的长度为0
======我是分割线=======
/Users/zc/Desktop/md/222.txt的长度不为0
======我是分割线=======
/Users/zc/Desktop/md/111.txt比/Users/zc/Desktop/md/222.txt老
======我是分割线=======
for循环
常用的是读取文件中的一条条内容
#! /bin/bash
a=$(pwd)
b="111.txt" #是一个非空文件
c=${a}/${b}
for i in $(cat ${c})
do
echo "打印的内容为${i}"
done
结果,和文件内容一致
ZHR:md zc$ ./test.sh
打印的内容为法外狂徒张一
打印的内容为法外狂徒张二
打印的内容为法外狂徒张三
打印的内容为法外狂徒张四
打印的内容为法外狂徒张五
打印的内容为法外狂徒张六
也可以循环数字
#! /bin/bash
for i in i 1 2 3 4 5
do
echo "打印的内容为${i}"
done
结果
ZHR:md zc$ ./test.sh
打印的内容为i
打印的内容为1
打印的内容为2
打印的内容为3
打印的内容为4
打印的内容为5
也可以循环字符串
#! /bin/bash
for i in i am hanmeimei , who are you
do
echo "打印的内容为${i}"
done
结果
ZHR:md zc$ ./test.sh
打印的内容为i
打印的内容为am
打印的内容为hanmeimei
打印的内容为,
打印的内容为who
打印的内容为are
打印的内容为you