zoukankan      html  css  js  c++  java
  • Shell常用模块

    Shell常用模块

    1.比较

    shell脚本中大于,大于等于,小于,小于等于、不等于的表示方法

    应对方法:

    大于 -gt (greater than)
    小于 -lt (less than)
    大于或等于 -ge (greater than or equal)
    小于或等于 -le (less than or equal)
    不相等 -ne (not equal)

    ******************************************

    2.for循环

    Linux下Shell的for循环语句
    第一类:数字性循环
    -----------------------------
    for1-1.sh

    #!/bin/bash

    for((i=1;i<=10;i++));
    do
    echo $(expr $i * 3 + 1);
    done


    -----------------------------
    for1-2.sh

    #!/bin/bash
    
    for i in $(seq 1 10)
    do
        echo $(expr $i * 3 + 1);
    done

    -----------------------------

    for1-3.sh

    #!/bin/bash
    
    for i in {1..10}
    do
        echo $(expr $i * 3 + 1);
    done

    -----------------------------

    for1-4.sh

    #!/bin/bash
    
    awk 'BEGIN{for(i=1; i<=10; i++) print i}'

    第二类:字符性循环
    -----------------------------
    for2-1.sh

    #!/bin/bash
    
    for i in `ls`;
    do
        echo $i is file name! ;
    done

    -----------------------------
    for2-2.sh

    #!/bin/bash
    
    for i in $* ;
    do
        echo $i is input chart! ;
    done


    -----------------------------
    for2-3.sh

    #!/bin/bash
    
    for i in f1 f2 f3 ;
    do
        echo $i is appoint ;
    done

    -----------------------------
    for2-4.sh

    复制代码

    #!/bin/bash
    
    list="rootfs usr data data2"
    for i in $list;
    do
        echo $i is appoint ;
    done


    第三类:路径查找
    -----------------------------
    for3-1.sh

    #!/bin/bash
    
    for file in /proc/*;
    do
        echo $file is file path ! ;
    done

    -----------------------------
    for3-2.sh

    #!/bin/bash
    
    for file in $(ls *.sh)
    do
        echo $file is file path ! ;
    done

    总结:

    现在一般都使用for in结构,for in结构后面可以使用函数来构造范围,比如$()、``这些,里面写一些查找的语法,比如ls test*,那么遍历之后就是输出文件名了。

    ******************************************

    3.非空判断

    3.1 在Shell里面判断字符串是否为空

    判断字符串为空的方法有三种:
    if [ "$str" = "" ]
    if [ x"$str" = x ]
    if [ -z "$str" ] (-n 为非空)

    3.2如何在shell中判断一个文件是否为空

    方法一:在shell中通过test指令测试文件是否为空的示例脚本如下:

    #! /bin/sh
    
    if test -s file.txt; then
    echo "hi"
    else
    echo "empty"
    fi

    方法二:在shell中,test指令还有另外一种写法,上面的脚本和下面的脚本是等价的:

    #! /bin/sh
    
    if [ -s file.txt ]; then
    echo "hi"
    else
    echo "empty"
    fi

    ********************************************************

    4.Shell中判断文件,目录是否存在

    -e filename 如果 filename存在,则为真 
    -d filename 如果 filename为目录,则为真 
    -f filename 如果 filename为常规文件,则为真 
    -L filename 如果 filename为符号链接,则为真 
    -r filename 如果 filename可读,则为真 
    -w filename 如果 filename可写,则为真 
    -x filename 如果 filename可执行,则为真 
    -s filename 如果文件长度不为0,则为真 
    -h filename 如果文件是软链接,则为真

    ***************************************************
    实例如下:

    4.1.判断文件夹是否存在

    #shell判断文件夹是否存在

    #如果文件夹不存在,创建文件夹

    if [ ! -d "/myfolder" ]; then
    mkdir /myfolder
    fi

    4.2.判断文件夹是否存在并且是否具有可执行权限

    #shell判断文件,目录是否存在或者具有权限
    folder="/var/www/"
    file="/var/www/log"
    
    # -x 参数判断 $folder 是否存在并且是否具有可执行权限
    if [ ! -x "$folder"]; then
    mkdir "$folder"
    fi

    4.3.判断文件夹是否存在

    # -d 参数判断 $folder 是否存在
    if [ ! -d "$folder"]; then
    mkdir "$folder"
    fi
    
    4.4.判断文件是否存在
    
    # -f 参数判断 $file 是否存在
    if [ ! -f "$file" ]; then
    touch "$file"
    fi

    4.5.判断一个变量是否有值

    # -n 判断一个变量是否有值
    if [ ! -n "$var" ]; then
    echo "$var is empty"
    exit 0
    fi

    4.6.判断两个变量是否相等.

    # 判断两个变量是否相等
    if [ "$var1" = "$var2" ]; then
    echo '$var1 eq $var2'
    else
    echo '$var1 not eq $var2'
    fi

    5.shell脚本--sed的用法

    5.1.sed命令实例:

    sed '3ahello' 1.txt #向第三行后面添加hello,3表示行号
    
    sed '/123/ahello' 1.txt #向内容123后面添加hello,如果文件中有多行包括123,则每一行后面都会添加
    
    sed '$ahello' 1.txt #在最后一行添加hello
    
    sed '3ihello' 1.txt #在第三行之前插入hello
    
    sed '/123/ihello' 1.txt #在包含123的行之前插入hello,如果有多行包含123,则包含123的每一行之前都会插入hello
    
    sed '$ihello' 1.txt #在最后一行之前插入hello

    2.更改文件中指定的行

    sed '1chello' 1.txt #将文件1.txt的第一行替换为hello
    
    sed '/123/chello' 1.txt #将包含123的行替换为hello
    
    sed '$chello' 1.txt #将最后一行替换为hello

    3.删除文件中的行

    sed '4d' 1.txt #删除第四行
    
    sed '1~2d' 1.txt #从第一行开始删除,每隔2行就删掉一行,即删除奇数行
    
    sed '1,2d' 1.txt #删除1~2行
    
    sed '1,2!d' 1.txt #删除1~2之外的所有行
    
    sed '$d' 1.txt #删除最后一行
    
    sed '/123/d' 1.txt #删除匹配123的行
    
    sed '/123/,$d' 1.txt #删除从匹配123的行到最后一行
    
    sed '/123/,+1d' 1.txt #删除匹配123的行及其后面一行
    
    sed '/^$/d' 1.txt #删除空行
    
    sed '/123|abc/!d' 1.txt #删除不匹配123或abc的行,/123|abc/ 表示匹配123或abc ,!表示取反
    
    sed '1,3{/123/d}' 1.txt #删除1~3行中,匹配内容123的行,1,3表示匹配1~3行,{/123/d}表示删除匹配123的行

    4:替换文件中的内容

    sed 's/123/hello/' 1.txt #将文件中的123替换为hello,默认只替换每行第一个123
    
    sed 's/123/hello/g' 1.txt #将文本中所有的123都替换为hello
    
    sed 's/123/hello/2' 1.txt #将每行中第二个匹配的123替换为hello
    
    sed -n 's/123/hello/gpw 2.txt' 1.txt #将每行中所有匹配的123替换为hello,并将替换后的内容写入2.txt
    
    sed '/#/s/,.*//g' 1.txt #匹配有#号的行,替换匹配行中逗号后的所有内容为空 (,.*)表示逗号后的所又内容
    
    sed 's/..$//g' 1.txt #替换每行中的最后两个字符为空,每个点代表一个字符,$表示匹配末尾 (..$)表示匹配最后两个字符
    
    sed 's/^#.*//' 1.txt #将1.txt文件中以#开头的行替换为空行,即注释的行 ( ^#)表示匹配以#开头,(.*)代表所有内容
    
    sed 's/^#.*//;/^$/d' 1.txt #先替换1.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开
    
    sed 's/^[0-9]/(&)/'   1.txt   #将每一行中行首的数字加上一个小括号   (^[0-9])表示行首是数字,&符号代表匹配的内容
    
    或者  sed 's/[0−9][0−9]/(1)/'   1.txt  #替换左侧特殊字符需钥转义,右侧不需要转义,1代表匹配的内容
    
    sed 's/$/&'haha'/' 1.txt # 在1.txt文件的每一行后面加上"haha"字段

    5.打印文件中的行

    sed -n '3p' 1.txt #打印文件中的第三行内容
    
    sed -n '2~2p' 1.txt #从第二行开始,每隔两行打印一行,波浪号后面的2表示步长
    
    sed -n '$p' 1.txt #打印文件的最后一行
    
    sed -n '1,3p' 1.txt #打印1到3行
    
    sed -n '3,$p' 1.txt #打印从第3行到最后一行的内容
    
    sed -n '/you/p' 1.txt #逐行读取文件,打印匹配you的行
    
    sed -n '/bob/,3p' 1.txt #逐行读取文件,打印从匹配bob的行到第3行的内容
    
    sed -n '/you/,3p' 1.txt #打印匹配you 的行到第3行,也打印后面所有匹配you 的行
    
    sed -n '1,/too/p' 1.txt #打印第一行到匹配too的行
    
    sed -n '3,/you/p' 1.txt #只打印第三行到匹配you的行
    
    sed -n '/too/,$p' 1.txt #打印从匹配too的行到最后一行的内容
    
    sed -n '/too/,+1p' 1.txt #打印匹配too的行及其向后一行,如果有多行匹配too,则匹配的每一行都会向后多打印一行
    
    sed -n '/bob/,/too/p' 1.txt #打印从匹配内容bob到匹配内容too的行

    6.打印文件的行号

    sed -n "$=" 1.txt #打印1.txt文件最后一行的行号(即文件有多少行,和wc -l 功能类似)
    
    sed -n '/error/=' 1.txt #打印匹配error的行的行号
    
    sed -n '/error/{=;p}' 1.txt #打印匹配error的行的行号和内容(可用于查看日志中有error的行及其内容)

    7.从文件中读取内容

    sed 'r 2.txt' 1.txt #将文件2.txt中的内容,读入1.txt中,会在1.txt中的每一行后都读入2.txt的内容
    
    sed '3r 2.txt' 1.txt #在1.txt的第3行之后插入文件2.txt的内容(可用于向文件中插入内容)
    
    sed '/245/r 2.txt' 1.txt #在匹配245的行之后插入文件2.txt的内容,如果1.txt中有多行匹配456则在每一行之后都会插入
    
    sed '$r 2.txt' 1.txt #在1.txt的最后一行插入2.txt的内容

    8.向文件中写入内容

    sed -n 'w 2.txt' 1.txt #将1.txt文件的内容写入2.txt文件,如果2.txt文件不存在则创建,如果2.txt存在则覆盖之前的内容
    
    sed -n '2w 2.txt' 1.txt #将文件1.txt中的第2行内容写入到文件2.txt
    
    sed  -n -e '1w  2.txt'  -e '$w 2.txt'   1.txt   #将1.txt的第1行和最后一行内容写入2.txt
    
    sed  -n -e '1w  2.txt'  -e '$w  3.txt'  1.txt   #将1.txt的第1行和最后一行分别写入2.txt和3.txt
    
    sed -n '/abc|123/w 2.txt' 1.txt #将1.txt中匹配abc或123的行的内容,写入到2.txt中
    
    sed -n '/666/,$w 2.txt' 1.txt #将1.txt中从匹配666的行到最后一行的内容,写入到2.txt中
    
    sed -n '/xyz/,+2w 2.txt' 1.txt #将1.txt中从匹配xyz的行及其后2行的内容,写入到2.txt中

    9.sed 在shell脚本中的使用

    9.1:替换文件中的内容

    #!/bin/bash
    if [ $# -ne 3 ];then            #判断参数个数
      echo "Usage:  $0 old-part new-part filename"    #输出脚本用法
      exit
    fi
    
    sed -i "s#$1#$2#"  $3          #将 旧内容进行替换,当$1和$2中包含"/"时,替换指令中的定界符需要更换为其他符号

    9.2:删除文件中的空白行

    #!/bin/bash
    
    if [ ! -f $1 ];then #判断参数是否为文件且存在
    
    echo "$0 is not a file"
    
    exit
    
    fi
    
    sed -i "/^$/d" $1 #将空白行删除


    9.3:格式化文本内容

    #!/bin/bash
    a='s/^  *>//      #定义一个变量a保存sed指令,'s/^ *>//':表示匹配以0个或多空格开头紧跟一个'>'号的行,将匹配内容替换
    s/	*//                 #'s/	*//':表示匹配以0个或多个制表符开头的行,将匹配内容替换
    
    s/^>//               #'s/^>//' :表示匹配以'>'开头的行,将匹配内容替换
    
    s/^ *//'               #'s/^ *//':表示匹配以0个或多个空格开头的行,将匹配内容替换
    #echo $a
    sed "$a" $1        #对用户给定的文本文件进行格式化处理
    
    ******************************************************

    *******************************************************
    实用脚本:批量更改当前目录中的文件后缀名:

    示例1:

    #!/bin/bash
    if [ $# -ne 2 ];then               #判断用户的输入,如果参数个数不为2则打印脚本用法
      echo "Usage:$0 + old-file new-file"
      exit
    fi
    for i in *$1*                         #对包含用户给定参数的文件进行遍历
    do
      if [ -f $i ];then
         iname=`basename $i`        #获取文件名
         newname=`echo $iname | sed -e "s/$1/$2/g"`         #对文件名进行替换并赋值给新的变量
         mv  $iname  $newname          #对文件进行重命名
       fi
    done
    
    exit 666

    示例2:

    #!/bin/bash
    read -p "input the old file:" old        #提示用户输入要替换的文件后缀
    read -p "input the new file:" new
    [ -z $old ] || [ -z $new ] && echo "error" && exit      #判断用户是否有输入,如果没有输入怎打印error并退出
    for file in `ls *.$old`
    do
      if [ -f $file ];then
         newfile=${file%$old}                        #对文件进行去尾
         mv $file ${newfile}$new                   #文件重命名
      fi

    示例3:

    #!/bin/bash
    
    if [ $# -ne 2 ];then        #判断位置变量的个数是是否为2
       echo "Usage:$0  old-file  new-file"
       exit
    fi
    for file in `ls`                      #在当前目录中遍历文件
    do
      if [[ $file =~ $1$ ]];then   #对用户给出的位置变量$1进行正则匹配,$1$表示匹配以变量$1的值为结尾的文件
         echo $file                      #将匹配项输出到屏幕进行确认
         new=${file%$1}             #对文件进行去尾处理,去掉文件后缀保留文件名,并将文件名赋给变量new                  
         mv $file ${new}$2          #将匹配文件重命名为:文件名+新的后缀名
      fi
    
    done


    10.shell中awk命令使用

    10.1基本打印

    Awk常用内置变量表:

    $0 当前记录(作为单个变量)
    $1~$n 当前记录的第n个字段,字段间由FS分隔
    FS 输入字段分隔符 默认是空格 (可记忆为:FieldsSpace缩写)
    NF 当前记录中的字段个数,就是有多少列 (可记忆为:NumberFields缩写)
    NR 已经读出的记录数,就是行号,从1开始 (可记忆为:NumberRows缩写)
    RS 输入的记录他隔符默 认为换行符 (可记忆为:RowsSpace缩写)
    OFS 输出字段分隔符 默认也是空格 (可记忆为:OutputFieldsSpace缩写)
    ORS 输出的记录分隔符,默认为换行符 (可记忆为:OutputRowsSpace缩写) 
    ARGC 命令行参数个数
    ARGV 命令行参数数组
    FILENAME 当前输入文件的名字
    IGNORECASE 如果为真,则进行忽略大小写的匹配
    ARGIND 当前被处理文件的ARGV标志符
    CONVFMT 数字转换格式 %.6g
    ENVIRON UNIX环境变量
    ERRNO UNIX系统错误消息
    FIELDWIDTHS 输入字段宽度的空白分隔字符串
    FNR 当前记录数
    OFMT 数字的输出格式 %.6g
    RSTART 被匹配函数匹配的字符串首
    RLENGTH 被匹配函数匹配的字符串长度

    示例:

    awk '{print $0}' p1 #打印整行: $0
    
    awk -F : '{print $NF}' p1 #打印每行的最后一个字段: $NF
    
    awk -F : '{print $3}' p1 #打印第三个字段: $3
    
    awk 'NR==1{print $0}' p1 #打印第一行NR==1
    
    awk 'END{print $0}' p1 #打印最后一行
    
    awk -F: 'NR==1{print $NF}' p1 #打印第一行最后一个字段
    
    awk -F: 'END{print $NF}' p1 #打印最后一行最后一个字段
    
    awk -F: '{print $(NF-1),"nihao"}' p1 #打印每行的倒数第二个字段,并在其后打印你好
    
    cat /etc/passwd |awk -F ':' '{print $1}' #冒号分割,只显示/etc/passwd的账户
    
    cat /etc/passwd |awk -F ':' '{print $1"	"$7}' #只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
    
    cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}' #如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"
    
    awk '{print NR,$0}' p1 #打印行号
    
    awk 'BEGIN{print ENVIRON["PATH"];}' #打印当前系统环境变量的某个特定值
    
    awk 'BEGIN{FS=":";OFS=":"}{print $1,$3,$4,$5,$6,$7}' p1 #分割,删除第2个字段

    10.2 条件操作符:

    <、<=、==、!=、>=、~匹配正则表达式、!~不匹配正则表达式
    
    awk '{if ($4~/ASIMA/) print $0}' temp #表示如果第四个域包含 ASIMA,就打印整条
    
    awk '$3=="48" {print $0}' temp 只打印第 3 域等于"48"的记录
    
    awk '$0 !~ /ASIMA/' temp 打印整条不包含 ASIMA 的记录
    
    awk '$1 != "asima"' temp #打印 不等于 asima的对象
    
    awk '{if ($1<$2) print $1 "is smaller"}' temp #打印较小的对象
    
    awk '/[Gg]reen/' temp 打印整条包含 Green,或者 green 的记录
    
    awk '$1 ~/^...a/' temp 打印第 1 域中第四个字符是 a 的记录,符号’^’代表行首,符合’.’代表任意字符
    
    awk '$0~/(abc)|(efg)/' temp 使用|时,语句需要括起来
    
    awk '{if ( $1=="a" && $2=="b" ) print $0}' temp
    
    awk '{if ($1=="a" || $1=="b") print $0}' temp
    
    echo $PWD | awk -F/ '{print $NF}' 显示当前目录名

    10.3 awk 操作符:

    输入域到变量名:

    awk '{name=$1;six=$3; if (six=="man") print name " is " six}' temp

    域值比较操作:

     awk 'BEGIN {BASE="27"} {if ($4<BASE) print $0}' temp

    修改数值域取值:(原输入文件不会被改变)

    awk '{if ($1=="asima") $6=$6-1;print $1,$6,$7}' temp

    修改文本域:

    awk '{if ($1=="asima) ($1=="desc");print $1}' temp


    只显示修改记录:(只显示所需要的,区别上一条命令,注意{})

    awk '{if ($1=="asima) {$1=="desc";print$1}}' temp

    创建新的输出域: 

    awk '{$4=$3-$2; print $4}' temp

    统计列值:

    awk '(tot+=$3);END {print tot}' temp 会显示每列的内容 
    awk '{(tot+=$3)};END {print tot}' temp 只显示最后的结果

    文件长度相加:

    ls -l|awk '/^[^d]/ {print $9"	"$5} {tot+=$5} END{print "totKB:" tot}'

    只列出文件名: ls -l|awk '{print $9}' 常规情况文件名是第9域


    10.4 awk 内置字符串函数:

    gsub(r,s) 在整个$0中用s替代r

    awk 'gsub(/name/,"xingming") {print $0}' temp

    gsub(r,s,t) 在整个t中用s替代r

    index(s,t) 返回s中字符串t的第一位置

    awk 'BEGIN {print index("Sunny","ny")}' temp 返回4

    length(s) 返回s的长度

    match(s,r) 测试s是否包含匹配r的字符串

    awk '$1=="J.Lulu" {print match($1,"u")}' temp 返回4

    split(s,a,fs) 在fs上将s分成序列a

    awk 'BEGIN {print split("12#345#6789",myarray,"#")"'

    返回3,同时myarray[1]="12", myarray[2]="345", myarray[3]="6789"

    sprint(fmt,exp) 返回经fmt格式化后的exp

    sub(r,s) 从$0中最左边最长的子串中用s代替r(只更换第一遇到的匹配字符串)

    substr(s,p) 返回字符串s中从p开始的后缀部分

    substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分


    10.5 printf 函数的使用:

    字符转换: echo "65" |awk '{printf "%c ",$0}' 输出A

    awk 'BEGIN {printf "%f ",999}' 输出999.000000

    格式化输出:awk '{printf "%-15s %s ",$1,$3}' temp 将第一个域全部左对齐显示

    10.6 其他 awk 用法:向一行 awk 命令传值:

    awk '{if ($5<AGE) print $0}' AGE=10 temp
    who | awk '{if ($1==user) print $1 " are in " $2 ' user=$LOGNAME 使用环境变量


    awk 脚本命令:

    !/bin/awk -f
    # all comment lines must start with a hash '#'
    # name: student_tot.awk
    # to call: student_tot.awk grade.txt
    # prints total and average of club student points
    # print a header first
    BEGIN
    {
        print "Student Date Member No. Grade Age Points Max"
        print "Name Joined Gained Point Available"
        print"========================================================="
    }
    
    # let's add the scores of points gained
    (tot+=$6);
    
    # finished processing now let's print the total and average point
    END
    {
        print "Club student total points :" tot
        print "Average Club Student points :" tot/N
    }
    
    
    awk 数组:
    
    For (element in array) print array[element]
    awk 'BEGIN {
    record="123#456#789";split(record,myarray,"#")
    }
    END {
    for (i in myarray) {print myarray[i]}
    }
    
    
    条件判断语句(if):
    
    
    awk 'BEGIN{
    test=100;
    if(test > 90)
    {
    print "very good";
    }
    else if(test > 60)
    {
    print "good";
    }
    else
    {
    print "no pass";
    }
    }'
    
    very goo

    每条命令语句后面可以用“;”号结尾。

    循环语句(while,for,do)
    
    
    awk 'BEGIN{
    test=100;
    total=0;
    while(i<=test)
    {
        total+=i;
        i++;
    }
    print total;
    }'
    
    5050
    
    
    for 循环
    
    awk 'BEGIN{
    for(k in ENVIRON)
    {
    print k"="ENVIRON[k];
    }
    }'
    
    AWKPATH=.:/usr/share/awk
    OLDPWD=/home/web97
    SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
    SELINUX_LEVEL_REQUESTED=
    SELINUX_ROLE_REQUESTED=
    LANG=zh_CN.GB2312
    
    
    awk 'BEGIN{
    total=0;
    for(i=0;i<=100;i++)
    {
    total+=i;
    }
    print total;
    }'
    
    输出为:5050
    
    awk 'BEGIN{
    total=0;
    i=0;
    do
    {
    total+=i;
    i++;
    }while(i<=100)
    print total;
    }'

    11.shell中打输出json

    echo '{"A":"'{$A}'","B":"'{$B}'","C":"'{$C}'"}'

    格式化输出json:
    json数据如下:

    [
        {
            
            "id": "1"
        
        },
        
        {
            
            "data": "231566"
        
        },
        
        {
            
            "id": "2"
        
        },
        
        {
            
            "data": "12345515"
        
        },
        
        {
            
            "id": "3"
        
        },
        
        {
            
            "data": "4124412512"
        
        },
         {
            
            "id": "4"
        
        }
    
    ]
    cat test2.txt |grep -vE '({|}||)'|cut -d: -f 2|sed ':a;N;$!ba;s/ / /g'|awk 'BEGIN{print" 设置计数 器t=1";t=1}{for(i=1;i<NF;i++)if((i%2)!=0){t++;print "key:"$i,"value:"$(i+1)} else continue}END{print "循环次数:"t}'


  • 相关阅读:
    IOS Charles(代理服务器软件,可以用来拦截网络请求)
    Javascript中addEventListener和attachEvent的区别
    MVC中实现Area几种方法
    Entity Framework Code First 中使用 Fluent API 笔记。
    自定义JsonResult解决 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案
    Code First :使用Entity. Framework编程(8) ----转发 收藏
    Code First :使用Entity. Framework编程(6) ----转发 收藏
    Code First :使用Entity. Framework编程(5) ----转发 收藏
  • 原文地址:https://www.cnblogs.com/momoyan/p/14022217.html
Copyright © 2011-2022 走看看