Shell 编程

shell 简介

shell 是 C 语言编写的程序,是用户使用 Linux 的桥梁。既是一种命令语言,又是一种程序设计语言。shell 脚本是为 shell 编写的脚本程序。现在我们说的 shell 已经通常是指 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)

Shell for Root(/sbin/sh)

我们主要关注 Bourne Again Shell(/bin/bash),即通常所说的 bash。

sh(全称 Bourne Shell): 是UNIX最初使用的 shell,而且在每种 UNIX 上都可以使用。Bourne Shell 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种 shell。

bash(全称 Bourne Again Shell): LinuxOS 默认的,它是 Bourne Shell 的扩展。与 Bourne Shell 完全兼容,并且在 Bourne Shell 的基础上增加了很多特性。可以提供命令补全,命令编辑和命令历史等功能。它还包含了很多 C Shell 和 Korn Shell 中的优点,有灵活和强大的编辑接口,同时又很友好的用户界面。

csh(全称 C Shell): 是一种比 Bourne Shell更适合的变种 Shell,它的语法与 C 语言很相似。

Tcsh: 是 Linux 提供的 C Shell 的一个扩展版本。Tcsh 包括命令行编辑,可编程单词补全,拼写校正,历史命令替换,作业控制和类似 C 语言的语法,他不仅和 Bash Shell 提示符兼容,而且还提供比 Bash Shell 更多的提示符参数。

ksh (全称 Korn Shell): 集合了 C Shell 和 Bourne Shell 的优点并且和 Bourne Shell 完全兼容。

pdksh: 是 Linux 系统提供的 ksh 的扩展。pdksh 支持人物控制,可以在命令行上挂起,后台执行,唤醒或终止程序。


第一个 shell 脚本

#!/bin/bash

echo "Hello World !"

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
chmod +x file    给脚本加上执行权限


shell 变量

name="jay"

定义变量时不加 $ 符号,等号和变量之间不加空格。

name2=$name

使用一个定义过的变量,则要在变量名前面加美元符号。已经定义的变量,可以重新定义。

readonly name2

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

unset name

使用 unset 命令可以删除变量。被删除的变量不能再次被使用,unset 命令不能删除只读变量。

字符串    用单引号限制较多,一般用双引号,双引号里可以有变量,可以有转义字符。

name = "hello, \"${Jay} \"!"

获取字符串长度 ${#string}

提取子字符串    ${string:1:4}

查找字符串    `expr index "$string" is`

数组表示    array(a b c d)     使用@ 或 * 作为index可以获取数组中的所有元素


shell 传递参数

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

shell 运算符

shell echo

显示普通字符串    echo "hello"

显示转义字符       echo "\"hello\""

显示变量             echo "$name, hello"

显示换行             echo -e "hello \n"        #-e 表示开启转义

显示不换行          echo -e "hello \c"

显示结果定向至文件        echo "hello" >> file

原样输出,不进行转义和取变量    echo '$name\"'    #用单引号

显示命令执行结果            echo `date`    #用反引号


shell printf

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg

%s %c %d %f都是格式替代符

%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f 指格式化为小数,其中.2指保留2位小数。


shell test

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。常与 if 一起使用。

数值测试:

if test $[num1] -eq $[num2]

字符串测试:

if test $num1 = $num2

文件测试:

if test -e ./bash
参数说明
-e 文件名如果文件存在则为真
-r 文件名如果文件存在且可读则为真
-w 文件名如果文件存在且可写则为真
-x 文件名如果文件存在且可执行则为真
-s 文件名如果文件存在且至少有一个字符则为真
-d 文件名如果文件存在且为目录则为真
-f 文件名如果文件存在且为普通文件则为真
-c 文件名如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真


流程控制

sh 的流程控制不可为空,如果 else 分支没有语句执行,就不要写这个 else

if……then……fi

if……then……else……fi

if……then……elif……then……else……fi


for var in item item1……itemN 

do
……

done


while condition

do
    ……

done


until condition

do
    ……

done


case 值 in        #switch

模式1)
    command
    ;;
模式2)
    command
    ;;
esac


break    continue


shell 函数

1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255。
3、函数返回值在调用该函数后通过 $? 来获得。
4、所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
5、调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。


shell 文件包含

和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

. filename 或 source filename

被包含的文件不需要可执行权限。


shell 输入输出重定向

输出重定向
command > file
输出重定向会覆盖文件内容,如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾
command >> file

输入重定向
command < file
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。



其他指令

which    which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值