shell脚本

1.Linux Shell脚本的字符串截取

假设有变量 var=http://www.linuxidc.com/test.htm


一 # 号截取,删除左边字符,保留右边字符。

echo ${var#*//}

其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符

即删除 http://

结果是 :www.linuxidc.com/test.htm


二 ## 号截取,删除左边字符,保留右边字符。

echo ${var##*/}

##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符

即删除 http://www.linuxidc.com/         

结果是 test.htm


举例:ACCOUNT=USER10  只想保留10

echo ${ACCOUNT##*[[:alpha:]]}  或者  echo ${ACCOUNT##*[a-z,A-Z]}

10


三 %号截取,删除右边字符,保留左边字符

echo ${var%/*}

%/* 表示从右边开始,删除第一个 / 号及右边的字符

结果是:http://www.linuxidc.com


四 %% 号截取,删除右边字符,保留左边字符


echo ${var%%/*}

%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符

结果是:http:


五 从左边第几个字符开始,及字符的个数

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。

结果是:http:


六 从左边第几个字符开始,一直到结束。

echo ${var:7}

其中的 7 表示左边第8个字符开始,一直到结束。

结果是 :www.linuxidc.com/test.htm


七 从右边第几个字符开始,及字符的个数

echo ${var:0-8:4}

其中的 0-8 表示右边算起第八个字符开始,4 表示字符的个数。

结果是:test


八 从右边第几个字符开始,一直到结束。

echo ${var:0-8}

表示从右边第八个字符开始,一直到结束。

结果是:test.htm  


.分支语句

1.if单分支

                               if  表达式;then

                                    语句

                               fi

1.1判断账号是否存在

vim f1.sh

#!/bin/bash

read -p "please input one user   "  ACCOUNT

if grep $ACCOUNT /etc/passwd &>/dev/null  ;then

   echo -e "\033[31m the user $ACCOUNT is exist\033[0m"

fi

       &代表所有的输出信息

测试:

[root@mail ~]#bash f1.sh

please input onuser   root

 the user root is exist

不存在就不输出:

[root@mail ~]#bash f1.sh

please input onuser   user100       

2.if双分支

                             

                              if  表达式;then

                                    语句

                              else

                                    语句

                              fi

#!/bin/bash

read -p "please input on user   " ACCOUNT

if grep $ACCOUNT /etc/passwd &>/dev/null  ;then

   echo -e "\033[31m the user $ACCOUNT is exist\033[0m"

else      

   echo -e "\033[31m the user $ACCOUNT is not exist\033[0m"

fi       


3.if多分枝

                             

                                   if  表达式1then

                                    语句1

                              elif   表达式2 then

                                    语句2

                              elif   表达式3then

                                    语句3

                                    。。。

                              fi

4.case

                              case $变量 in

                              变量值1

                               语句1;;

                               变量值2

                               语句2;;

                               变量值3

                               语句3;;

                               *)

                               语句n;;

                               esac

3截取文件第一个字符,判断是什么文件

[root@mail ~]#ll /root/f1.sh

-rw-r--r-- 1root root 227 Jul  6 19:47 /root/f1.sh

[root@mail ~]#STRING=`ll /root/f1.sh`

[root@mail ~]#echo $STRING

-rw-r--r-- 1root root 227 Jul 6 19:47 /root/f1.sh

[root@mail ~]# echo ${STRING:0:1}

-

赋值:

[root@mail ~]#FIRSTCHAR=${STRING:0:1}

[root@mail ~]#echo $FIRSTCHAR

-

[root@mail ~]#ll /root/abc //显示abc下内容

[root@mail ~]# ll -d /root/abc 显示abc目录

drwxr-xr-x. 5root root 4096 Apr  2 15:35 /root/abc

 

[root@mail ~]#ls  -l -d /root/abc

drwxr-xr-x. 5root root 4096 Apr  2 15:35 /root/abc

 

-l     use a long listing format

-d, --directory

 list directory entries instead of contents,and do not dereference symbolic links

 

#!/bin/bash

read -p "please input one dir   " DIR

read -p "please input one OBJ   " OBJ

if [ -e $DIR/$OBJ ] ; then

     STRING=`ls -l-d $DIR/$OBJ`

    FIRSTCHAR=${STRING:0:1}

     case$FIRSTCHAR in

     l)

       echo -e"\033[31m the $DIR/$OBJ  islink\033[0m"

       ;;

     d)

       echo -e"\033[31m the $DIR/$OBJ  isdirctory\033[0m"

  ;;

     b)

       echo -e"\033[31m the $DIR/$OBJ  isblock\033[0m"

;;

     c)

       echo -e"\033[31m the $DIR/$OBJ  ischar\033[0m"

;;

     -)

       echo -e"\033[31m the $DIR/$OBJ  isfile\033[0m"

;;

     *)

       echo"unknown"

;;

 

 

esac

 

 

else

   echo -e"\033[31m the $DIR/$OBJ is not exist\033[0m"

fi                     

5.for循环

  循环

                              for  变量  in {变量值};do

                              循环体

                              done

                             

                             

                             for  变量  in $(seq $变量1  $变量2);do

                              循环体

                              done

                             

                             for  变量  in  变量值;do

                              循环体

                              done

 

 

                             

5.1算术运算

                              let expression

                              $[expression]

                  $((expression))  

                  +  - * / %      

算术运算

                             let  表达式

                             $((表达式))

                             $【表达式】

                             运算符 

                             +  -   *  /   %

 

 

加法

[root@mail ~]#let A=3+5    

[root@mail ~]#echo $A

8

余数

[root@mail ~]#let A=10%2

[root@mail ~]#echo $A

0

[root@mail ~]#A=$[5+5]

[root@mail ~]#echo $A

10

[root@mail ~]#A=$((5+5))

[root@mail ~]#echo $A

10                  

                           

方法一 (for)1加到100                           

 

#!/bin/bash

let SUM=0        //定义一个SUM变量,并使其初值为0

for I in {1..100}; do

     let  SUM=$SUM+$I

done     

echo $SUM 

结果     

[root@mail ~]#bash f1.sh

5050

方法二 (for)1加到100           

#!/bin/bash

let  SUM=0

for I in $(seq 1 100); do

     let    SUM=$SUM+$I

done     

echo $SUM

#!/bin/bash

方法三 (for)1加到100           

let SUM=0

for((I=1;I<=100;I++));

#for  I in $(seq 1 100);

do

let SUM=${SUM}+$I

done

echo ${SUM}         



6.while语句

while  【判断式】;do

                             

                              循环体

                              done

                             

                             

 

6.1奇偶数相加

 

奇数:

[root@mail ~]#vim f3.sh

#!/bin/bash

let SUM=0

let I=0

while [ $I -le  100]; do

    if [$[$I%2]  -ne 0 ];    then

    let SUM=$SUM+$I

     fi

    let I=$I+1

done

echo $SUM

[root@mail ~]#bash f3.sh

2500



8.cutwhile read

 

while read 变量;do

                              循环体

                              done <文件

 

 

8.1判断普通账号

[root@mail ~]#echo $SHELL

/bin/bash

[root@mail ~]#echo "$SHELL"

/bin/bash

[root@mail ~]#echo '$SHELL'

$SHELL

 

``反引号----------〉〉用指令(命令)取代

[root@mail ~]#echo `date`

Mon Jul 703:35:08 CST 2014

 

#!/bin/bash

while read LINE ; do

ACCOUNT=`echo $LINE |cut -f1 -d:`

ACCOUNTID=`echo $LINE |cut -f3 -d:`

if [ $ACCOUNTID -ge 500 ]; then

   echo -e"the $ACCOUNT is \033[31mnormal\033[0m"

else

echo -e "the $ACCOUNT is \033[31msystem\033[0m"

fi

 

done </etc/passwd

.函数

                             

                             功能代码块 

                             现定义   后引用

                             

                             返回   return

                             function 名称()

                             

                             代码块

                             

                             

                            函数名称

 

                              名称()

                             

                             代码块

                             

                             

                            函数名称


实例1. 找出1个目录下大于1k的文件,转移到另一个目录

方法一: 

#!/bin/bash 

find /home/user1/test1 -type f -size +1k | while read file

do 

mv $file /home/user1/test2

done

方法二:

#!/bin/bash

for I in `find /home/user1/test -type f -size +1k`;

do

mv $I /home/user1/test2

done 

方法三: 

#!/bin/bash

find /home/user1/test1 -type f -size +1k >/home/user1/test.txt

do

mv $I /home/user1/test2

done 

使用IFS读文件

说明:默认情况下IFS是空格,如果需要使用其它的需要重新赋值

#!/bin/bash

IFS=:

while read field1 field2

do

    echo $field1$field2

done < a.txt












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