日期:2014-05-16  浏览次数:20560 次

Linux Shell常用技巧(一)

本文转自 http://www.cnblogs.com/stephen-liu74/archive/2011/11/10/2240461.html

?

一.?? ?特殊文件: /dev/null和/dev/tty

?? ?Linux系统提供了两个对Shell编程非常有用的特殊文件,/dev/null和/dev/tty。其中/dev/null将会丢掉所有写入它的数 据,换句换说,当程序将数据写入到此文件时,会认为它已经成功完成写入数据的操作,但实际上什么事都没有做。如果你需要的是命令的退出状态,而非它的输 出,此功能会非常有用,见如下Shell代码:
?? ?/> vi test_dev_null.sh
?? ?
?? ?#!/bin/bash
?? ?if grep hello TestFile > /dev/null
?? ?then
?? ???? echo "Found"
?? ?else
?? ???? echo "NOT Found"
?? ?fi
?? ?在vi中保存并退出后执行以下命令:
?? ?/> chmod +x test_dev_null.sh? #使该文件成为可执行文件
?? ?/> cat > TestFile
?? ?hello my friend
?? ?CTRL + D???????????????????????????? #退出命令行文件编辑状态
?? ?/> ./test_dev_null.sh
?? ?Found???????????????????????????????? #这里并没有输出grep命令的执行结果。
?? ?将以上Shell脚本做如下修改:
?? ?/> vi test_dev_null.sh
?? ?
?? ?#!/bin/bash
?? ?if grep hello TestFile
?? ?then
?? ???? echo "Found"
?? ?else
?? ???? echo "NOT Found"
?? ?fi
?? ?在vi中保存退出后,再次执行该脚本:
?? ?/> ./test_dev_null.sh
?? ?hello my friend????????????????????? #grep命令的执行结果被输出了。
?? ?Found
?? ?
?? ?下面我们再来看/dev/tty的用途。当程序打开此文件是,Linux会自动将它重定向到一个终端窗口,因此该文件对于读取人工输入时特别有用。见如下Shell代码:
?? ?/> vi test_dev_tty.sh
?? ?
??? #!/bin/bash
?? ?printf "Enter new password: "?? ?#提示输入
?? ?stty -echo?? ??? ??? ??? ??? ??? ??????? #关闭自动打印输入字符的功能
?? ?read password < /dev/tty?? ??? ? #读取密码
?? ?printf "\nEnter again: "?? ??? ????? #换行后提示再输入一次
?? ?read password2 < /dev/tty?? ??? #再读取一次以确认
?? ?printf "\n"?? ??? ??? ??? ??? ??? ??????? #换行
?? ?stty echo?? ??? ??? ??? ??? ??? ???????? #记着打开自动打印输入字符的功能
?? ?echo "Password = " $password #输出读入变量
?? ?echo "Password2 = " $password2
?? ?echo "All Done"

??? 在vi中保存并退出后执行以下命令:
?? ?/> chmod +x test_dev_tty.sh #使该文件成为可执行文件
?? ?/> ./test_dev_tty
?? ?Enter new password:???????????? #这里密码的输入被读入到脚本中的password变量
?? ?Enter again:????????????????????????? #这里密码的输入被读入到脚本中的password2变量
?? ?Password = hello
?? ?Password2 = hello
?? ?All Done

二.?? ?简单的命令跟踪:

?? ?Linux Shell提供了两种方式来跟踪Shell脚本中的命令,以帮助我们准确的定位程序中存在的问题。下面的代码为第一种方式,该方式会将Shell脚本中所有被执行的命令打印到终端,并在命令前加"+":加号的后面还跟着一个空格。
?? ?/> cat > trace_all_command.sh
?? ?who | wc -l????????????????????????? #这两条Shell命令将输出当前Linux服务器登录的用户数量
?? ?CTRL + D??????????????????????????? #退出命令行文件编辑状态
?? ?/> chmod +x trace_all_command.sh
?? ?/> sh -x ./trace_all_command.sh #Shell执行器的-x选项将打开脚本的执行跟踪功能。
?? ?+ wc -l?????????????????????????????? #被跟踪的两条Shell命令
?? ?+ who
?? ?2?????????????????????????????????????? #实际输出结果。
?? ?Linux Shell提供的另一种方式可以只打印部分被执行的Shell命令,该方法在调试较为复杂的脚本时,显得尤为有用。
?? ?/> cat > trace_patial_command.sh
?? ?#! /bin/bash
?? ?set -x??????????????????????????????? #从该命令之后打开跟踪功能
?? ?echo 1st echo???????????????????? #将被打印输出的Shell命令
?? ?set +x?????????????????????????????? #该Shell命令也将被打印输出,然而在该命令被执行之后,所有的命令将不再打印输出
??? echo 2nd echo???????