写给Linux Shell编程初学者


1 首先说下shell对于*nix(unix/linux的统称)系统的作用

在*nix系统启动最后阶段将调用一个非交互的shell程序,然后在shell程序里启用图形客户端程序,如果选择不启用图形客户端,则在系统启动最后阶段将调用一个

交互的shell程序。

2 解释下交互shell与非交互shell区别

交互shell又包括登陆shell与非登陆shell,登陆shell指的是以bash --login(以下所有shell程序都以bash为例)方式启动的,比如我们常用的ssh方式启动的shell就是此

种方式(如果我们默认以csh启动,在比如.cshrc配置文件的最后又以bash方式启动,这就是非登陆shell,或以bash --login方式启动,这却是登陆shell方式)。

非交互shell指的是以shell脚本形式启动。

讲清楚以上的问题主要是为了说明,登陆shell默认配置文件是.bash_profile .bash_logout等,非登陆shell默认配置文件是.bashrc。非交互shell没有默认配置文件。

3 简单说明下不同shell程序的区别

主要目的是为了说明不同的shell可能存在的区别,比如hp unix默认shell是csh,Ubuntu linux默认shell是bash。这两种shell在编写脚本方式上是有区别的。

比如:csh有setenv命令,而bash有export命令,csh没有for,但有foreach,csh管道可以这样写|&,csh if 这样写if ($update_flag) then ...,而bash是这样写的if [ $update_flag -eq 1 ];then ...。

讲清楚以上的问题主要是为了说明,在实际编写shell程序时首先要确定是为哪种shell解释器写的,因为不同shell解释器shell程序写法是有区别的。

4 开始基础说下shell程序的知识了

4.1 首行写法,有三种,第一种是#!/bin/bash,第二种是#!/usr/bin/env bash 这种写法主要是由*nux系统自带的env程序来定位bash程序的位置,这样利于shell程序移

植。第三种是不以#!开头的,则以当前用户默认登陆shell来执行此shell脚本。

4.2 会用if for while until case 函数等。

4.3 理解pwd及dirname对于shell编写的重要性,其中dirname对于相对路径运行shell作用很大。

4.4 理解使用*nix系统重要的工具命令的用法,如grep du df find expr let set sed awk等,以下举例说明:

比如计算当前目录的使用硬盘空间:

du -b --max-depth=0

统计代码行:

var=`find . -name "*.cpp" -o -name "*.h"`;for i in $var;do wc -l $i|sort -rn|awk '{if ( $1 > 5000 ) {print $0}}';done

取错误日志部分前后20行

var=`grep -in "error" build.log|awk -F: '{print $1}'`;for i in $var;do head -n `expr $i + 10` build.log|tail -n 20;done

4.5 要理解*nix系统很多命令用法都是带有pattern及action的。

比如awk命令 awk '$1>100'这个只有pattern

awk '{print $1}' 这个只有action

awk '$1>100 {print $1}' 这个有pattern 和 action

如如find命令 find . -ls 这个有pattern 及 action,默认action 为-print

推荐阅读:

Linux/Unix shell 脚本中调用SQL,RMAN脚本

Linux/Unix shell sql 之间传递变量

Linux命令之sleep - 延迟指定时间

Linux下Shell编程——sed命令基本用法

Linux下Shell编程——grep命令的基本运用

相关内容