概述
-
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
-
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
-
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell 脚本
-
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
-
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
Shell 环境
-
Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
-
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。
-
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
first shell 脚本
#!/bin/bash
echo "Hello World !"
- 运行时需要修改执行权限
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
shell变量
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
使用变量
- 使用一个定义过的变量,只要在变量名前面加美元符号即可;
- 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
#!/bin/bash
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
结果:
qinjx
qinjx
I am good at AdaScript
I am good at CoffeScript
I am good at ActionScript
I am good at JavaScript
- 只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"
会报错
- 删除变量:变量被删除后不能再次使用。unset 命令不能删除只读变量。
#!/bin/sh
myUrl="http://www.runoob.com"
unset myUrl
echo $myUrl
没有输出!!
shell 字符串
-
单引号
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
-
双引号
-
双引号的优点:
-
双引号里可以有变量
-
双引号里可以出现转义字符
-
your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo $str
结果:
Hello, I know you are "runoob"!
- 拼接字符串
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 ! hello, ${your_name} !
- 获取字符串长度
string="abcd"
echo ${#string} #输出 4
- 提取子字符串
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
- 查找子字符串
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
注意: 以上脚本中 ` 是反引号,而不是单引号 ’
shell 数组
-
用括号来表示数组,数组元素用"空格"符号分割开。
数组名=(值1 值2 … 值n)
-
读取数组
${数组名[下标]}
-
使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
shell 注释
- 用 #
- 多行如下:
EOF 可以使用其他符号
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
:<<、
注释内容...
注释内容...
注释内容...
、
:<<!
注释内容...
注释内容...
注释内容...
!
PS: 以上是最基本的shell 知识。
补充
- Linux 的字符串截取很有用。有八种方法。
假设有变量 var=http://www.aaa.com/123.htm
- …# 号截取,删除左边字符,保留右边字符。
echo ${var#*//}
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm
- …## 号截取,删除左边字符,保留右边字符。
echo ${var##*/}
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
结果是 123.htm
- %号截取,删除右边字符,保留左边字符
echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
- %% 号截取,删除右边字符,保留左边字符
echo ${var%%/*}
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:
- 从左边第几个字符开始,及字符的个数
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
- 从左边第几个字符开始,一直到结束。
echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm
- 从右边第几个字符开始,及字符的个数
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123
- 从右边第几个字符开始,一直到结束。
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。
结果是:123.htm
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
- 计算字符长度也可以使用 length:
string=“hello,everyone my name is xiaoming”
expr length “$string”
输出:34
注意:string字符串里边有空格,所以需要添加双引号
使用 expr 命令时,表达式中的运算符左右必须包含空格,如果不包含空格,将会输出表达式本身:
expr 5+6 // 直接输出 5+6
expr 5 + 6 // 输出 11
对于某些运算符,还需要我们使用符号""进行转义,否则就会提示语法错误。
expr 5 * 6 // 输出错误
expr 5 \* 6 // 输出30
- read 命令用于获取键盘输入信息
它的语法形式一般是:
read [-options] [variable…]
以下实例读取键盘输入的内容并将其赋值给shell变量,为:-p 参数由于设置提示信息:
read -p “input a val:” a #获取键盘输入的 a 变量数字
read -p “input b val:” b #获取键盘输入的 b 变量数字
r=$[a+b] #计算a+b的结果 赋值给r 不能有空格
echo “result = ${r}” #输出显示结果 r
测试结果:
input a val:1
input b val:2
result = 3