shell教程
目录
1.Shell教程Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 1.1 Shell脚本Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 1.2 Shell环境Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
1.3 第一个Shell脚本(包括运行脚本的方法)打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。 #! /bin/bash echo "Hello World !"
运行Shell脚本的方法1、作为可执行程序 chmod +x ./test.sh #使脚本具有可执行的权限 ./test.sh #执行脚本 注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin,/sbin,/usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。 2、作为解释器参数 /bin/sh test.sh /bin/php test.php 这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。 2、Shell变量2.1 Shell变量定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
有效的 Shell 变量名示例如下: RUNOOB LD_LIBRARY_PATH _var var2 无效的变量命名: ?var=123 user*name=runoob 除了显式地直接赋值,还可以用语句给变量赋值,如: for file in `ls /etc` 或者 for file in $(ls /etc) 以上语句将 /etc 下目录的文件名循环出来。 (1)使用变量使用一个定义过的变量,只要在变量名前面加美元符号即可,如: your_name=‘qinjx‘ echo $your_name echo $(your_name) 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况: for skill in Ada Coffe Action Java; do echo "I am good at ${skill}Script" done 如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。 your_name=‘tom‘ echo $your_name your_name=‘alibaba‘ echo $your_name 这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)。 (2)只读变量使用 #!/bin/bash myUrl="http://www.google.com" readonly myUrl myUrl="http://www.runoob.com" 运行脚本,结果如下: /bin/sh: NAME:This variable is read only. (3)删除变量使用 unset variable_name 变量被删除后不能再次使用。unset 命令不能删除只读变量。 #!/bin/sh myUrl="http://www.runoob.com" unset myUrl echo $myUrl 以上实例执行将没有任何输出。 (4)变量类型运行shell时,会同时存在三种变量:
2.2 Shell字符串字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。 (1)单引号str=‘this is a string‘ 单引号字符串的限制:
(2)双引号your_name=‘runoob‘ str="Hello,I know you are "$your_name"! n" echo $str 输出结果为:
(3)拼接字符串your_name="runoob" # 使用双引号拼接 greeting="hello,"$your_name" !" greeting_1="hello,${your_name} !" echo $greeting $greeting_1 # 使用单引号拼接 greeting_2=‘hello,‘$your_name‘ !‘ greeting_3=‘hello,${your_name} !‘ echo $greeting_2 $greeting_3 输出结果为(没用一个 hello,runoob ! hello,runoob ! hello,runoob ${your_name} ! (4)获取字符串长度string="abcd" echo ${#string} #输出4 (5)提取子字符串以下实例从字符串第 2 个字符开始截取 4 个字符: string="runoob is a great site" echo ${string:1:4} # 输出 unoo (6)查找子字符串查找字符 i 或 o 的位置(哪个字母先出现就计算哪个): string="runoob is a great site" echo `expr index "$string" io` # 输出 4 注意:以上脚本中`是反引号,而不是单引号‘ 。 2.3 Shell数组bash支持一维数组(不支持多维数组),并且没有限定数组的大小。 (1)定义数组在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为: array_name=( value0 value1 value2 value3 ) 还可以单独定义数组的各个分量: array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen 可以不使用连续的下标,而且下标的范围没有限制。 (2)读取数组读取数组元素值的一般格式是: (3)获取数组的长度获取数组长度的方法与获取字符串长度的方法相同,例如: # 取得数组元素的个数 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得数组单个元素的长度 lengthn=${#array_name[n]} 2.4 Shell注释以"#"开头的行就是注释,会被解释器忽略。 (1)单行注释sh里没有多行注释,只能每一行加一个#号。只能像这样: #-------------------------------------------- # 这是一个注释 # author:菜鸟教程 # site:www.runoob.com # slogan:学的不仅是技术,更是梦想! #-------------------------------------------- ##### 用户配置区 开始 ##### # # # 这里可以添加脚本描述信息 # # ##### 用户配置区 结束 ##### 如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢? (2)多行注释多行注释还可以使用以下格式: :<<EOF 注释内容... 注释内容... 注释内容... EOF EOF 也可以使用其他符号: :<<‘ 注释内容... 注释内容... 注释内容... ‘ :<<! 注释内容... 注释内容... 注释内容... ! 3、Shell传递参数我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 实例 #!/bin/bash # author:菜鸟教程 # url:www.runoob.com echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3"; 为脚本设置可执行权限,并执行脚本(在linux终端),输出结果如下所示: $ chmod +x test.sh $ ./test.sh 1 2 3 Shell 传递参数实例! 执行的文件名:./test.sh 第一个参数为:1 第二个参数为:2 第三个参数为:3 另外,还有几个特殊字符用来处理参数: 例如: #!/bin/bash # author:菜鸟教程 # url:www.runoob.com echo "Shell 传递参数实例!"; echo "第一个参数为:$1"; echo "参数个数为:$#"; echo "传递的参数作为一个字符串显示:$*"; 执行脚本,输出结果如下所示: $ chmod +x test.sh $ ./test.sh 1 2 3 Shell 传递参数实例! 第一个参数为:1 参数个数为:3 传递的参数作为一个字符串显示:1 2 3 $* 与 [email?protected] 区别:
#!/bin/bash # author:菜鸟教程 # url:www.runoob.com echo "-- $* 演示 ---" for i in "$*"; do echo $i done echo "-- [email?protected] 演示 ---" for i in "[email?protected]"; do echo $i done 执行脚本,输出结果如下所示: $ chmod +x test.sh $ ./test.sh 1 2 3 -- $* 演示 --- 1 2 3 -- [email?protected] 演示 --- 1 2 3 4、Shell基本运算符Shell 和其他编程语言一样,支持多种运算符,包括:
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。 #!/bin/bash val=`expr 2 + 2` echo "两数之和为 : $val" 执行脚本,输出结果如下所示:
4.1 算术运算符下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20: 算术运算符实例: #!/bin/bash # author:菜鸟教程 # url:www.runoob.com a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a * $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" if [ $a == $b ] then echo "a 等于 b" fi if [ $a != $b ] then echo "a 不等于 b" fi 执行脚本,输出结果如下所示: a + b : 30 a - b : -10 a * b : 200 b / a : 2 b % a : 0 a 不等于 b 注意:
4.2关系运算符关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 #!/bin/bash # author:菜鸟教程 # url:www.runoob.com a=10 b=20 if [ $a -eq $b ] then echo "$a -eq $b : a 等于 b" else echo "$a -eq $b: a 不等于 b" fi if [ $a -ne $b ] then echo "$a -ne $b: a 不等于 b" else echo "$a -ne $b : a 等于 b" fi if [ $a -gt $b ] then echo "$a -gt $b: a 大于 b" else echo "$a -gt $b: a 不大于 b" fi if [ $a -lt $b ] then echo "$a -lt $b: a 小于 b" else echo "$a -lt $b: a 不小于 b" fi if [ $a -ge $b ] then echo "$a -ge $b: a 大于或等于 b" else echo "$a -ge $b: a 小于 b" fi if [ $a -le $b ] then echo "$a -le $b: a 小于或等于 b" else echo "$a -le $b: a 大于 b" fi 执行脚本,输出结果如下所示: 10 -eq 20: a 不等于 b 10 -ne 20: a 不等于 b 10 -gt 20: a 不大于 b 10 -lt 20: a 小于 b 10 -ge 20: a 小于 b 10 -le 20: a 小于或等于 b 5、Shell命令5.1 Shell echo命令Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式: (1) 显示普通字符串
(2)显示转义字符
(3)显示变量
#!/bin/sh read name echo "$name It is a test" 以上代码保存为 test.sh,name 接收标准输入的变量,结果将是: [[email?protected] ~]# sh test.sh OK #标准输入 OK It is a test #输出 read 命令一个一个词组地接收输入的参数,每个词组需要使用空格进行分隔;如果输入的词组个数大于需要的参数个数,则多出的词组将被作为整体为最后一个参数接收。 read firstStr secondStr echo "第一个参数:$firstStr; 第二个参数:$secondStr" 执行测试: $ sh test.sh 一 二 三 四 第一个参数:一; 第二个参数:二 三 四 (4)显示换行echo -e "OK! n" # -e开启转义 echo "It is a test" 输出结果: OK! It is a test (5)显示不换行#!/bin/sh echo -e "OK! c" # -e 开启转义 c 不换行 echo "It is a test" 输出结果: (6)显示结果定向至文件
(7)原样输出字符串,不进行转义或取变量(用单引号)
(8)显示命令执行结果
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |