介绍
Shell有两层意思,一指就是Shell,一个用C语言编写的程序,由其提供一个可视的界面,用户通过输入相应的命令来与操作系统内核进行交互。
另指Shell脚本(业界所说的shell通常是指shell脚本),一种用shell编写的程序,笔者随后所记录的也是有关Shell脚本的知识。
同样,Shell编程指的是编写shell脚本,而非开发Shell自身。
运行环境
一个文本编辑器,一个解释器。
Shell的解释器有许多种,本文所使用的是常见的Bash(Bourne Again Shell)。
Bash是Linux系统默认的解释器,是基于SH(Bourne Shell)而来,SH是Unix默认的解释器,在所有Unix操作系统上都可以使用。在实际使用过程中,不需要过于重视区分二者的区别,所以无论用二者中哪一个解释器,文件名后缀都可以是.sh
Shell脚本运行方式
同其他Python,PHP类似。
/bin/bash xx.sh
作为解释器参数,/bin/bash 为Bash所在路径,xx.sh为文件名。
chmod +x ./xx.sh
./xx.sh
作为程序执行,为xx.sh添加执行权限(./表示xx.sh在当前目录下)。执行xx.sh。
注释:xx.sh文件通常以#!/bin/bash开头,#!告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序,如果采用第一种运行方式,那么此行可以不写,写了也无效,采用第二种运行方式,需要加上此行。注意命令大小写。
变量
变量命名:1字母;2下划线;3不可使用bash里的关键字。
First_Name=”Hello world!”
变量使用:1$;2{};3括号可以省略但是尽量加上避免与非变量混淆。
echo ${First_Name}
只读变量:1,readonly。
readonly First_Name
删除变量:1,unset;2,删除后不可用。
unset First_Name
运行shell时,会同时存在三种变量:
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。
字符串
引号:1,单引号:字符原样输出,变量无效。
First_Name='Hello world!'
echo 'echo ${First_Name}'
2,双引号:变量有效,可以使用转义符。
echo "echo ${First_Name}"
获取长度:1,#
echo "length: ${#First_Name}"
提取字符串:1,第一个字母为0号位置
echo "split: ${First_Name:6:11}"
查找字符串:1,‘r’为查找的字符;2外侧不是单引号而是反引号(tab键上方)
echo `expr index "${First_Name}" r`
数组
数组的区别不大:1,外部为括号;2,不需要确定大小;3,不需要逗号分隔
#!/bin/bash
array=(
Tom
Jerry
Jack
Jhon
)
echo ${array[1]}
获取数组与数组元素长度:
echo "All Length:${#array[*]}"
echo "Single Length:${#array[1]}"
字符串截取(重)
来自某网友的总结,已经很详尽了。
参数传递
如果我们想使用echo输出一个后期输入的参数。
echo "$1"
执行文件:(03.sh为脚本名,A为参数名)
sudo ./03.sh A
输出A
同理如果将$1改成$2,参数传递应该改为sudo ./03.sh A B
输出B
(只给与一个参数A,则什么也不显示)
由此可知,传递$n,则为文件名后第n个参数
$0:代表当前执行的文件
$#:代表参数的个数
#!/bin/bash
echo "$0"
echo "$1"
echo "$2"
echo "$3"
echo "$#"
另外,还有几个特殊字符用来处理参数:
#!/bin/bash
echo "$0"
echo "$1"
echo "$2"
echo "$3"
echo "$#"
echo "$*"
echo "$@"
echo "$$"
echo "$-"
echo "$?"
"$*"和 "$@"的区别
"$*"得到的是一个所有参数的字符串“ABC”
"$@"得到的是一个所有参数的数组“A”“B”“C”
#!/bin/bash
echo "$1"
echo "$2"
echo "$3"
echo "$*"
echo "$@"
echo "-- \$* ---"
for i in "$*"; do
echo $i
done
echo "-- \$@---"
for i in "$@"; do
echo $i
done