一、Shell入门

我们先看一个小例子,永恒的经典:Hello World

#!/bin/sh  
var="Hello World!"  
echo $var

保存,文件名为:hello
我们发现文件的第一行虽是一个注释,但是说明了文件的执行是由/bin/sh来执行,所以我们这么来执行这个文件:

/bin/sh hello

就可以看到结果了,但我们知道在Linux下,一个文件是否可以执行是由文件属性来决定的,那么我们是否可以给他加上可执行权限,来执行这个文件呢?
先执行如下命令:

chmod u+x hello

然后我们在直接敲命令:hello,看到什么现象?
所以一个文件被执行有这两个途径

二、Shell语法入门

  1. 输入/输出内部命令

①. echo 输出命令
②. read 输入命令

例如:

#!/bin/sh  
echo Name:  
read NAME  
echo Phone:  
read PHONE  
echo SNAME,SPHONE > contact.txt
  1. 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
  1. 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

注:本文件第四行第四个字符为~上的那个点,不是单引号!

  1. for循环语句
for 变量名 in 数值列表
do
    # 循环执行的命令串
    # 使用 $变量名 来引用当前的值
    echo "当前值是: $变量名"
done

例如:

#!/bin/sh

for var in $(ls)
do
    echo "$var"
done
  1. 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
  1. 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
  1. 函数
函数名() {
    # 命令串
    # 这里写具体的逻辑代码
    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呢?这就需要我们调试跟踪,调试跟踪有两个参数:

  1. -v选项
  2. -x选项

例如:我们可以 /bin/sh -v 程序名或者 /bin/sh -x 程序名,这个比较简单就不多说了,感兴趣的可以自己试一下。