【Linux123】Shell脚本编程

参考:

http://home.ustc.edu.cn/~xie1993/linux/linux-shell.html

https://www.cnblogs.com/andy-zhou/p/5321839.html

https://www.cnblogs.com/chengjian-physique/p/10816465.html

Shell 编程

Shell 教程Shell 变量Shell echo命令Shell test命令Shell 流程控制Shell 函数

1.

 

vi test.sh

扩展名并不影响脚本执行,见名知意就好

常见: sh, php

2.

"#!" 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。

#!/bin/bash
echo "Hello World !"

Linux的Shell种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)
  • ……

本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用。同时,Bash也是大多数Linux系统默认的Shell。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为#!/bin/bash

在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的。使用chsh命令可以改变默认的shell。

3.

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

./”告诉系统说,就在当前目录找

4.

直接运行解释器,其参数就是shell脚本的文件名,如:

/bin/sh test.sh
/bin/php test.php

这种方式运行的脚本,不需要在第一行指定解释器信息(写了也没用)。

5.

在shell脚本中,我们可以使用两种类型的变量:

  • 系统定义变量
  • 用户定义变量

系统变量是由系统系统自己创建的。这些变量通常由大写字母组成,可以通过“set”命令查看。
用户变量由系统用户来生成和定义:

your_name="w3cschool.cc"

注意,变量名和等号之间不能有空格

变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

还可以用语句给变量赋值

for file in `ls /etc`    #将 /etc 下目录的文件名循环出来

6.

使用一个定义过的变量,即做右值,只要在变量名前面加美元符号$即可。(当左值被赋值时,不带$)。

echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

for skill in Ada Coffe Action Java do
    echo "I am good at ${skill}Script"
done

7.

字符串可以用单引号,也可以用双引号,也可以不用引号。

str=‘this is a string‘

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
str="Hello, I know your are \"$your_name\"! \n"

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

8.

拼接字符串

greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

获取字符串长度

string="abcd"
echo ${#string} #输出 4

提取子字符串

string="alibaba is a great company"
echo ${string:1:4} #输出liba

查找子字符串

string="alibaba is a great company"
echo `expr index "$string" is`

9.

在Shell中,用括号来表示数组,数组元素用"空格"或"换行"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)

还可以单独定义数组的各个分量,而且下标的范围没有限制

10.

读取数组

读取数组元素值的一般格式是:

${数组名[下标]}

例如:

valuen=${array_name[n]}

使用@符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

11.

以"#"开头的行就是注释。

sh里只有单行注释,没有多行注释,只能每一行加一个#号。

Tips:

每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

12.

echo命令,用于字符串的输出,还可以使用echo实现更复杂的输出格式控制。

13.

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量。

14.

换行符: \n

不换行: \c

15.

输出重定向:

echo "It is a test" > myfile   #输出至myfile文件中

16.

显示命令执行结果

echo `date`

结果将显示当前日期

Thu Jul 24 10:08:46 CST 2014

17.

------------恢复内容开始------------

参考:

http://home.ustc.edu.cn/~xie1993/linux/linux-shell.html

https://www.runoob.com/linux/linux-command-manual.html

https://www.cnblogs.com/andy-zhou/p/5321839.html

Shell 编程

Shell 教程Shell 变量Shell echo命令Shell test命令Shell 流程控制Shell 函数

 Linux 教程

1.

 

vi test.sh

扩展名并不影响脚本执行,见名知意就好

常见: sh, php

2.

"#!" 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。

#!/bin/bash
echo "Hello World !"

Linux的Shell种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)
  • ……

本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用。同时,Bash也是大多数Linux系统默认的Shell。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为#!/bin/bash

在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的。使用chsh命令可以改变默认的shell。

3.

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

./”告诉系统说,就在当前目录找

4.

直接运行解释器,其参数就是shell脚本的文件名,如:

/bin/sh test.sh
/bin/php test.php

这种方式运行的脚本,不需要在第一行指定解释器信息(写了也没用)。

5.

在shell脚本中,我们可以使用两种类型的变量:

  • 系统定义变量
  • 用户定义变量

系统变量是由系统系统自己创建的。这些变量通常由大写字母组成,可以通过“set”命令查看。
用户变量由系统用户来生成和定义:

your_name="w3cschool.cc"

注意,变量名和等号之间不能有空格

变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

还可以用语句给变量赋值

for file in `ls /etc`    #将 /etc 下目录的文件名循环出来

6.

使用一个定义过的变量,即做右值,只要在变量名前面加美元符号$即可。(当左值被赋值时,不带$)。

echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

for skill in Ada Coffe Action Java do
    echo "I am good at ${skill}Script"
done

7.

字符串可以用单引号,也可以用双引号,也可以不用引号。

str=‘this is a string‘

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
str="Hello, I know your are \"$your_name\"! \n"

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

8.

拼接字符串

greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

获取字符串长度

string="abcd"
echo ${#string} #输出 4

提取子字符串

string="alibaba is a great company"
echo ${string:1:4} #输出liba

查找子字符串

string="alibaba is a great company"
echo `expr index "$string" is`

9.

在Shell中,用括号来表示数组,数组元素用"空格"或"换行"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)

还可以单独定义数组的各个分量,而且下标的范围没有限制

10.

读取数组

读取数组元素值的一般格式是:

${数组名[下标]}

例如:

valuen=${array_name[n]}

使用@符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

11.

以"#"开头的行就是注释。

sh里只有单行注释,没有多行注释,只能每一行加一个#号。

Tips:

每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

12.

echo命令,用于字符串的输出,还可以使用echo实现更复杂的输出格式控制。

13.

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量。

14.

换行符: \n

不换行: \c

15.

输出重定向:

echo "It is a test" > myfile   #输出至myfile文件中

16.

显示命令执行结果

echo `date`

结果将显示当前日期

Thu Jul 24 10:08:46 CST 2014

17.

------------恢复内容开始------------

参考:

http://home.ustc.edu.cn/~xie1993/linux/linux-shell.html

https://www.cnblogs.com/andy-zhou/p/5321839.html

Shell 编程

Shell 教程Shell 变量Shell echo命令Shell test命令Shell 流程控制Shell 函数

1.

 

vi test.sh

扩展名并不影响脚本执行,见名知意就好

常见: sh, php

2.

"#!" 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。

#!/bin/bash
echo "Hello World !"

Linux的Shell种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)
  • ……

本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用。同时,Bash也是大多数Linux系统默认的Shell。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为#!/bin/bash

在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的。使用chsh命令可以改变默认的shell。

3.

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

./”告诉系统说,就在当前目录找

4.

直接运行解释器,其参数就是shell脚本的文件名,如:

/bin/sh test.sh
/bin/php test.php

这种方式运行的脚本,不需要在第一行指定解释器信息(写了也没用)。

5.

在shell脚本中,我们可以使用两种类型的变量:

  • 系统定义变量
  • 用户定义变量

系统变量是由系统系统自己创建的。这些变量通常由大写字母组成,可以通过“set”命令查看。
用户变量由系统用户来生成和定义:

your_name="w3cschool.cc"

注意,变量名和等号之间不能有空格

变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

还可以用语句给变量赋值

for file in `ls /etc`    #将 /etc 下目录的文件名循环出来

6.

使用一个定义过的变量,即做右值,只要在变量名前面加美元符号$即可。(当左值被赋值时,不带$)。

echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

for skill in Ada Coffe Action Java do
    echo "I am good at ${skill}Script"
done

7.

字符串可以用单引号,也可以用双引号,也可以不用引号。

str=‘this is a string‘

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
str="Hello, I know your are \"$your_name\"! \n"

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

8.

拼接字符串

greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

获取字符串长度

string="abcd"
echo ${#string} #输出 4

提取子字符串

string="alibaba is a great company"
echo ${string:1:4} #输出liba

查找子字符串

string="alibaba is a great company"
echo `expr index "$string" is`

9.

在Shell中,用括号来表示数组,数组元素用"空格"或"换行"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)

还可以单独定义数组的各个分量,而且下标的范围没有限制

10.

读取数组

读取数组元素值的一般格式是:

${数组名[下标]}

例如:

valuen=${array_name[n]}

使用@符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

11.

以"#"开头的行就是注释。

sh里只有单行注释,没有多行注释,只能每一行加一个#号。

Tips:

每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

12.

echo命令,用于字符串的输出,还可以使用echo实现更复杂的输出格式控制。

13.

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量。

14.

换行符: \n

不换行: \c

15.

输出重定向:

echo "It is a test" > myfile   #输出至myfile文件中

16.

显示命令执行结果

echo `date`

结果将显示当前日期

Thu Jul 24 10:08:46 CST 2014

17.

test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

Shell还提供了与( ! )、或( -o )、非( -a )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。

数值测试

参数说明
-eq等于则为真
-ne不等于则为真
-gt大于则为真
-ge大于等于则为真
-lt小于则为真
-le小于等于则为真

字符串测试

参数说明
=等于则为真
!=不相等则为真
-z 字符串字符串长度伪则为真
-n 字符串字符串长度不伪则为真

文件测试

参数说明
-e 文件名如果文件存在则为真
-r 文件名如果文件存在且可读则为真
-w 文件名如果文件存在且可写则为真
-x 文件名如果文件存在且可执行则为真
-s 文件名如果文件存在且至少有一个字符则为真
-d 文件名如果文件存在且为目录则为真
-f 文件名如果文件存在且为普通文件则为真
-c 文件名如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真

18. 

if else-if else

if else-if else 语法格式:

if condition1
then
    command1
elif condition2
    command2
else
    commandN
fi

19.

for循环一般格式为:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

写成一行:

for var in item1 item2 ... itemN; do command1; command2… done;

20.

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

while condition
do
    command
done

无限循环语法格式:

while :
do
    command
done

或者

while true
do
    command
done

或者

for (( ; ; ))

21.

一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。

until 语法格式:

until condition
do
    command
done

条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。

22.

case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。 

 23.

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。

break命令允许跳出所有循环(终止执行后面的所有循环)。

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

 24.

shell中函数的定义格式如下:

[ function ] funname [()]

{

    action;

    [return int;]

}

说明:

  • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

25.

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 ${n} 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

 注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

26.

还有几个特殊字符用来处理参数:

参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
与$#相同,但是使用时加引号,并在引号中返回每个参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

 27.

1、文件管理
2、文档编辑
3、文件传输
4、磁盘管理
5、磁盘维护
6、网络通讯
7、系统管理
8、系统设置
9、备份压缩
10、设备管理

 28.

 getops

 getopts的使用

语法格式:getopts [option[:]] [DESCPRITION] VARIABLE

option:表示为某个脚本可以使用的选项 ":":如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)。

VARIABLE:表示将某个选项保存在变量VARIABLE中。

getopts是linux系统中的一个内置变量,一般用在循环中。每当执行循环是,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,否则不是合法选项。并将这些合法选项保存在VARIABLE这个变量中。 getopts还包含两个内置变量,及OPTARG和OPTIND OPTARG就是将选项后面的参数(或者描述信息DESCPRITION)保存在这个变量当中。 OPTIND:这个表示命令行的下一个选项或参数的索引(文件名不算选项或参数)