shell好像很有用,虽然我不大明白用来干啥的,好像是有很多可以调用系统参数的变量,所以适合在Linux写脚本?
菜鸟教程是用的bash,那我就照着来吧
第一行基本都是#!/bin/sh
或者#!/bin/bash
打头,告诉系统脚本用什么解释器执行,然后文件记得加上可执行的权限
另外如果是在当前目录执行文件,记得以./开头,否则回去PATH里面搜索文件,一般是搜索不到的
还有一种脚本执行方法是/bin/sh xx.sh
,即你的第一行可以省略了,直接运行解释器执行脚本了
变量
变量和PHP差不多,不过不加$符号,变量声明要记住=左右别加空格了,这和PHP是不一样的,然后使用变量就要在前面加上$符号
如
name="what";
echo "hello $what";
echo "${what} yet;
和PHP一样,输出的时候可以加{}来标识变量,以防止和其他字符串混淆
变量是可以修改的,name="so"
,就把what替换成了so,
另外shell还有只读变量的设定,readonly name
,这样就无法进行变量的修改了
删除变量使用unset,unset name
就可以删除了,当然如果根据我写的一路执行下来是会报错的,因为只读变量无法删除
变量类型除了常见的局部变量外,shell没有全局变量的概念,而是多了环境变量和shell变量,当然局部变量的定义也和其他语法有所区别
- 局部变量:脚本或者命令行定义,仅在当前shell实例中生效
- 环境变量:所有程序,包括shell启动的程序都能访问
- shell变量:由shell程序设置,一部分是局部变量,一部分是环境变量
Shell数据类型
Shell字符串
单引号和双引号的区别和PHP差不多,双引号里面可以有变量存在,另外,单引号里面单引号不能单独出现,就算是转义字符的单引号也不可以
shell拼接字符串只要往后面写变量就可以了,不用别的符号"this is"$name
,空格加在is后面或者$name前面都是可以生效的
获取字符串长度用echo ${#name}
,提取字符串有点类似切片,echo ${name:1:2}
,输出ha
查找子字符串可以用echo `expr index "$name" ha`;
来实现
Shell数组
貌似只有索引数组,没得关联数组,键是字符串的话,会作为0覆盖掉,然后可以不使用连续的下标
数组定义有下面几种,主要是空格隔开每个值;输出则是引用下标,只不过方便的是可以用@全部输出出来
arr=("a" 1 "b");
arr[0]="what"
arr[1]="so"
echo ${arr[0]}
echo ${arr[@]}
可以用${#arr[@]}
或者${#arr[*]}
获取数组个数,也可以用${#arr[0]}
获取单个元素的长度
Shell注释
单行注释用#
就可以了,如果是多行注释,就有点类似PHP的heredoc了
:<<EOF
a
b
c
EOF
EOF是可以用别的替换的,和heredoc区别主要是开头是:
Shell传递参数
传递参数只需要在执行文件的后面空格+参数就可以了,譬如./hello.sh 1 2 3
,这里就给了三个参数给脚本。
要在脚本使用参数则是$+数字来获取,不过$0
代表的是脚本本身,即./hello.sh
,而$1 $2 $3
也就是后面所跟随的参数,如果下标溢出,则输出一个空行(Shell好像没null这个类型,不知道将这空行理解为空字符串正不正确)
其中几个特殊字符处理参数,由于都是$开头,我就省略这个符号了
- #:传递到脚本的参数个数
- *:把参数作为字符串一起传递,相当于输出
$1$2$3……
- $:脚本运行的当前进程ID号
- !:后台运行的最后一个进程ID号
- @:显示和*是一样的,不过他输出的是单独的字符串,相当于
"$1""$2""$3"……
这样子 - -:Shell使用的当前选项
-
?:显示最后命令的退出状态。0表示没有错误