shell 是 C 语言编写的程序,是用户使用 Linux 的桥梁。既是一种命令语言,又是一种程序设计语言。shell 脚本是为 shell 编写的脚本程序。现在我们说的 shell 已经通常是指 shell 脚本了。
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 支持人物控制,可以在命令行上挂起,后台执行,唤醒或终止程序。
echo "Hello World !"
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。 chmod +x file 给脚本加上执行权限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 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
参数处理说明$#传递到脚本的参数个数$*以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。$$脚本运行的当前进程ID号$!后台运行的最后一个进程的ID号$@与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。$-显示Shell使用的当前选项,与set命令功能相同。$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。显示普通字符串 echo "hello"
显示转义字符 echo "\"hello\""
显示变量 echo "$name, hello"
显示换行 echo -e "hello \n" #-e 表示开启转义
显示不换行 echo -e "hello \c"
显示结果定向至文件 echo "hello" >> file
原样输出,不进行转义和取变量 echo '$name\"' #用单引号
显示命令执行结果 echo `date` #用反引号
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
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 ;; esacbreak continue
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255。3、函数返回值在调用该函数后通过 $? 来获得。4、所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。5、调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
. filename 或 source filename
被包含的文件不需要可执行权限。
输出重定向command > file输出重定向会覆盖文件内容,如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾command >> file输入重定向command < file这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
which which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。
