写给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
推荐阅读: