部分引用自:https://blog.csdn.net/qq_22075977/article/details/75209149

一、概述

  Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令,并把它送入内核去执行。内核是Linux系统的心脏,从开机自检就驻留在计算机的内存中,直到计算机关闭为止,而用户的应用程序存储在计算机的硬盘上,仅当需要时才被调入内存。Shell是一种应用程序,当用户登录Linux系统时,Shell就会被调入内存去执行。Shell独立于内核,它是连接内核和应用程序的桥梁,并由输入设备读取命令,再将其转为计算机可以理解的机械码,Linux内核才能执行该命令。

二、优势
Shell脚本语言的好处是简单、易学、易用,适合处理文件和目录之类的对象,以简单的方式快速完成某些复杂的事情通常是创建脚本的重要原则,脚本语言的特性可以总结为以下几个方面:

  1、语法和结构通常比较简单。
  2、学习和使用通常比较简单,
  3、通常以容易修改程序的“解释”作为运行方式,而不需要“编译。
  4、程序的开发产能优于运行效能。
  5、Shell脚本语言是Linux/Unix系统上一种重要的脚本语言,在Linux/Unix领域应用极为广泛,熟练掌握Shell脚本语言是一个优秀的Linux/Unix开发者和系统管理员必经之路。利用Shell脚本语言可以简洁地实现复杂的操作,而且Shell脚本程序往往可以在不同版本的Linux/Unix系统上通用。

三、变量

  1、用户自定义变量

    这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀:

    a、unset:删除变量

    b、readonly:标记只读变量

    c、export:指定全局变量

#!/bin/bash 

echo "定义普通变量"
CITY=CHENGDU echo "定义全局变量"
export NAME=cdeveloper echo "定义只读变量"
readonly AGE= echo "打印变量的值"
echo $CITY
echo $NAME
echo $AGE echo "删除 CITY 变量"
unset CITY # 不会输出 CHENGDU
echo $CITY

运行结果:

定义普通变量
定义全局变量
定义只读变量
打印变量的值
CHENGDU
cdeveloper 删除 CITY 变量

  2、预定义变量

    预定义变量常用来获取命令行的输入,有下面这些:

    a、$0 :脚本文件名
    b、$1-9 :第 1-9 个命令行参数名
    c、$# :命令行参数个数
    d、$@ :所有命令行参数
    e、$* :所有命令行参数
    f、$? :前一个命令的退出状态,可用于获取函数返回值
    g、$$ :执行的进程 ID

    编辑脚本1.sh

#!/bin/bash 

echo "print $"

echo "1、打印脚本文件名$0"
echo -e "\$0 = $0 \n" echo "2、打印第一个命令行参数$1"
echo -e "\$1 = $1\n" echo "3、打印第二个命令行参数$2"
echo -e "\$2 = $2\n" echo "4、打印命令行参数个数$#"
echo -e "\$# = $#\n" echo "5、打印所有命令行参数$@"
echo -e "\$@ = $@\n" echo "6、打印所有命令行参数"
echo -e "\$* = $*\n" echo "7、打印前一个命令的退出状态"
echo -e "\$? = $?\n" echo "8、打印执行的进程ID"
echo "\$\$ = $$"

执行结果:

print $
、打印脚本文件名1.sh
$ = .sh 、打印第一个命令行参数1
$ = 、打印第二个命令行参数2
$ = 、打印命令行参数个数4
$# = 、打印所有命令行参数1
$@ = 、打印所有命令行参数
$* = 、打印前一个命令的退出状态
$? = 、打印执行的进程ID
$$ =

  3、环境变量

    环境变量默认就存在,常用的有下面这几个:
    a、HOME:用户主目录
    b、PATH:系统环境变量 PATH
    c、TERM:当前终端
    d、UID:当前用户 ID
    e、PWD:当前工作目录,绝对路径

    编辑1.sh

#!/bin/bash

echo -e "print env\n"

echo "家目录"
echo -e "\$HOME=$HOME\n" echo "环境变量"
echo -e "\$PATH=$PATH\n" echo "当前终端"
echo -e "\$TERM=$TERM\n" echo "当前工作目录"
echo -e "\$PWD=$PWD\n" echo "当前用户ID"
echo "\$UID=$UID"

执行结果

print env

家目录
$HOME=/root 环境变量
$PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/application/jdk1..0_181/jre/bin:/application/jdk1..0_181/bin:/usr/local/rsync/bin:/application/sersync/bin:/root/bin 当前终端
$TERM=xterm 当前工作目录
$PWD=/script 当前用户ID
$UID=

四、shell 运算

  1、我们经常需要在 Shell 脚本中计算,掌握基本的运算方法很有必要,下面就是 4 种比较常见的运算方法,功能都是将 m + 1:
    a、m=$[ m + 1 ]
    b、m=expr $m + 1 # 用 “ 字符包起来
    c、let m=m+1
    d、m=$(( m + 1 ))

    e、实例,编辑1.sh

#!/bin/bash 

m=

m=$[ m +  ]
echo $m m=`expr $m + `
echo $m # 注意:+ 号左右不要加空格
let m=m+
echo $m m=$(( m + ))
echo $m

执行结果:


  2、文件测试
    a、-d:测试是否为目录(Directory)
    b、-e:测试目录或文件是否存在(Exist)
    c、-f:测试是否为文件(File)
    d、-r:测试当前用户是否有权限读取(Read)
    e、-w:测试当前用户是否有权限写入(Write)
    f、-x:测试当前用户是否有权限执行(eXcute)
    g、实例

[root@wohaoshuai1 script]# [ -d /media/cdrom ] && echo "YES" || echo "no"
no

  3、数值比较

    a、-eq:等于
    b、-ne:不等于
    c、-gt:大于
    d、-lt:小于
    e、-le:小于等于
    f、-ge:大于或等于

    g、实例 编辑1.sh

#!/bin/bash
[ $(who | wc -l) -eq ] && echo "等于2"
[ $(who | wc -l) -ne ] && echo "不等于2"
[ $(who | wc -l) -gt ] && echo "大于2"
[ $(who | wc -l) -lt ] && echo "小于2"
[ $(who | wc -l) -ge ] && echo "大于或等于2"
[ $(who | wc -l) -le ] && echo "小于或等于2"

  4、字符串比较

    a、= :字符串内容相同
    b、!=:字符串内容不同,!表示相反的意思
    c、-z:字符串内容为空
    d、-n:字符串内容不为空

[root@wohaoshuai1 script]# echo $a

[root@wohaoshuai1 script]# [ $a = "b" ] && echo "a等于b" || echo "a不等于b"
a不等于b
[root@wohaoshuai1 script]# [ $a != "b" ] && echo "a不等于b" || echo "a等于b"
a不等于b
[root@wohaoshuai1 script]# [ -z $a ] && echo "a为空" || echo "a不为空"
a不为空
[root@wohaoshuai1 script]# [ -n $a ] && echo "a不为空" || echo "a为空"
a不为空

  5、逻辑测试

    a、-a 或 && : 逻辑与,“而且” 的意思
    b、-o 或 || : 逻辑或,“或者” 的意思
    c、! :逻辑否

  6、[] 与 [[]] 区别

    a、[[]] 用 "&&" 而不是"-a" 表示逻辑与,用"||"而不是"-o"表示逻辑或。

[root@wohaoshuai1 ~]# [[  <  && b > a ]] && echo "true" || echo "false"
true
[root@wohaoshuai1 ~]# [[ < -a b > a ]] && echo "true" || echo "false"
-bash: syntax error in conditional expression
-bash: syntax error near `-a'

    b、[ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符”>” 与”<”必须转义,否则就变成IO改向操作符了。[[中"<"与">"不需转义:

[root@wohaoshuai1 ~]# [  \<  -a b \> a ] && echo "true" || echo "false"
true

    c、[[ ... ]]进行算术扩展,而[ ... ]不做

[root@wohaoshuai1 ~]# [[ + -eq  ]] && echo "true" || echo "false"
true
[root@wohaoshuai1 ~]# [ + -eq ] && echo "true" || echo "false"
-bash: [: +: integer expression expected
false
[root@wohaoshuai1 ~]# [ $((+)) -eq ] && echo "true" || echo "false"
true

    d、[[]]能用正则,而[]不行,并且[[]]在正则匹配中不能使用双引号。

[root@wohaoshuai1 ~]# [[ "test.php" = *.php ]] && echo "true" || echo "false"
true
[root@wohaoshuai1 ~]# [ "test.php" = *.php ] && echo "true" || echo "false"
false
[root@wohaoshuai1 ~]# [[ "test.php" = "*.php" ]] && echo "true" || echo "false"
false

五、shell 语句

  1、if 语句

    a、这个跟高级语言的 if - else - if 类似,只是格式有些不同而已。

#!/bin/bash 

read -p "请输入整数:" VART

if [ $VART -eq  ];then
echo "true"
elif [ $VART -gt ];then
echo "大于10"
else
echo "false"
fi

执行结果:

[root@wohaoshuai1 script]# sh .sh
请输入整数:
false
[root@wohaoshuai1 script]# sh .sh
请输入整数:
true
[root@wohaoshuai1 script]# sh .sh
请输入整数:
大于10

  2、case语句,case 语句有些复杂,要注意格式

#!/bin/bash
read -p "请输入一个字符,并按enter结束:" key
case "$key" in
[./]|[a-z]|[A-Z])
echo "你输入的是字母"
;;
[-])
echo "你输入的是数字"
;;
*)
echo "你输入的是空格,功能键或其他控制字符"
esac

执行结果:

请输入一个字符,并按enter结束:a
你输入的是字母
[root@wohaoshuai1 script]# sh .sh
请输入一个字符,并按enter结束:.
你输入的是字母
[root@wohaoshuai1 script]# sh .sh
请输入一个字符,并按enter结束:/
你输入的是字母

  3、for循环

#!/bin/bash 

# 普通 for 循环
echo "普通for循环如下:"
for ((i = ; i <= ; i++))
do
echo $i
done
echo -e "\n" # VAR 依次代表每个元素
echo "第二种for循环:"
for VAR in `seq `
do
echo $VAR
done

执行结果:

普通for循环如下:

第二种for循环:

  4、while循环

#!/bin/bash 

VAR=

# 如果 VAR 小于 ,就打印出来
while [ $VAR -lt ]
do
echo $VAR
# VAR 自增
VAR=$[ $VAR + ]
done

执行结果:


  5、until循环,until 语句与while循环的不同点是它的结束条件为 1

#!/bin/bash 

i=

# i 大于  时,循环结束
until [[ "$i" -gt ]]
do
echo $i
i=$[ $i + ]
done

运行结果:


  6、break,Shell 中的 break 用法与高级语言相同,都是跳出循环。

#!/bin/bash 

for VAR in `seq  `
do
# 如何 VAR 等于 就跳出循环
if [ $VAR -eq ];then
break
fi echo $VAR
done

执行结果:

[root@wohaoshuai1 script]# sh .sh

  7、continue,用来跳过本次循环,进入下一次循环

#!/bin/bash 

for VAR in
do
# 如果 VAR 等于 ,就跳过,直接进入下一次 VAR = 的循环
if [ $VAR -eq ];then
continue
fi echo $VAR
done

执行结果:

[root@wohaoshuai1 script]# sh .sh 

六、shell函数

  1、定义函数,有两种常见的格式

#!/bin/bash 

function hello_world()
{
echo "hello world fun"
echo $ $
return
} hello()
{
echo "hello fun"
}

  2、调用函数

#!/bin/bash 

function hello_world()
{
echo "hello world fun"
echo $ $
return
} hello()
{
echo "hello fun"
} # . 直接用函数名调用 hello 函数
echo "1. 直接用函数名调用 hello 函数执行结果:"
hello echo -e "\n" # . 使用「函数名 函数参数」来传递参数
echo "2. 使用「函数名 函数参数」来传递参数执行结果:"
hello_world echo -e "\n" # . 使用「FUN=`函数名 函数参数`」 来间接调用
echo "3. 使用「FUN='函数名 函数参数'」 来间接调用:"
FUN=`hello_world `
echo -e $FUN

执行结果:

[root@wohaoshuai1 script]# sh .sh
. 直接用函数名调用 hello 函数执行结果:
hello fun . 使用「函数名 函数参数」来传递参数执行结果:
hello world fun . 使用「FUN='函数名 函数参数'」 来间接调用:
hello world fun

  3、获取返回值,使用 $?获取返回值

#!/bin/bash 

function hello_world()
{
echo "hello world fun"
echo $ $
return
} hello()
{
echo "hello fun"
} # . 直接用函数名调用 hello 函数
echo "1. 直接用函数名调用 hello 函数执行结果:"
hello echo -e "\n" # . 使用「函数名 函数参数」来传递参数
echo "2. 使用「函数名 函数参数」来传递参数执行结果:"
hello_world
echo "返回值为:$?" echo -e "\n" # . 使用「FUN=`函数名 函数参数`」 来间接调用
echo "3. 使用「FUN='函数名 函数参数'」 来间接调用:"
FUN=`hello_world `
echo -e $FUN

执行结果:

[root@wohaoshuai1 script]# sh .sh
. 直接用函数名调用 hello 函数执行结果:
hello fun . 使用「函数名 函数参数」来传递参数执行结果:
hello world fun 返回值为: . 使用「FUN='函数名 函数参数'」 来间接调用:
hello world fun

  4、定义本地变量

fun()
{
local x=
echo $x
}

七、Shell 调试

  1、使用下面的命令来检查是否有语法错误

sh -n .sh

  2、使用下面的命令来执行并调试 Shell 脚本

sh -x .sh

  3、实例

#!/bin/bash

for VAR in
do
if [ $VAR -eq ];then
continue
fi
echo $VAR
done

执行结果:

[root@wohaoshuai1 script]# sh -x .sh
+ for VAR in
+ '[' -eq ']'
+ echo + for VAR in
+ '[' -eq ']'
+ continue
+ for VAR in
+ '[' -eq ']'
+ echo

其中带有 + 表示的是 Shell 调试器的输出,不带 + 表示我们程序的输出。

八、Shell数组

  1、数组分为两种类型,一是数值类型,二是字符串类型。

    a、数值类型的数组:一对括号表示数组,数组中元素之间使用“空格”来隔开。

arr_number=(    )

    b、字符串类型数组,同样,使用一对括号表示数组,其中数组中的元素使用双引号或者单引号包含,同样使用“空格”来隔开。

arr_string=("abc" "edf" "sss"); 或者 arr_string=('abc' 'edf' 'sss');

  2、数组的操作

    a、获取数组长度,arr_length=${#arr_number[*]}或${#arr_number[@]}均可,即形式:${#数组名[@/*]} 可得到数组的长度。

[root@wohaoshuai1 script]# a=(    )
[root@wohaoshuai1 script]# echo "${#a[*]}" [root@wohaoshuai1 script]# echo "${#a[@]}"

    b、读取某个下标的值,arr_index2=${arr_number[2]},即形式:${数组名[下标]}

[root@wohaoshuai1 script]# a=(    )
[root@wohaoshuai1 script]# echo "${a[2]}"

    c、对某个下标赋值。

      1)、若下标元素已经存在那么会修改该下标的值为新的指定值。

[root@wohaoshuai1 script]# a=(    )
[root@wohaoshuai1 script]# a[]=
[root@wohaoshuai1 script]# echo ${a[*]} [root@wohaoshuai1 script]# echo ${a[@]}

      2)、如果指定的下标已经超过当前数组的大小,如上述的a的大小为5,指定下标为10或者11或者大于5的任意值那么新赋的值会被追加到数组的尾部。

[root@wohaoshuai1 script]# a=(    )
[root@wohaoshuai1 script]# a[]=
[root@wohaoshuai1 script]# echo ${a[*]} [root@wohaoshuai1 script]# echo ${a[@]} [root@wohaoshuai1 script]# a[]=
[root@wohaoshuai1 script]# echo ${a[@]} [root@wohaoshuai1 script]# echo "${a[10]}" [root@wohaoshuai1 script]# echo "${a[5]}"

    d、删除操作

      1)、清空某个元素

[root@wohaoshuai1 script]# a=(    )
[root@wohaoshuai1 script]# unset a[]
[root@wohaoshuai1 script]# echo "${a[*]}"

      2)、清空整个数组

[root@wohaoshuai1 script]# a=(    )
[root@wohaoshuai1 script]# unset a
[root@wohaoshuai1 script]# echo "${a[*]}"

    e、分片访问,分片访问形式为:${数组名[@或*]:开始下标:结束下标},注意,不包括结束下标元素的值。

      1)、从索引2开始访问,访问4个,如果个数不够默认会访问到最后一个

[root@wohaoshuai1 script]# a=(    )
[root@wohaoshuai1 script]# echo ${a[@]::}

    f、模式替换,形式为:${数组名[@或*]/模式/新值}

[root@wohaoshuai1 script]# a=("aa","bb","cc","aa")
[root@wohaoshuai1 script]# echo ${a[@]/aa/x}
x,bb,cc,aa
[root@wohaoshuai1 script]# echo ${a[@]//aa/x}
x,bb,cc,x
[root@wohaoshuai1 script]# echo ${a[@]}
aa,bb,cc,aa

    g、数组的遍历

#!/bin/bash

b=(aa bb cc dd ee)
for i in ${b[@]}
do
echo ${i}
done

执行结果:

[root@wohaoshuai1 script]# sh .sh
aa
bb
cc
dd
ee

九、Shell字符串处理

  1、获取字符串长度

[root@wohaoshuai1 script]# str="abcdefg"
[root@wohaoshuai1 script]# echo "${#str}"

  2、对字符串进行大小写转换

    a、将变量值中的小写字母转换为大写

[root@wohaoshuai1 script]# echo "${str}"
abcdefg
[root@wohaoshuai1 script]# echo "${str^^}"
ABCDEFG

    b、将变量中的大写字母转换为小写

[root@wohaoshuai1 script]# echo "${str}"
ABCDEFG
[root@wohaoshuai1 script]# echo "${str,,}"
abcdefg

  3、当变量值为空或非空时操作变量

    a、${var:=value},意思为如果var为空则返回value,并将value赋给var,如果var不为空则返回var本身的值,var不为空时,var值不会被改变,var为空时,var的值会被设置成指定值。

#!/bin/bash
a="wohaoshuai"
b=${a:=""} echo -e "b为:${b}\n" c=${d:=""}
echo -e "c为:${c}\n"
echo -e "d为:${d}\n"

执行结果:

[root@wohaoshuai1 script]# sh .sh
b为:wohaoshuai c为: d为:

    b、${var:-value},意思为如果var为空,则返回value,如果var不为空,则返回var的值,无论var是否为空,var本身的值不会改变。

#!/bin/bash
a="wohaoshuai"
b=${a:-""} echo -e "b为:${b}\n" c=${d:-""}
echo -e "c为:${c}\n"
echo -e "d为:${d}\n"

执行结果:

[root@wohaoshuai1 script]# sh .sh
b为:wohaoshuai c为: d为:

    c、${var:+value},意思为如果var不为空,则返回value,如果var为空,则返回空值,无论var是否为空var本身的值不会改变。

#!/bin/bash
a="wohaoshuai"
b=${a:+""} echo -e "b为:${b}\n" c=${d:+""}
echo -e "c为:${c}\n"
echo -e "d为:${d}\n"

执行结果为:

[root@wohaoshuai1 script]# sh .sh
b为: c为: d为:

    d、${var:?error_info},意思为如果var为空,那么在当前终端打印error_info,如果var的值不为空,则返回var的值,无论var是否为空,var本身的值都不会改变。

#!/bin/bash
a="wohaoshuai"
b=${a:?""} echo -e "b为:${b}\n" c=${d:? "err"}
echo -e "c为:${c}\n"
echo -e "d为:${d}\n"

执行结果:

[root@wohaoshuai1 script]# sh .sh
b为:wohaoshuai .sh: line : d: err

  4、从指定位置截取字符串,截取到字符串的末尾。

    a、从正数第四个字符以后开始截取,直到字符串的末尾(从0开始计数)

[root@wohaoshuai1 script]# a="abcdefg"
[root@wohaoshuai1 script]# echo ${a:}
efg

    b、从倒数第四个字符开始截取,直到字符串的末尾。并且冒号与负号之间必须存在任意字符(通常使用0或空格占位,当然用其它字符也可以),否则无法起到截取字符串的作用。

[root@wohaoshuai1 script]# echo ${a:-}
defg
[root@wohaoshuai1 script]# echo ${a: -}
defg
[root@wohaoshuai1 script]# echo ${a:b-}
defg

  5、从指定位置截取字符串,并且截取指定的长度

    a、从第四个字符以后开始截取,截取五个字符

[root@wohaoshuai1 script]# a="abcdefghijklmn"
[root@wohaoshuai1 script]# echo ${a::}
efghi

    b、从倒数第八个开始截取,截取5个字符

[root@wohaoshuai1 script]# echo ${a:-:}
ghijk
[root@wohaoshuai1 script]# echo ${a:b-:}
ghijk
[root@wohaoshuai1 script]# echo ${a: -:}
ghijk

    c、Centos7中截取长度可以为负数,Centos6中不行,Centos7从正数第四个字符以后开始截取到字符串末尾,再将截取后的字符串的最后3个字符删除。

[root@wohaoshuai1 script]# echo ${a:}
efghijklmn
[root@wohaoshuai1 script]# echo ${a::-}
efghijk

    d、Centos7从倒数第四个字符开始截取,截取到字符串的末尾,再将截取后的字符串的最后一个字符删除。

[root@wohaoshuai1 script]# echo ${a:-}
klmn
[root@wohaoshuai1 script]# echo ${a:-:-}
klm

  6、替换字符串操作

    a、将变量值中第一个遇到的str1替换成str2

[root@wohaoshuai1 script]# a="www"
[root@wohaoshuai1 script]# echo ${a/w/abc}
abcww

    b、将变量值中的所有遇到的str1替换成str2

[root@wohaoshuai1 script]# echo ${a//w/abc}
abcabcabc

Shell 编程详解的更多相关文章

  1. Linux主要shell命令详解(上)

    [摘自网络] kill -9 -1即实现用kill命令退出系统 Linux主要shell命令详解 [上篇] shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的 ...

  2. HBase 协处理器编程详解,第二部分:客户端代码编写

    实现 Client 端代码 HBase 提供了客户端 Java 包 org.apache.hadoop.hbase.client.coprocessor.它提供以下三种方法来调用协处理器提供的服务: ...

  3. Shell test命令(Shell [])详解,附带所有选项及说明

    test 是 Shell 内置命令,用来检测某个条件是否成立.test 通常和 if 语句一起使用,并且大部分 if 语句都依赖 test. test 命令有很多选项,可以进行数值.字符串和文件三个方 ...

  4. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  5. Linux串口编程详解(转)

    串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...

  6. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  7. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  8. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

  9. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

    原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...

随机推荐

  1. Vue——报错总结

    [Vue warn]: Cannot find element: #app [报错原因] 1. 把对应js放在了head标签里面,页面没有加载完成就进行渲染,导致找不到#app. 2.加了<te ...

  2. Codeforces Round #513 总结

    首次正式的$Codeforces$比赛啊,虽然滚粗了,然而终于有$rating$了…… #A  Phone Numbers 签到题,然而我第一次写挂了(因为把11看成8了……) 只需要判断一下有多少个 ...

  3. [HackerRank]New Year Chaos[UNDONE]

    Input (stdin)Download 2 8 5 1 2 3 7 8 6 4 8 1 2 5 3 7 8 6 4 Your Output (stdout) Too chaotic Too cha ...

  4. I2C 总线原理与架构

    一.I2C总线原理 I2C是一种常用的串行总线,由串行数据线SDA 和串行时钟线SCL组成.I2C是一种多主机控制总线,它和USB总线不同,USB是基于master-slave机制,任何设备的通信必须 ...

  5. mysql日志分析工具之mysqlsla

    背景介绍: 很多情况下,都需要对MySQL日志进行各种分析,来了解系统运行的方方面面.MySQL官方自带了一些工具对日志进行分析,比如mysqlbinlog可以用来分析二进制日志,mysqlslow可 ...

  6. 欧拉筛法模板and 洛谷 P3383 【模板】线性筛素数(包括清北的一些方法)

    题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入格式 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行包含一个不小于1 ...

  7. 一文读懂ES6(附PY3对比)

      Ⅰ.ES6~POP¶ 代码示例:https://github.com/lotapp/BaseCode/tree/master/javascript/1.ES6 在线演示:https://githu ...

  8. python xpath学习

    一.选取节点: 二.谓词: 注意:在scrapy中用xpath进行搜索时,如果使用相对路径,要加上.,如,不然搜索的是整个文档.

  9. Java Web项目中解决中文乱码方法总结

    一.了解常识: 1.UTF-8国际编码,GBK中文编码.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.web tomcat:默认是ISO8859-1,不 ...

  10. WEB-INF 目录

    WEB-INF 目录是必须的,其中包括: web.xml 文件,该 Web 基本配置,必须. classes 目录,存放 .class 文件,当然也可以将 .java 文件一并放进去. lib 目录, ...