一、Shell入门
我们先看一个小例子,永恒的经典:Hello World
#!/bin/sh
var="Hello World!"
echo $var
保存,文件名为:hello
我们发现文件的第一行虽是一个注释,但是说明了文件的执行是由/bin/sh来执行,所以我们这么来执行这个文件:
/bin/sh hello
就可以看到结果了,但我们知道在Linux下,一个文件是否可以执行是由文件属性来决定的,那么我们是否可以给他加上可执行权限,来执行这个文件呢?
先执行如下命令:
chmod u+x hello
然后我们在直接敲命令:hello,看到什么现象?
所以一个文件被执行有这两个途径
二、Shell语法入门
- 输入/输出内部命令
①. echo 输出命令
②. read 输入命令
例如:
#!/bin/sh
echo Name:
read NAME
echo Phone:
read PHONE
echo SNAME,SPHONE > contact.txt
- if条件语句
在看if条件语句之前,我们先看一下:测试命令执行结果,在Linux下正确的命令执行结果为0,否则为其他值,我们可以用:
echo $?
来看上一个命令的执行结果,懂了这些之后,我们在看那些常见语法
if 条件测试命令串
then
条件为真时执行的命令
else
条件为假时执行的命令
fi
注:if和then必须是两行,如果放一行,请在then前加“;”
例如:
#!/bin/sh
echo "Input file name:"
read NAME
if [ -d "$NAME" ]; then
echo "Dir"
else
echo "Not Dir"
fi
- case条件语句
case 条件测试命令串 in
表达式1)
分支1执行的命令
;;
表达式2)
分支2执行的命令
;;
*)
其他命令
;;
esac
例如:
#!/bin/sh
echo "Input file name:"
read NAME
# 获取文件信息
ft=$(file "$NAME")
# 判断文件类型
case "$ft" in
"$NAME: ASCII"*)
echo "$NAME is ASCII text"
;;
"$NAME: directory"*)
echo "$NAME is DIRECTORY"
;;
*)
echo "$NAME is OTHER FILE TYPE"
;;
esac
注:本文件第四行第四个字符为~上的那个点,不是单引号!
- for循环语句
for 变量名 in 数值列表
do
# 循环执行的命令串
# 使用 $变量名 来引用当前的值
echo "当前值是: $变量名"
done
例如:
#!/bin/sh
for var in $(ls)
do
echo "$var"
done
- while循环语句
while [ 条件判断 ]
do
# 循环执行的命令串
# 注意:这里通常需要有改变条件的命令,否则会死循环
done
例如:
#!/bin/sh
VAR=1
while [ $VAR -le 9 ]
do
RESULT=$(expr $VAR \* $VAR)
echo "$VAR*$VAR=$RESULT"
VAR=$(expr $VAR + 1)
done
- until 循环语句
until [ 条件判断 ]
do
# 循环执行的命令串
# 注意:这里通常需要有改变条件的命令,否则会变成死循环
done
例如:
#!/bin/sh
VAR=1
until [ $VAR -gt 9 ]
do
RESULT=$(expr $VAR \* $VAR)
echo "$VAR*$VAR=$RESULT"
VAR=$(expr $VAR + 1)
done
- 函数
函数名() {
# 命令串
# 这里写具体的逻辑代码
echo "正在执行函数..."
}
例如:
#!/bin/sh
# 定义函数
power() {
VAR=1
# 循环直到 VAR 大于 9
until [ $VAR -gt 9 ]
do
# 修复了反引号转义问题,并转义了乘号 *
RESULT=$(expr $VAR \* $VAR)
echo "$VAR*$VAR=$RESULT"
VAR=$(expr $VAR + 1)
done
}
# 主程序
echo "Power:"
power # 调用函数
这是一个无参函数,下面我们看看有参函数
#!/bin/sh
sum() {
SUM1=0
# 当参数个数不为0时循环
while [ $# -ne 0 ]
do
# 修正了变量赋值和 expr 语法
SUM1=$(expr $SUM1 + $1)
# 参数左移,处理下一个参数
shift
done
echo "SUM: $SUM1"
}
echo "Please input some numbers:"
read NUM
sum $NUM
这是一个求和函数,保存为sum,这样我们可以执行sum 1 2 3 3 4 5,expr 为计算的意思,shift为移位,也就是把我们输入的1 2 3 4 5,依次变为第一个带入到本程序的第七行的“$1”
三、调试Shell程序
因为Shell都是通过vim编写,并没有像写Java那样的IDE,所以调试错误就很重要了,因为Shell的关键字都是小写,所以我们把一般变量都大写,这些都是一般错误,但有时候一个复杂的程序,我们怎么debug呢?这就需要我们调试跟踪,调试跟踪有两个参数:
- -v选项
- -x选项
例如:我们可以 /bin/sh -v 程序名或者 /bin/sh -x 程序名,这个比较简单就不多说了,感兴趣的可以自己试一下。