Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
Linux 的 Shell 种类众多。Bash 是大多数 Linux 系统默认的 Shell,因为它易用和免费。
#!/bin/bash
echo "Hello World !"
#!
是一个约定的标记,告诉系统使用的是哪一种 shell。echo
命令用于向窗口输出文本chmod 777 ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
/bin/sh test.sh
str="Hello World!"
使用 $
获取变量的值,例如:
str="Hello World!"
echo $str
echo ${str}
这里推荐给所有的变量都加上花括号,帮助编译器识别变量的边界,也更容易阅读。
使用 readonly 命令将变量设置为只读,只读变量不可以修改。
str="Hello World!"
readonly str
既可以使用单引号也可以使用双引号,如下:
str="Hello World!"
str2='Hello World!'
建议使用双引号,双引号内部可以有变量或转义。对比如下:
能否引用变量 | 能否引用转移符 | 能否引用文本格式符(如:换行符、制表符) | |
---|---|---|---|
单引号 | 否 | 否 | 否 |
双引号 | 能 | 能 | 能 |
name="afei"
str1="hello, "${name}" !"
str2="hello, ${name} !"
echo ${str1} # 输出 hello, afei !
echo ${str2} # 输出 hello, afei !
string="abcd"
echo ${#string} #输出 4
name="afei"
str=${name:1:3}
echo ${str} # 输出 fei
name="afei"
echo `expr index "${name}" e` # 输出 e 所在的位置 2
只支持一维数组,不支持多维数组,使用小括号表示数组,数组元素使用“空格”分开,例如:
strings=("a" "b" "c" "d")
echo ${strings[1]} # 输出 b
echo ${strings[@]} # 输出 a b c d
使用 ${数组名[下标]}
读取,使用 @
符号可以获取数组所有元素,例子见上。
strings=("Hello" " " "World" "!")
echo ${#strings[0]} # 获取单个元素(Hello)的长度,输出 5
echo ${#strings[@]} # 获取整个数组(strings)的长度,输出 4
使用 #
表示单行注释。
可以使用如下格式:
:<
使用 $n
获取,n 表示第几个参数。
例子:
echo $0 # 输出第一个参数(第一个参数是文件名)
echo $1 # 输出第二个参数
echo $2 # 输出第三个参数
执行情况:
$ ./test.sh 1 2
./test.sh
1
2
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$* 相同,但是使用时加引号,并在引号中返回每个参数 |
$- | 显示Shell使用的当前选项,与set命令功能相同 |
$? | 显示最后命令的退出状态。0表示没有错误 |
例子:
echo "参数个数为: $#"
echo "参数为: $*"
echo "参数为: $@"
echo "进程ID为: $$"
echo "后台运行的最后一个进程ID为: $!"
echo "shell使用的当前选项为: $-"
echo "最后命令的退出状态为: $?"
执行情况:
$ ./test.sh a b c
参数个数为: 3
参数为: a b c
参数为: a b c
进程ID为: 3300
后台运行的最后一个进程ID为:
shell使用的当前选项为: hB
最后命令的退出状态为: 0
$*
和 $@
的区别*
是将所有参数作为一个参数看待,@
是每个参数单独看待示例:
echo "--\$* 演示--"
for i in "$*"; do
echo $i
done
echo "--\$@ 演示--"
for i in "$@"; do
echo $i
done
执行情况:
$ ./test.sh a b c
--$* 演示--
a b c
--$@ 演示--
a
b
c