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分隔符,按照指定分隔符分割列,默认是



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指定需要排序的列
