shell 是程序员经常需要用到的东西,特别是 bash 脚本。如果不知道什么是 shell 和 脚本语言,请参考:

简单来说, shell 是可以接受用户输入命令的程序,比如 Windows 下的命令行。

而脚本语言可以理解为不需要编译,直接解释运行的语言。

换行与注释

1. bash 在解析字符的时候,对待“;”跟看见回车是一样的 1. 注释符号为 “#”

设计哲学

一切皆表达式。

根据表达式的定义,任何表达式都必须有一个值。而 shell 在执行任何东西(不仅是命令)的时候都会有一个返回值。

  • 在 bash 编程中,返回值取值范围:0-255
  • 跟 C 语言含义相反, bash 中 0 为真(true),非 0 为假(false)
  • 使用关键字 $? 来查看上一个执行命令的返回值

实例:

bananapi@lemaker ~ $ ls
Home
bananapi@lemaker ~ $ echo $?
0
bananapi@lemaker ~ $ ls /don
ls: cannot access /don: No such file or directory
bananapi@lemaker ~ $ echo $?
2
bananapi@lemaker ~ $ don
-bash: don: command not found
bananapi@lemaker ~ $ echo $?
127
bananapi@lemaker ~ $ ls don|wc -l
ls: cannot access don: No such file or directory
0
bananapi@lemaker ~ $ echo $?
0

if 分支结构

组成一个语言的必要两种语法结构是分支结构和循环结构。作为一个编程语言, bash 也给我们提供了分支结构,其中最常用的就是 if

if list; then list; elif list; then list; ... else list; fi

if 语法中后面最常用的命令就是 [],也是 bash 新手容易写错的地方:

#正确的写法
if [ $ret -eq 0 ]
#错读的写法
if [$ret -eq 0]

#实际上 [] 是一个内建命令,等同于 test 命令
if test $ret -eq 0
$ type [
[ is a shell builtin
bananapi@lemaker ~ $ type test
test is a shell builtin

#所以上面的 if 语句也可以写成:
if test $ret -eq 0

while until 循环结构

语法结构:

while list-1; do list-2; done
until list-1; do list-2; done

while 实例:

#!/bin/bash

#注意变量声明时=号左右不能有空格!
count=0

while [ $count -le 100 ]
do
echo $count
#这里的 $[] 里面没有空格分隔,因为它并不是个 shell 命令,而是特殊字符,$[] 可以得到一个算数运算的值
count=$[$count+1]
done

until 实例:

#!/bin/bash

count=0

until ! [ $count -le 100 ]
do
    echo $count
    #这个运算只支持整数
    count=$[$count+1]
done

case 分支结构

casefor 它们所判断的不再是“表达式”是否为真,而是去匹配字符串。case 分支的语法结构:

case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac

实例:

#!/bin/bash

 case $1 in
     don|jerry)
     echo "hello $1!"
     ;;
     *)
     echo "get out!"
     ;;
esac

程序保存到文件 case.sh ,执行结果:

$ sh case.sh
get out!

$ sh case.sh don
hello don!

for 循环结构

暂无