本文参考链接:http://www.runoob.com/linux/linux-shell.html
基本说明
Shell脚本(shell script)是一种为shell编写的脚本程序。其中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)
- ......
Shell脚本文件命名没有特殊要求,跟Linux的要求一样就行,至于文件一般以.sh作为后缀以区分其他文件类型。不加后缀或使用其他后缀也行,只要里面的文本内容符合Shell脚本格式要求就行。
Shell脚本格式要求:第一行开头必须以#!开头,这告诉系统其后的路径(即上面说的不同类型的脚本环境(解析器)的路径)所指定的程序即是解释此脚本文件的 Shell 程序。
一个简单的Shell脚本如下:
#!/bin/bash //告诉系统这行以下的命令都使用/bin/bash环境执行 echo "Hello World !" //输出字符串
运行Shell脚本的方法:
1、脚本文件名作为解析器的参数
root@454009d432a4:/workdir# bash test.sh //使用bash命令执行test.sh脚本 hello world! //脚本输出结果
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
2、作为可执行程序
将文件添加x可执行权限,直接运行文件。
这种脚本执行方式有一点必须注意,就是Linux只能执行格式为unix格式的脚本,如果脚本是在windows下编辑传到Linux系统下执行的话文件的格式为doc格式。
要解决这种问题只要将文本格式转换为unix即可。具体方法为使用vi编辑器打开文件,在命令模式中使用命令:set ff=unix修改后保存退出或者直接使用dos2unix 命令执行 dos2unix test.sh 即可:
#!/bin/bash echo "hello world!"
~
~
:set ff=unix
具体实行命令如下:
root@454009d432a4:/workdir# cd /workdir //进入文件所在目录
root@454009d432a4:/workdir# chmod +x ./test.sh
root@454009d432a4:/workdir# ./test.sh bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
变量使用
定义变量时,变量名不加美元符号($,PHP语言中变量需要)
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线"_"
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
#!/bin/bash echo '----------------------------------------------------' # 变量使用 name="walter" echo "hello ${name}!" # 标识变量为只读 # readonly name # 标识为readonly的变量不能修改包括unset # 删除变量 unset name name="666" echo "hello ${name}" echo '----------------------------------------------------' # 字符串使用 # Shell字符串单双引号 # 单引号内的字符都是原样输出,不能变量注入。 # 单引号内可以出现任意双引号,原样输出。 # 而且单引号内不能存在单独的单引号,如果是一对单引号则会作为字符串拼接的功能出现 # 单引号内不支持单引号转义输出 str='I am ${name} "long time no see" ' echo $str # 双引号内的字符可以使用${}进行变量注入。 # 双引号内可以出现任意单引号,原样输出。 # 而且双引号内不能存在单独的双引号,如果是一对双引号则会作为字符串拼接的功能出现 # 双引号内支持双引号的转义输出 str="I'm ${name} \"long time no see\" " echo $str # 获取字符串长度 echo ${#str} # 截取字符串从索引1开始截取一直截取6个字符 echo ${str:1:6} # 反引号的使用:将反引号(` `)内的字符串当作shell命令来执行,返回值是命令的执行的结果,起到的是一个命令的替换作用 echo `expr index "$str" l6` echo '----------------------------------------------------' # 数组使用 # bash只支持以为数组,不限定数组大小 # 数组索引由0开始 # 数组定义用括号表示,数组中元素用空格分割 name_list=(walter check ford lucy) # 也可以这样 name_list=( walter check ford lucy ) name_list[0]=walter name_list[1]=check name_list[2]=ford name_list[3]=lucy echo ${name_list[0]} echo ${name_list[1]} echo ${name_list[2]} echo ${name_list[3]} # 默认返回第一个数组值 echo $name_list # [0]会作为一个独立的字符串输出,跟前面的$name_list没关系 echo $name_list[0] # 使用@或*符号可以获取数组中的所有元素 echo ${name_list[*]} echo ${name_list[@]} # 取得数组元素的个数 echo ${#name_list[@]} # 或者 echo ${#name_list[*]} # 取得数组单个元素的长度