Shell脚本编程基础

一、脚本语言跟编译型语言的区别

    1、脚本语言

        不需编译,由解释器解释执行;

         弱类型:变量类型;

         变量通常不需要实现声明;

    2、编译型语言

        事先编译(源程序-->目标代码-->链接-->执行);运行时不再依赖于编译器;

        强类型;

        变量需要事先声明;

二、变量类型

    1、本地变量

set VAR_NAME=value #定义变量
unset VAR_NAME #取消变量
${VAR_NAME} #引用变量

    作用范围:当前shell进程

    2、局部变量  

local VAR_NAME=value #定义变量
unset VAR_NAME #取消变量
${VAR_NAME} #引用变量

    作用范围:当前shell进程局部有效

    3、环境变量 

export VAR_NAME=value
unset VAR_NAME
${VAR_NAME}

    作用范围:当前shell进程及其子shell进程

    4、位置变量:$1,$2,$3...

    5、特殊变量:$$,$?,$#,$@...

三、Bash Shell脚本    

# bash /path/to/script_file.sh

   1、 独立执行:

        要有执行权限;

        定义好shebang, 即脚本的第一行:#!/path/to/explainer

例如:#!/bin/bash “#”只有脚本第一行的“#”有特殊意义外,其他行的都为注释行运行脚本时不执行。

    2、bash的配置文件

        profile类:/etc/profile, /etc/profile.d/*.sh, ~/.bash_profile
           声明环境变量
            执行程序或脚本   

       bashrc类:/etc/bashrc, ~/.bashrc
           定义本地变量
           定义命令别名  

    3、变量命名规则

        只能包含字母数字和下划线

        不能以数字开头

        严格区分大小写

        要做到见名知意

        命名规范,风格统一

        不能跟系统变量重名

    4、控制语句

        for

        while

        until

四、for循环

    事先提供一个元素列表,而后,使用变量去遍历此元元素列表;每访问一个元素,就执行一次循环体;直到元素访问完毕。

    1、用法格式:

for VAR_NAME in 元素1 元素2 ...; do
语句1;
语句2;
...
done

    2、 脚本写完在执行前测试有没有语法错误,就以test.sh为例

bash -n test.sh  #测试脚本有没语法错误
chmod +x test.sh  #给脚本执行权限
./test.sh  #执行测试
bash -x test.sh #执行时显示执行过程

 

   3、添加user1,user2,user3三个用户,并配置与用户名相同的秘密

#!/bin/bash
#
for UserName in user1 user2 user3; do
useradd $UserName
echo $UserName | passwd --stdin $UserName
done

    4、 写一个脚本,显示/etc/inittab, /etc/rc.d/rc.sysinit, /etc/fstab三个文件各有多少行

for FileName in /etc/inittab /etc/rc.d/rc.sysinit /etc/fstab; do
wc -l $FileName
done

    5、使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数和空白行数

#!/bin/bash
for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do
echo "$File:"
echo -e "\t#lines: `grep "^#" $File | wc -l`"
echo -e "\tspace lines: `grep "^$" $File | wc -l`"
done

    6、使用for循环,复制/etc/fstab、/etc/inittab和/etc/rc.d/init.d/functions文件至/tmp/目录中,并重命名为原有的名称之后加当前日期,如第一个文件为/tmp/fstab-2013-07-15

#!/bin/bash
for File in /etc/fstab /etc/inittab /etc/rc.d/init.d/functions; do
cp $File /tmp/$File-`date +%F`
done

    7、生成数字序列

    {}:{起始数字..结束数据},例如{1..100}表示从1到100之间的所有正整数;    
    `seq [起始数字] [步长] 结束数字`  

    8、使用for循环取出每个用户用户名和Shell

#!/bin/bash
LINES=`wc -l /etc/passwd | cut -d' ' -f1` #看清楚这里用的是反引号!
for I in `seq 1 $LINES`; do
head -$I /etc/passwd | tail -1 | cut -d: -f1,7
done

    9、写一个脚本,计算100以内所有整数的和

#!/bin/bash
#
Sum=0
for I in {1..100}; do  #这里使用的就是数字序列
Sum=$[$Sum+$I]
done
echo "The sum is: $Sum."

    10、写一个脚本,计算100以内,所有偶数的和,以及所有奇数的和 

#!/bin/bash
EvenSum=0
OddSum=0
for I in `seq 1 2 100`; do
OddSum=$[$OddSum+$I]
done
for I in `seq 2 2 100`; do
EvenSum=$[$EvenSum+$I]
done
echo "Even Sum: $EvenSum; Odd Sum: $OddSum."

 

你可能感兴趣的:(shell,for)