关于 Shell 脚本
Shell 解释器
Linux 提供的 Shell 解释器:
bash
和 sh
的关系:
CentOS 默认的解析器:
Shell 入门
脚本格式,以 #!/bin/bash
开头,指定解析器
第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限
多命令处理
在 /home/
目录下创建一个 text.txt
文件,在文件增加 "I love the world!"
Shell 变量
系统变量
使用 set
查看当前 Shell 中所有变量
自定义变量
定义变量 变量名=值
撤销变量 unset 变量名
声明静态变量 readonly 变量名=值
,其不能 unset
变量名定义规范:
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
- 等号两侧不能有空格
- 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
- 变量的值如果有空格,需要使用双引号或单引号括起来
可使用 export 变量名
把变量提升为全局环境变量,可供其他 Shell 程序使用
hello.sh
文件:
#!/bin/bash
echo "Hello World!"
echo $A
特殊变量
$n
(功能描述:n 为数字,$0
代表该脚本名称,$1-$9
代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 ${10}
)
vim parameter.sh
#!/bin/bash
echo "$0 $1 $2 $3 $4"
$#
获取所有输入参数个数,常用于循环
#!/bin/bash
echo "$0 $1 $2 $3 $4"
ech $#
$*
这个变量代表命令行中所有的参数,$*
把所有的参数看成一个整体
$@
这个变量也代表命令行中所有的参数,不过 $@
把每个参数区分对待
#!/bin/bash
echo "$0 $1 $2 $3 $4"
echo $#
echo $*
echo $@
$?
最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了
运算符
$((运算式))
或$[运算式]
expr + , - , \*, /, %
加,减,乘,除,取余
注意:expr运算符间要有空格
条件判断
[ condition ]
条件非空即为 true,[ jkfx ]
返回true,[]
返回false
注意:condition 前后要有空格
两个整数之间比较
=
字符串比较
-lt
小于(less than)
-le
小于等于(less equal)
-eq
等于(equal)
-gt
大于(greater than)
-ge
大于等于(greater equal)
-ne
不等于(Not equal)
按照文件权限进行判断
-r
有读的权限(read)
-w
有写的权限(write)
-x
有执行的权限(execute)
按照文件类型进行判断
-f
文件存在并且是一个常规的文件(file)
-e
文件存在(existence)
-d
文件存在并是一个目录(directory)
流程控制
if 判断
if [ 条件判断式 ];then
语句
fi
if [ 条件判断式 ]
then
语句
fi
注意事项:
[ 条件判断式 ]
中括号和条件判断式之间必须有空格if
后要有空格
#!/bin/bash
if [ $1 -eq 1 ];then
echo "Geek Fx is handsome!"
elif [ $1 -eq 2 ]
then
echo "Jkfx is gorgeous!"
fi
case 语句
case word in
pattern1 )
语句1
;;
pattern2 )
语句2
;;
* )
default语句
;;
esac
注意事项:
case
行尾必须为单词in
每一个模式匹配必须以右括号)
结束。- 双分号
;;
表示命令序列结束,相当于 break。 - 最后的
*)
表示默认模式,相当于 default。
#!/bin/bash
case $1 in
1 )
echo "Male"
;;
2 )
echo "Fmale"
;;
* )
echo "Shemale"
;;
esac
for 循环
for (( i = 0; i < 10; i++ )); do
#statements
done
#或者
for (( i = 0; i < 10; i++ ))
do
#statements
done
#!/bin/bash
s=0
for (( i = 0; i <= 100; i++)); do
s=$[$s+$i]
done
echo $s
for i in words; do
#statements
done
#或
for i in words
do
#statement
done
比较 $*
和 $@
区别:
$*
和$@
都表示传递给函数或脚本的所有参数,不被双引号""
包含时,都以$1 $2 … $n
的形式输出所有参数。- 当它们被双引号
""
包含时,$*
会将所有的参数作为一个整体,以"$1 $2 … $n"
的形式输出所有参数;$@
会将各个参数分开,以"$1" "$2" … "$n"
的形式输出所有参数。
#!/bin/bash
for i in $@; do
echo "I love $i"
done
for j in $*
do
echo "I like $j"
done
#!/bin/bash
for i in "$@"; do
echo "I love $i"
done
for j in "$*"
do
echo "I like $j"
done
while 语句
while [[ condition ]]; do
#statements
done
#或
while [[ condition ]]
do
#statements
done
#!/bin/bash
i=1
s=0
while [[ $i -le 100 ]]; do
s=$[$s + $i]
i=$[$i + 1]
done
echo $s
read 读取控制台输入
使用 read [-选项] 参数
从控制台读取输入内容
选项:
-p
指定读取值时的提示符-t
指定读取值时等待的时间(秒)
#!/bin/bash
read -t 8 -p "Enter your name in 8 seconds: " NAME
echo $NAME
函数
系统函数
basename
的基本用法
basename [string/pathname] [suffix]
此命令会删掉所有的前缀包括最后一个 /
字符,然后将字符串显示出来
[suffix]
为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉
dirname
的基本用法
dirname 文件路径
从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
自定义函数
function funname[()]
{
#statement;
[return int;]
}
注意事项:
- 必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一样先编译。
- 函数返回值,只能通过
$?
系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
#!/bin/bash
function sum()
{
s=0
s=$[$1 + $2]
echo $s
}
read -p "Input parameter1: " P1
read -p "Input parameter2: " P2
sum $P1 $P2
Shell 工具
cut
cut
的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut
命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
cut [选项] filename
选项说明:
-f
列号,提取第几列-d
分隔符,按照指定分隔符分割列,默认是\t
sed
sed
是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用 sed
命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
sed [选项] 'command' filename
选项说明:
-e
直接在指令列模式上进行 sed 的动作编辑
command 功能描述:
a
新增,a
的后面可以接字符串,在下一行出现d
删除s
查找并替换
awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理
awk [选项] 'pattern1 {action1} pattern2 {action2} ...' filename
选项参数说明:
pattern
表示 AWK 在数据中查找的内容,就是匹配模式(正则表达式)action
在找到匹配的内容时所执行的一系列命令-F
指定输入文件分隔符-v
赋值一个用户定义变量
awk 的内置变量
FILENAME
文件名NR
已读记录数(行号)NF
浏览记录的域的个数(列个数)
sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出
sort [选项] [参数]
选项说明:
-n
按照数值大小进行排序-r
按照相反顺序排序-t
设置排序时所用的分隔符-k
指定需要排序的列