linuxShell脚本

Shell 脚本

6/16/2016 10:12:05 AM

类似与windows下批处理,shell 命令的有序集合

  1. 建立.sh文件(方便识别和系统颜色自动显示)
  2. 赋予执行权限
chmod +x filename.sh
  1. 执行,搞定。
./finame.sh

格式要求

  1. 开头
#!/bin/bash     告诉OS用何种类型的shell解释
  1. 注释 #
  2. 变量
    1. 用户变量 小写/c++命名规则
    2. 位置变量(命令行参数
$0第一个命令行参数(即脚本文件名)

$n第n个命令参数(包括脚本文件名哦)类似于c语言中的argv[n]
//没完! 这里的n=0....9
当n超过9,是 *两位数时,需要将10放在一个整体中处理**${10}${99}
如果不这样,$10,系统将解释为$1+"0"来处理 预定义变量


$#	命令行参数个数-argc(不含$0$@	所有命令参数-char* argv--独立性(不含$0)“$1,$2...,$9$*$@上,整体性(不含$0)“$1,$2...,$9$? 上一个命令的退出状态,可以接收函数的返回值
$$    正在执行的PID
4.  环境变量
    1.  HOME---/etc/passwd中列出的用户主目录
    2.  IFS Internal Fidld Separator:   空格,TAB,换行符
    3.  PATH---shell搜索路径
    4.  PS1 ----默认用户提示符$ #
    5.  PS2 ----换行提示符 >
    5.  TERM---终端类型xterm
  1. 新特性

    1. 不支持数据类型
    2. 所有变量当成字符串解释,如果带有空格,用双引号“ ”
    3. 命名规则同c++
    4. 赋值符号两边无空格
    5. 取变量$varname
    6. 当需要将变量名和其他字符放在一起,用{}加以区分

      num=2
      echo "this is the ${num}nd"	//而不是$numnd

清除变量的赋值

unset varname

将命令输出作为变量值 “ 反撇号

ls `echo $HOME`    //列出HOME环境变量(用户家目录)文件

echo时,最好将提示信息用“ ”包含起来,虽然不包含也可,但是不好看!

常用功能性语句
1. read

stdin读入一行,并复制给后面的变量**

    read var    //读入数据全部复制给var
    read v1 v2 v3   //读入的数据按序输入给v1,v2,v3
    read v1,v2  //如果输入超过var数量,最后一个变量是多余的所有
    read v1,v2  //如果只输入一个参数,则第二个为空

    read -p "Hints..." v1   //提示语
    read -s v1  //不显示输入的信息

expr
算数运算命令,用于简单的整数运算

    \\* 乘法

expr 12 + 3 \* 5        //12+3*5注意,这里每个操作数后有空格

重要的事情说2遍: **每个操作数或者操作符后有空格!**

重要的事情说2遍: **每个操作数或者操作符后有空格!**   

重要的事情说2遍: **每个操作数或者操作符后有空格!**

test

测试,可作为判断条件

三种对象:条件满足,返回0
1.字符串

test "$var" = "string" //判断变量var中的值是否等于string
=   等于
!=  不等于
-z  长度为0

2.整数

test $var -eq 19   //判断var是否等于19,
-eq 等于
-ne 不等于
-gt >
-ge >=
-lt <
-le <=

3.文件

test [options] name
options:
-d  name是否为目录
-e  存在?
-f  普通文件
-L  符号链接
-r/w/x  是否可读/可写/可执行?
-s  是否存在且长度不为0
----------------------------
test f1 nt f2   //f1 newer to f2?
test f1 ot f2   // older

4.结构控制语句

**if...then...fi**
if [ express1 ]     
then
    command1
fi

这里条件判断可以不用test express1 , 直接使用[],这样更人性化

需要注意的是,中括号与express1之间左右都必须有空格

如果有多个条件每个条件都用[],再用逻辑符号连接

if…then…else…fi同理。

# File Name: file.sh
# Author: Michael Jay
# mail: [email protected]
# Created Time: Thu 16 Jun 2016 03:07:07 PM CST
# Function: check a filename is a dir or a file; 
#               if dir--open it;
#               if file -- show it
############################################################
#!/bin/bash

read -p "input the name :" name
if [ -d $HOME/$name ]
then
    echo "$name is a dir, which content:"
    ls --color=auto  $HOME/$name
    exit
else
    if [ -f  $name ]
    then
        echo "$name is a ordinary file:"
        cat ./$name
    else
        echo "$name is nothing..."
    fi
fi

2. 多路分支 case…esac

case 字符串变量 in
mode1)
    command1
    ;;
mode2)
    command2
    ;;
mode*)
    commandn
    ;;
esca

注意:case只能给检测字符串变量


3. 循环语句

1.循环次数确定

for 变量名 in 单词表  
do
    cmd
done

变量var依次从单词表中作为它的值循环次数=单词个数

如果,单词表是所有的命令行参数,可以省略 in 单词表

for varname
do
    cmds
done

2.循环次数不确定

while cmd/expres
do
    cmds
done

首先,执行while后的命令或者表达式,如果值为真,则执行循环体cmds,直到为假。

4.循环控制

1.break

`break n        #跳出n层循环,这跟c语言不`同

2.continue

continue    #结束本轮循环,重新开始新的一轮本
continue n  #结束本循环,并转到最近n层循环的下一轮循环

5. shell 函数

1. 调用前必须定义。
定义:

fun()       #括号内不能添加参数,与c不同
{
    cmds
}

或者

function fun() 
#shell中传参直接使用命令行参数,如 "fun argument1 argument2"
{
    cmds
}

同时,在函数内部使用参数时,使用2这种预定义变量使用。

函数返回值的使用,可以使用:

var=`fun [arg1 arg2]`   ##反撇号
fun arg1 arg2           ## $?
echo $?

你可能感兴趣的:(linux基础,shell脚本)