shell脚本编写简易教程
⽤了caffe有⼀段时间了,感觉⾃⼰写shell脚本的能⼒有待提⾼,特地从处系统的看了⼀遍,其实学习基础就可,内容也不多,我就不总结了。把⽹站上的内容⽤markdown重新编辑了⼀下,各位可以根据需要看看;
第⼀个shell脚本:
打开⽂本编辑器(可以使⽤ vi/vim 命令来创建⽂件),新建⼀个⽂件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执⾏,见名知意就好,如果你⽤ php 写 shell 脚本,扩展名就⽤ php 好了。
#!/bin/bash
echo "Hello World !"
#! 是⼀个约定的标记,它告诉系统这个脚本需要什么解释器来执⾏,即使⽤哪⼀种 Shell。
echo 命令⽤于向窗⼝输出⽂本。
运⾏shell脚本的两个⽅法:
1.作为可执⾏程序:
将上⾯的代码保存为 test.sh,并 cd 到相应⽬录:
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.作为解释器参数:
这种运⾏⽅式是,直接运⾏解释器,其参数就是 shell 脚本的⽂件名,如:
/bin/sh test.sh
/bin/php test.php
shell变量
定义变量时,变量名不加美元符号($,PHP语⾔中变量需要),如:
your_name="runoob"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语⾔都不⼀样。同时,变量名的命名须遵循如下规则:
命名只能使⽤英⽂字母,数字和下划线,⾸个字符不能以数字开头。
中间不能有空格,可以使⽤下划线(_)。
不能使⽤标点符号。
不能使⽤bash⾥的关键字(可⽤help命令查看保留关键字)。
除了显式地直接赋值,还可以⽤语句给变量赋值,如:
for file in `ls /etc` 或  for file in $(ls /etc)
以上语句将 /etc 下⽬录的⽂件名循环出来。
使⽤变量
使⽤⼀个定义过的变量,只要在变量名前⾯加美元符号即可,如:
your_name="qinjx"
echo $your_name
echo ${your_name}
注:变量名外⾯的花括号是可选的,加不加都⾏,加花括号是为了帮助解释器识别变量的边界,推荐给所有变量加上花括号,这是个好的编程习惯。
已定义的变量,可以被重新定义,如:
your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name
这样写是合法的,但注意,第⼆次赋值的时候不能写$ 使⽤变量的时候才加美元符。
只读变量
使⽤ readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
#!/bin/bash
myUrl=""
readonly myUrl
myUrl="www.runoob"
运⾏脚本是会出错。
删除变量
使⽤ unset 命令可以删除变量。语法:
unset variable_name
变量被删除后不能再次使⽤。unset 命令不能删除只读变量。
变量类型
运⾏shell时,会同时存在三种变量:
1) 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运⾏。必要的时候shell脚本也可以定义环境变量。
3) shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有⼀部分是环境变量,有⼀部分是局部变量,这些变量保证了shell的正常运⾏shell字符串
字符串是shell编程中最常⽤最有⽤的数据类型(除了数字和字符串,也没啥其它类型好⽤了),字符
串可以⽤单引号,也可以⽤双引号,也可以不⽤引号。单双引号的区别跟PHP类似。
单引号:
str='this is a string'
单引号字符串的限制:
单引号⾥的任何字符都会原样输出,单引号字符串中的变量是⽆效的;
单引号字串中不能出现单引号(对单引号使⽤转义符后也不⾏)。
双引号:
your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
双引号的优点:
双引号⾥可以有变量
双引号⾥可以出现转义字符
拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
获取字符串长度
string="abcd"
echo ${#string} #输出 4
提取⼦字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
查⼦字符串
查字符 "i 或 s" 的位置:
string="runoob is a great company"
echo `expr index "$string" is`  # 输出 8
注意:以上脚本中 "`" 是反引号,⽽不是单引号 "'",不要看错了哦。
Shell 数组
bash⽀持⼀维数组(不⽀持多维数组),并且没有限定数组的⼤⼩。
类似与C语⾔,数组元素的下标由0开始编号。获取数组中的元素要利⽤下标,下标可以是整数或算术表达式,其值应⼤于或等于0。定义数组
在Shell中,⽤括号来表⽰数组,数组元素⽤"空格"符号分割开。定义数组的⼀般形式为:
数组名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
还可以单独定义数组的各个分量:
array_name[0]=value0
linux循环执行命令脚本array_name[1]=value1
array_name[n]=valuen
可以不使⽤连续的下标,⽽且下标的范围没有限制。
读取数组
读取数组元素值的⼀般格式是:
${数组名[下标]}
例如:
valuen=${array_name[n]}
使⽤@符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
获取数组的长度
获取数组长度的⽅法与获取字符串长度的⽅法相同,例如:
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
Shell 注释
以"#"开头的⾏就是注释,会被解释器忽略。
sh⾥没有多⾏注释,只能每⼀⾏加⼀个#号。只能像这样:
#--------------------------------------------
# 这是⼀个注释
# author:菜鸟教程
# site:www.runoob
# slogan:学的不仅是技术,更是梦想!
#--------------------------------------------
> ⽤户配置区开始 >
#
#
# 这⾥可以添加脚本描述信息
#
#
> ⽤户配置区结束  >
如果在开发过程中,遇到⼤段的代码需要临时注释起来,过⼀会⼉⼜取消注释,怎么办呢?
每⼀⾏加个#符号太费⼒了,可以把这⼀段要注释的代码⽤⼀对花括号括起来,定义成⼀个函数,没有地⽅调⽤这个函数,这块代码就不会执⾏,达到了和注释⼀样的效果。
Shell 传递参数
我们可以在执⾏ Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表⼀个数字,1 为执⾏脚本的第⼀个参数,2 为执⾏脚本的第⼆个参数,以此类推……
实例
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执⾏的⽂件名:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob
echo "Shell 传递参数实例!";
echo "执⾏的⽂件名:$0";
echo "第⼀个参数为:$1";
echo "第⼆个参数为:$2";
echo "第三个参数为:$3";
为脚本设置可执⾏权限,并执⾏脚本,输出结果如下所⽰:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
执⾏的⽂件名:./test.sh
第⼀个参数为:1
第⼆个参数为:2
第三个参数为:3
另外,还有⼏个特殊字符⽤来处理参数:
参数处
说明
$#传递到脚本的参数个数
$*以⼀个单字符串显⽰所有向脚本传递的参数。如"⽤「」括起来的情况、以1 n"的形式输出所有参数。
$$脚本运⾏的当前进程ID号
$!后台运⾏的最后⼀个进程的ID号
$@与相同,但是使⽤时加引号,并在引号中返回每个参数。如@"⽤「"」括起来的情况、以"2" … "$n" 的形式输出所有参数。
$-显⽰Shell使⽤的当前选项,与功能相同。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论