Shell脚本编程

引言:Shell是一个用C语言编写的程序,通过Shell用户可以访问操作系统内核服务,类似于DOS下的command和后来的cmd.exe。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量、参数、函数、流程控制等等。它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。

一、Shell变量

1. 命名规则:

  • 注意变量名与等号之间不可以有空格,其他命名规范同C语言

  • 赋值示例:a=1

2. 使用变量:

  • 以输出为例: echo ${variable}

3. 定义只读变量:

name="Lee"
readonly name

4. 删除变量:unset variable

5. 字符串变量:

  • 字符串变量用单双引号甚至不用引号都可以被定义

  • 单引号内使用变量或转义单引号都是无效的

  • 双引号内可以使用变量和转义字符

  • 获取字串长度:例如echo ${#variable}

  • 截取子串:echo ${variable:x:y}从位置x(0起算)开始,截取y个字符

  • 定义数组:arr=(v1 v2 v3 ...),用空格隔开即可

  • 获取数组的所有元素:echo ${arr[@]}

  • 单行注释:#

  • 多行注释:

    :<<EOF
        .......
    EOF
    

二、参数传递

  1. Shell的参数传递类似C语言中的 int main(int argc, char **argv)

  2. 取参数(不仅对main有效,实际上对自定义函数也是一样的用法):

    • $0:取得第0个参数,表示执行的文件名

    • $1:取得第1个参数

三、运算符

1. 逻辑运算:

  • 关系运算符:

    • -eq:相等
    • -ne:不等
    • -gt:>
    • -lt:<
    • -ge:>=
    • -le:<=
  • 布尔运算符:

    • !:非运算
    • -o:或运算
    • -a:与运算
  • 逻辑运算符:

    • &&
    • ||

2. 算术运算:

注意非Mac系统中,若使用expr计算命令,则乘号(*)前面必须加反斜杠()才能完成乘法运算

小记:Shell算术运算的几种实现方式

  • 使用let命令进行算术运算,只支持整数运算,如let a=5/2
  • 使用expr命令进行算术运算,只支持整数运算,如expr 2 \* 5
  • 使用运算语法:$[算术表达式],只支持整数运算,如$[2+3]
  • 使用运算语法:$((算术表达式)),只支持整数运算,如$((2*5))
  • 使用bc命令进行算术运算,支持小数运算,如"scale=3; 22/3" | bc

4. 字符串运算:

  • =:检测两个字符串是否相等
  • !=:检测两个字符串不相等
  • -z:检测字符串长度是否为0
  • -n:检测字符串长度不为0
  • $:检测字符串是否位=为空

小记:[]与 [[ ]] 在逻辑判别使用上的区别

  • 在使用"[[ ]]“时,不能使用”-a"或者"-o"对多个条件进行连接。

  • 在使用"[ ]“时,如果使用”-a"或者"-o"对多个条件进行连接,"-a"或者"-o"必须被包含在"[ ]"之内。

  • 在使用"[ ]“时,如果使用”&&“或者”||“对多个条件进行连接,”&&“或者”||“必须在”[ ]"之外。

小记:逻辑比较的一些细节

  • 字符串(ASCII)比较必须使用>,<,==,!=

  • 数字比较建议使用-gt,-lt-,eq这类,>也可以(后种方式在单中括号中需要使用转义字符"")

四、I/O

  1. 标准读入:read x

  2. 标准输出:echo x(强制换行,可添加’\c’取消换行)

  3. 开启转义:echo -e ...

  4. 显示命令执行结果:echo `date`

  5. printf的用法基本同C语言

五、流程控制

1. if分支:

# 示例
a=$1
b=$2
if [ $a == $b ]
then
    echo 'a=b'
elif [ $a -lt $b ]
then 
    echo 'a
else
    echo 'a>b'
fi

2. for循环

# 示例
arr=(
    beijing
    shanghai
    shenzhen
    guangzhou
)
for item in ${arr[@]}
do
    echo ${item}
done

3. while循环

arr=(
    beijing
    shanghai
    shenzhen
    guangzhou
)
i=0
while [ $i -lt 4 ]
do
    echo ${arr[i]}
    let "i++"
done

4. until循环

  • 工作原理恰好与while相反,while是条件为真驯悍,until是条件为假循环

5. case分支结构

echo '输入1~4的选项'
read op
case $op in
    1) echo 'first'
    ;;
    2) echo 'second'
    ;;
    3) echo 'third'
    ;;
    4) echo 'forth'
    ;;
    *) echo 'none'
    ;;
esac

6. break和continue

七、函数

fun(){
    echo 'input a'
    read a
    echo 'input b'
    read b
    return $[a+b]
}
fun # 注意此处不需要再打括号
echo "sum is $?" # 用$? 来取得返回值

八、引用外部文件

引用的文件使用格式:. filename

# 外引文件a.sh
v='abc'

# 执行文件b.sh
. ./a.sh
echo ${v} # 输出abc

你可能感兴趣的:(计算机系统级知识)