目录
shell和shell脚本
从程序员的角度来看,shell本身就是一种C语言编写的程序,从用户角度来看,shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以使用shell脚本来一次执行多个命令。
Linux的shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C shell (/usr/bin/csh)、K shell(/usr/bin/Ksh)等等,在本文中,我们关注的重点是Bash,由于易用和免费,Bash在日常工作中被广泛的使用;同时,Bash也是大多数Linux系统默认的Shell。
一、Shell实例和执行
1、hello world
#指定使用bash来解释这个shell脚本
#!/bin/bash
#shell脚本不需要指定变量的类型
str="hello world"
#使用$来引用这个变量的值,echo打印命令
echo $str
执行脚本
可以看到有权限限制,我们可以把这个sh文件加上可执行权限,使用chmod
也可以使用bash 加上shell脚本:
2、简单的加法
#!/bin/bash
var1=1
var2=2
#这样只能做简单的拼接
total=$var1+$var2
echo $total
#这样也是只能做简单的拼接,``这个不是单引号,他叫做命令置换符,他是ESC键的下面一个
total=`expr $var1+$var2`
echo $total
var=$var1$var2
echo $var
#因为expr是一个命令 var1 +号 和var2都是参数,所以必须使用空格隔开
total=`expr $var1 + $var2`
echo "total=$total"
二、shell的条件判断
1、if语句
用一个if语句来判断该系统是什么系统
#!/bin/bash
SYSTEM=`uname -s`
if [ $SYSTEM == "Linux" ] ; then
echo "Linux System"
elif [ $SYSTEM == "FreeBSD" ] ; then
echo "FreeBSD System"
elif [ $SYSTEM == "Solaris" ] ; then
echo "Solaris System"
else
echo "Unkonw System"
fi
#if 和 fi 相当于{},因为在shell里面和C语言里面的{}含义不同,所以不能使用
#类似的还有switch语句中的 case 和 esac
注意: 在if的后面必须要有一个空格,然后在[]的左右两边都必须要有一个空格
不然会报错的:
还有一个点是:可以只用一个=来判断是否等于,但是等号两边必须要有等号,没有等号会被认为是赋值。(箭头处应该有空格)
#!/bin/bash
# gt(>) lt(<) eq(=) ge(>=) le(<=)
#因为<>号里面会被认为是重定向的标志,所以不能使用
var=5
if [ $var -gt 5 ] ; then
echo "var > 5"
elif [ $var -le 5 ] ; then
echo "var <= 5"
else
echo "I don't konw"
fi
2、Shell常见的判断
1、字符串的判断
2、数字的判断
3、文件的判断
#!/bin/bash
#判断是否存在
if [ -s if1.sh ] ; then
#判断是否有执行权限
if [ -x if1.sh ] ; then
echo "./if1.sh"
else
echo "bash if1.sh"
fi
fi
因为if1.sh我没有给它加执行权限,所以应该会输出 bash if1.sh,看看结果:
4、逻辑判断
把上一个例子的两个if合起来
#!/bin/bash
#判断是否存在并且是否可执行
if [ -s if1.sh -a -x if1.sh ] ; then
echo "if1.sh -s -x"
else
echo "unkonw if1.sh"
fi
应该打印下面一个结果
三、Shell switch/case
完成一个和第一个if例子相同功能的事情
#!/bin/bash
SYSTEM=`uname -s`
#shell中不用switch
#两个;;代表break
#*代表default
#esac和case配对
case $SYSTEM in
Linux)
echo "Linux System"
;;
FreeBSD)
echo "FreeBSD System"
;;
Solaris)
echo "Solaris System"
;;
*)
echo "Unknow System"
;;
esac
四、shell循环
1、for循环
#!/bin/bash
#使用seq命令可以参数一个序列然后完成遍历
for i in `seq 1 10`; do
echo $i
done
#打印当前路径下的所有文件名
for file in `ls`
do
echo $file
done
2、while循环
#!/bin/bash
min=1
max=10
while [ $min -le $max ]
do
echo $min
min=`expr $min + 1`
done
同样需要注意[]左右两边的空格
五、shell的参数解析
1、参数值
#!/bin/bash
#参数个数
echo "Arguments count :$#"
#参数列表
echo "Arguments List :$*"
#shell文件名
echo "argv[0] : $0"
#第一个参数
echo "argv[1] : $1"
#第二个参数
echo "argv[2] : $2"
别的我就不写了
2、函数
#!/bin/bash
#和C语言不一样的是函数中不需要确定参数类型,也不用确定参数的个数
function test()
{
echo "function arguments count: $#"
echo "function arguments list : $*"
echo "function 1st argument : $1"
echo "function 2rd argument : $2"
}
test hehe haha
六、shell其他应用
1、shell调试 代开和关闭
set -x 和 set +x可以在shell脚本中打开调试和关闭调试
#!/bin/bash
#和C语言不一样的是函数中不需要确定参数类型,也不用确定参数的个数
function test()
{
#打开调试
set -x
echo "function arguments count: $#"
echo "function arguments list : $*"
#关闭调试
set +x
echo "function 1st argument : $1"
echo "function 2rd argument : $2"
}
test hehe haha
也可以使用bash -x xxx.sh来使得整个shell脚本都打开调试
2、shell段注释
:<< EOF
…
EOF
#!/bin/bash
#和C语言不一样的是函数中不需要确定参数类型,也不用确定参数的个数
function test()
{
echo "function arguments count: $#"
echo "function arguments list : $*"
:<<EOF
echo "function 1st argument : $1"
echo "function 2rd argument : $2"
EOF
}
test hehe haha
单句注释就是#号,但是有的时候#有特殊的作用,比如第一句使用bash来解释执行shell的语句就不是注释,但是百分之99的#都是注释。
3、source 或 .命令 让INI格式文件生效
总结
为什么我要学习shell呢,主要是因为我要写一个开机自启动的脚本让我的项目开机自启动,因为启动我的项目不止需要一条命令,所以shell脚本可以很好的解决这个问题。一步一步学习,学习了shell之后也可以完成除了开机自启动的脚本外的东西了。