shell编程

shell介绍

        shell是核心程序kernel之外的指令解析器,是一个程序,同时是一种命令语言和程序设计语言。shell是命令解析器,用户输入命令,它去解析。

shell中的特殊字符

(一)通配符

  1. *       用file_*.txt,匹配file_w.txt、file_l.txt;
  2. ?     用file_?.txt,匹配file_1.txt、file_2.txt、file_3.txt;<长度字符>
  3. [...]    用file_[orx].txt,匹配file_o.txt、file_r.txt、file_x.txt;
  4. [ - ]    用file_[a-z].txt,匹配file_a.txt、file_b.txt...file_z.tx;
  5. [^...]   用file_[^ort].txt,除了file_o.txt、file_r.txt、file_x.txt 的其他文件;

 (二)管道

     管道可以把一系列命令连接起来,意味着第一个命令的输出将作为第二命令的输入,通过使用“|”连成一个管道;

     comand1 | command2 //把一个命令command1执行结果作为command2的输入传给command2

ls | wc -w //查看文件的单词数
cat test.c | grep hello //输出test.c中hello

 (三)重定向

  1. > file         ls > file,将ls的执行结果,写到file文件中,若同名文件将被删除;
  2. >> file       ls >> file,将ls的执行结果,追加到file文件中;
  3. < file         ls < file,将file中的内容作为输入传给命令ls;
  4. &>            ls 1.c &> file,ls命令,查看一个不存在的文件时,将系统错误提示信息存在file中;

   (四)命令置换

     命令置换:将一个命令的输出作为另一个命令的参数。

     commad1  ·commad2·    //命令comand2的输出将作为命令commad1的参数。

   (五)链接命令

ln -s 1.c link.c //软链接建立
ln 1.c lindk.c //硬链接建立

   (六)环境变量 

     1、PATH 和 HOME

echo $PATH  #输出PATH环境变量
echo $HOME  #s输出HOME环境变量

     2、给环境变量追加内容: 格式 export PATH=$PATH:(增加的内容)

     3、env 输出环境变量

env #输出所有环境变量
env $PATH #输出PATH环境变量

  (六)其他命令

       1、alias --- 取别名(相当于C++中的引用)      

alias ll=`ls -l` #ll就相当于ls -l 

      2、find用法:find + 路径 + 选项 + “查找内容”

find ./ -name "test*" //查找当前目录的test开头的文件
find ./ -nmae "[A-Z]*" //查找当前目录大写字母开头的文件
find ./ -nmae "[A-Z]*" -printf //查找当前目录大写字母开头的文件
find ./ -name "test" -tpye d//查找test目录

   -type 查找某一类型的文件,诸如:

  1. b - 块设备文件。
  2. d - 目录。
  3. c - 字符设备文件。
  4. p - 管道文件。
  5. l - 符号链接文件。
  6. f - 普通文件。
     

 shell编程

(一)步骤

  1. 建立shell文件<注释用#>,vi test.sh
  2. 改变shell文件的执行权限,chmod +x test.sh
  3. 执行shell文件,./test.sh

 (二)shell变量     

  • Shell变量的最基本规则:变量只有字符串和整数两种类型。在shell运算中都是整数运算或字符串操作运算。
  • 表达式运算,格式: $[表达式] 。 取值要加$赋值不要加$
  • 表达式替换形式两种:$[表达式], $((表达式 ))
  • 输出命令: echo 选项-e (常用)
  • 输入命令:read 参数的使用规则 (常用)
  • 输出命令:tee  用在管道相关的情况,调试时非常有用
#! /bin/sh
cout=1
echo $cout
echo ${cont} #和上面等价
name='xiaoming'
echo $name
set | grep cout #查看变量名和值,将输出num=5
  • ${variablename} 显示实时值
  • ${variablename:+value} 变量值为value
  • ${variablename:?value}  如果变量定义了则值为之前的值。否则输出报错
  • ${variablename:-value}  如果变量定义了则值为之前的值。否则值为value
  • ${variablename:=value}  如果变量定义了则值为之前的值。否则值为value
#!/bin/bash
index=8
echo ${index:+"123"}
num=11
echo ${num:?"124"}
echo ${a:-"100"}
b=22
echo ${b:="200"}
  • unset --- 取消变量
num=99
echo ${num}
unset num
echo ${num} #输出空

 (三)位置参数变量

  1.  $0         脚本名称,echo $0 将在输出该脚本文件名;
  2. $1,$2,$3...$n     第一个到第n个命令行参数名;
  3. $#          命令行参数的个数;
  4. $*          参数列表;
  5. $@        参数列表;
  6. $?          上一次执行的状态码;
  7. $$          正在执行进程的ID号;
#! /bin/sh
echo $0
echo $#
echo $@
echo $*
echo $?
echo $$

  注意:#!/bin/bash 表示根据这个得到解释器的类型,调用相对的解释器。

 (四)算数运算

      expr <加(+)、减(-)、乘(\*)、整除(\)、求模(%) >

      expr 12 + 5\*3  //27

num=9
sum=`expr $num / 6` #sum = 1
echo $sum

     let用法 

    在shell中可以使用let来指示命令是算术表达式,let表达式内变量不用加$

num=9
let sum=9/6 #或者"sum=9/6"
echo $sum

 (五)test命令

  • test语句可测试三种对象:字符串、整数、文件属性。真为0,假为1
  1. test -d name   测试name是否为一个目录;
  2. test -e name   测试一个文件是否存在;
  3. test -f name    测试那么是否为普通文件;
test -d test
echo $?   #输出结果

 (六)整数测试

  1. $a -eq $b    测试a与b是否相等真为0,假为1
  2. $a -ne $b     !=
  3. $a -gt $b      >
  4. $a -ge $b    >=
  5. $a -lt $b      <
  6. $a -le $b     <=
a=9
b=9
test $a -eq $b 
echo $?   #输出0

 (七)字符串 

  1. “=”  相等<真为0,假为1>
  2. “!=”不等;
  3. “- n” 判断是否为空;
  4. “- z” 长度为0;
  5. “\>”、“\<”  大于小于;
#!/bin/sh
str1="xiaoming"
str2="xiaohong"
if [ $str1 = $str2 ] #[等价] if [ "$str1"="$str2" ]两边要有空格,
then echo "="
else echo "!="
fi

if [ ${str1}\>${str2} ] #等价 if test $str1\>$str2
then echo ">"
else echo "<"
fi

if [ -n $str1 ]
then echo "1111"
else echo "0000"
fi

if [ -z $str1i ]
then echo "2222"
else echo "0000"
fi 

 (七)条件语句

    格式:  

1、if [ 表达式 ] //[]两边有空格
2、if test 表达式1 选项 表达式2
3、if test 选项 表达式

     1、if...then...fi

          if  表达式

              then 命令表

          fi

     2、if...then...else...fi

          if  表达式

          then  命令表1

          else  命令表2

          fi  

    3、if...then...elif then...esle...fi

a=9
b=8
if test $a -eq $b
then echo $a
else echo $b
fi

 (八)多路分支语句

     case  $_  in

              模式1)

                        命令表1

                        ;;

              

              模式2)

                        命令表2

                        ;;

              模式n)

                        命令表 n

                        ;;

    esac

a=2
case $a in
	1)
	echo xiaoming
	;;
	2|8)#2或8
	echo xiaohong
	;;
esac
#!/bin/sh
char='b'
case $char in
	a)
	echo xiaoming
	;;
	b|B)
	echo xiaohong
	;;
esac

 

(九)循环语句

   1、for循环

   for...do...done

  for  变量名  in 单词表

  do

       命令表

  done

for num in 1 2 3 4 5
    do
        echo "hello $num"
    done
//打印出
hello 1
hello 2
hello 3
hello 4
hello 5

for((num=1;num<=5;num++))
	do
	  echo "hello $num"
	done

  2、while循环

    while...do...done

    while 命令式表达式

    do

          命令表

    done

num=1
while test $num -lt 5
do
    echo "num=$num"
    num=`expr $num + 1`
done
read num #相当于C中scanf
while test $num -lt 5
do
    echo "num=$num"
    num=`expr $num + 1`
done

 

while((num<=5))
do
    echo "num=$num"
    num=`expr $num + 1`
done

 (十)break 和 continue

for num in 1 2 3 4 5
    do
        if test $num -eq 2
        then break
        fi
        echo "hello $num"
    done

  (十一)shell函数

   函数名称在当前脚本必须唯一,如果存在相同名称的函数,以最后一个为准。

    函数的创建方法一:

function 函数名称 {
    命令
}

  函数的创建方法二:

函数名称() {
    命令
}

  函数的调用方法:

函数名称 参数1 参数2 ...

  调用函数时可以传递参数,函数中使用$1、$2......来引用传递的参数。

function fun()
{
    echo "hello word!"
}
fun
function fun()
{
    echo "hello word!"
    echo $1
}
fun 12
function fun()
{
    echo "hello word!"
    return 43
    echo $1
}
fun 12
echo $?

 

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