什么是 Shell?Shell 是一个作为用户与 Linux 系统间接口的程序,允许用户向操作系统输入需要执行的命令。
为什么要使用 Shell 编程?原因之一是可以快速、简单的完成编程。
Shell 执行 Shell 脚本,是在运行时解释执行的,让调试工作容易进行,因为调试时可以逐行的执行指令,节省了编译时间。
- 重定向输出,用操作符 > 即可:
$ ls -l > t.txt
上方命令会把 ls 命令的输出写入到文件 t.txt 中,如果没有该文件,会创建文件并写入;如果有该文件,则写入新内容,会覆盖原来所有内容。
如果想保留原内容,并把新内容写入原内容之后,可以用 >> 操作符。
注意:文件描述符 0 代表一个程序的标准输入,1 代表标准输出,2 代表标准错误输出。
为了在屏幕上不显示错误消息,可以把标准错误输出重定向到文件中;如果把标准输出和标准错误输出都重定向到文件中,那么屏幕上则不会有任何输出了。
只重定向标准错误输出到 error.txt 中:
$ ls -123 2> error.txt
把标准输出和标准错误输出重定向到不同的文件 normal.txt 和 error.txt 中:
$ ls -l > normal.txt 2> error.txt
把标准输出和标准错误输出重定向到同一个文件 error.txt 中:
$ ls -l > error.txt 2>&1
- 重定向输入,用操作符 < 即可:
$ more < error.txt
- 管道,用操作符 | 连接进程。
不使用管道操作符:
- $ ps > pout.txt
- $ sort pout.txt > psout.out
使用管道操作符:
$ ps | sort > psout.out
两种结果都是一样的。可见,使用一系列单独的命令都会生成临时文件,而用管道之后,没有临时文件的生成,相比来说,更精巧、简单、方便。
- Shell 基本语法:
一、变量:使用变量之前通常不需要为变量做出声明,通过直接使用它们来创建它们。要获取变量的值,必须在变量前加 $。如:
- $ a="yes"
- $ echo $a
- yes
可以使用 read 命令将用户的输入赋值给一个变量:
- $ read a
- books(键盘输入boos,回车)
- $ echo $a
- books
如果把 $变量表达式放入双引号中,程序执行到该处时,会替换成它的值;而如果放入单引号中,就不会发生替换。
- #!/bin/bash
- #文件名为:variable
- myv="langtuteng"
- echo $myv
- echo "$myv"
- echo '$myv'
- echo \$myv
- echo Please Enter some text:
- read myv
- echo '$myv' now equals $myv
- exit 0
执行该脚本:
- $ ./variable
- langtuteng
- langtuteng
- $myv
- $myv
- Please Enter some text:
- langlang
- $myv now equals langlang
二、条件:在实际工作中,大多数脚本程序都会广泛使用 shell 的布尔判断命令 [ 或 test。
- $ if [ -f /bin/bash ];then
- > echo "file /bin/bash exists"
- > fi
- file /bin/bash exists
- $ if test -d /bin/bash
- > then
- > echo "is a directory."
- > else
- > echo "is a file."
- > fi
- is a file.
三、控制结构:主要有 if 语句、elif 语句、for 语句、while 语句、until 语句、case 语句、命令列表、语句块。
四、函数:
可以通过 return 命令让函数返回数字值,让函数返回字符串值的常用方法是让函数将字符串保存在一个变量中,可以在函数结束之后使用该变量。
使用 local 关键字在函数中声明局部变量,将仅在函数的作用范围内有效。
五、命令:
break 命令:在控制条件未满足之前,跳出循环,默认跳出一层循环。
冒号(:)命令:是一个空命令,相当于 true 的一个别名。
continue 命令:跳到下一次循环继续执行。
点(.)命令:执行脚本时,调用该脚本程序的同一个 shell。
echo 命令:输出结尾带有换行符的字符串。
eval 命令:允许对参数进行求值。
exec 命令:将当前 shell 替换为一个不同的程序,也可以修改当前文件描述符。
exit n 命令:使脚本程序以退出码 n 结束运行。
export 命令:将作为它参数的变量导出到子 shell 中,并使之在子 shell 中有效。
expr 命令:将它的参数当做一个表达式来求值。
printf 命令:格式化输出,只有新版本的 shell 才提供该命令,用它来代替 echo 命令。
return 命令:使函数返回,如果没有指定该返回参数,则默认返回最后一条命令的退出码。
set 命令:为 shell 设置参数变量。
shift 命令:把所有参数变量左移一个位置,使 $2 变成 $1,$3 变成 $2,依次类推。原来 $1 的值将被丢弃,而 $0 仍将保持不变。
trap 命令:用于指定在接收到信号后将要采取的行动,一种常见的用途为在脚本程序被中断时完成清理工作。
unset 命令:从环境中删除变量或函数。该命令不能删除 shell 本身定义的只读变量。
总结:shell 本身就是一种功能强大的程序设计语言。它能够轻松调用其它程序并对它们的输出进行处理,这种能力使得 shell 成为完成文本和文件处理任务的一个理想工具。
说明:文章主要是阅读《Linux程序设计》中文第四版时的摘录笔记,如果想了解更多详细信息,请阅读原书第 2 章。