回 帖 发 新 帖 刷新版面

主题:总结网络工程师学习笔记

当然shell编程中的问题还有很多,这只是我在学校[url=http://www.gobenet.net.cn]网络工程师[/url] 期间的一些笔记
Linux命令和Shell 编程中常见问题小结 
来源:Taobao QA Team
        学习linux命令和shell的脚本有一段时间了,想和大家分享在学习过程中一些常见问题。这里记录我在使用linux命令和shell编程中碰到的一些常见的问题和解决方法,这里只是记录了一下工作涂鸦,学习涂鸦,不是详细的教程,可能会有需要商榷的地方,请大家不吝赐教。

1. 是否可以将参数一次只传递一个给shell 脚本?

       for arg  in “$@”

       do

       list

      done

   变量arg会被一次赋予每个参数的值,接下来的命令组list将接收每个参数而执行,下面这个函数说明了for循环的用法:

         echoargs() {

        for  arg in “$@”

        do

            echo  $arg

        done

        return 0

       }

 2. 如何在命令中使用shell 的变量的值?

        要在命令中使用shell变量,最简单的方法就是将命令包含在双引号(“”)中而不是单引号(‘’)中,这是因为shell会在双引号引起来的字符串中进行变量替换,shell回在执行命令对指定的变量值进行替换

            如:  sed  “ /$DEL/d”  file1>file2

  3. 如何检查一个变量是否包含值?

       有好几种方法可以用来进行这种判断。最简单的一种就是使用if语句:

         if [ -z “$VAR” ] ; then

       list;

        fi

      VAR是变量的名称,list是如果VAR不包含值是需要执行的命令的序列。通常list会将VAR初始化为某个值。

4. 后台命令运行时的输出

        在后台运行作业时要小心:需要用户交互的命令通常不要放在后台执行,因为这样系统就会在那里处于等待的状态. 不过,作业在后台运行一样会将结果输出到屏幕上。如果放在后台运行的作业会产生大量的输出,最好的方法把它的输出重定向到某个文件中:

         command >out.file 2>&1 &

       在上面的例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。

5.   let “iLoop=$iLoop – 1″ 和 iLoop=$iLoop – 1 的区别

              iloop=$iloop-1   意味着 iloop 是一个字符串

              let iloop=$iloop+/-num 强制iloop为数字

         系统默认“+”是作为字符串处理的,因此它不会被作为一个操作符,而只是被识别为一个普通的字符串。

       [yutong@tfs004001 ~]$ d=111

      [yutong@tfs004001 ~]$ echo $d+1

      111+1

      [yutong@tfs004001 ~]$ let d=$d+1; echo $d

      112

      [yutong@tfs004001 ~]$ a=1

      [yutong@tfs004001 ~]$ a=`expr $a + 1`

       [yutong@tfs004001 ~]$ echo $a

      2

     这是另外一种数字计算的方式,不过let命令会更好用;如:a=$d +2  echo $a 是不可以直接运算的,这样系统会认为是字符串的拼接,从而将$d的内容和“+2”的字符串拼接在一起。

6. 远程或程序调用TOP命令时,如何获取数据?

       通过其他程序或脚本在非交互式模式下调用top命令,会提示:   top: failed tty get  的错误。解决办法:加个-b 选项即可

         ssh -o ConnectTimeOut=1 yutong@10.232.4.1  “top -b -n 1 | grep event “| awk ‘{print $10}’

       top的默认是要进交互模式的,但ssh远程执行方式其实是不可能给它一个控制台的,所以它就获得tty失败,用“-b” 参数它就不用等待了,直接打印结果就可以了。

7. 以普通用户身份打开的vim ,修改后以root身份保存

      这个题目读起来比较纠结,其实是很常见的,常常忘记了sudo就直接用vim编辑/etc内的文件,(不过也不一定,vim发现保存的文件无法保存时候会提示)等编辑好了,保存文件时系统会提示没有权限。曲线方法是先保存为临时文件,退出后再sudo cp回去。不过在vim中可以直接完成,命令如下:

     :w !sudo tee %

    所以执行这个命令,就相当于在vim外部修改了当前正在编辑文件的权限。

8. 清空或创建一个文件

       > file.txt

       “>” 符号在shell里面是标准输出重定向,即把(前部个命令的)命令行输出转往一个文件内,但这里没有”前部命令”,输出为空,于是就覆盖(或创建)成一个空文件了。有些脚本的写法是:>file.txt,因为:是bash默认存在的空函数。单纯创建文件也可以用$touch file.txt,touch本来是用作修改文件的时间戳的命令,但如果文件不存在,就自动创建了。

9. 显示当前目录中所有子目录的大小

      du -h –max-depth=1

      –max-depth=1 参数可以让 du 命令显示当前目录下 1 级子目录的统计信息,当然你也可以把 1 改为 2 ,进一步显示 2 级子目录的统计信息,可以灵活运用。而 -h 参数则是以 Mb 、G 这样的单位来显示大小。

10. 清空屏幕

       <CTRL+l>;

      这个方式跟之前介绍的reset命令重置终端的作用有些类似,其实都只是发送一段控制序列,让终端的显示复位。

       也可以这样运行:

       tput clear

       tput是专门用来控制终端的工具,也是个很有用的工具。
   大家有更好的那就分享学习一下[url=http://www.gobenet.net.cn[/url]

回复列表 (共1个回复)

沙发

不错,谢谢分享

我来回复

您尚未登录,请登录后再回复。点此登录或注册