部分引用自: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. 2.1 re 模块

    正则表达式 简单的范围的字符组 字符 量词 字符集 分组 转义字符 flags 方法  .findall() .finditer() .search() .match()  .sub() .subn( ...

  2. Addrss already in user 解决方案 (linux)

    Addrss already  in user 解决方案 查pid netstat -lptu 查看当前用户的进程 pid kill -9 pid 杀进程 重复上面步骤一次, 因为一遍杀不死.他会换一 ...

  3. l2tp pptp相关的一些记录

    添加用户名和密码 echo "user l2tpd password *">>/etc/ppp/chap-secrets /etc/ipsec.conf dpddela ...

  4. pc安装完成charles成功,小米安装crt证书失败

    问题描述: 今天在学习爬虫爬取APP内容时,需要安装crt证书.根据静谧大大的书,前面都挺顺利的.但在我的小米手机上安装crt证书时,出现了错误.手机显示无法安装. 解决之道: 1.不要用小米手机自带 ...

  5. Oracle Database 快捷版 安装 连接

    Oracle Database 快捷版 11g 第 2 版 下载地址:http://www.oracle.com/technetwork/cn/database/database-technologi ...

  6. (二分查找 拓展) leetcode278. First Bad Version

    You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...

  7. Docker:dockerfile构建php项目 [八]

    一.把项目封装成docker镜像的步骤 把项目封装成docker镜像的步骤: 1.先运行一个基础容器,手动制作docker镜像 2.编写dockerfile,构建镜像 3.测试运行 二.dockerf ...

  8. ArcGis地理坐标系转投影坐标系问题的思考与处理

    博主又不知道标题该咋写了,凑合看吧. 国庆前帮人处理了这样一个问题:Shapefile数据,加载到ArcMap后呈懵逼状态,缩放功能完蛋.求助者希望对数据进行投影,由CGCS2000的GCS坐标系投影 ...

  9. Nginx web 服务器 安装篇

    Nginx介绍: 静态web服务器有Nginx .Apache .lighttpd等 目前国内用的最常见的就是Nginx 和Apache 是一个开源的.支持高性能.高并发的www服务和代理服务软件,N ...

  10. windows连接oracle数据库

    本以为很简单,结果发现还是有些坑啊 1. 安装cx_oracle pip install cx_oracle 或者用whi文件,这样你能知道版本号那些https://www.lfd.uci.edu/~ ...