Shell编程基础
文章目录
一、Shell文件简介
Shell文件是一种包含一系列命令的文本文件,规范命名以.sh
结尾,通常用于执行一系列操作或者运行一段脚本。Shell是一个命令行解释器,它允许用户通过键入文本命令与操作系统进行交互。
Shell文件第一行内容应该为#!\bin\bash
其它内容如
echo "helloworld"
touch test.txt
echo "你好" >> test.txt
运行Shell文件,有以下两种方法:
- 直接在命令行输入
bash test.sh
或sh test.sh
,test.sh可以更改为绝对路径 - 修改执行权限,使得
./test.sh
也能够运行
二、变量
系统变量
常见的系统变量有以下,使用echo $HOME
可以显示:
$HOME | 显示当前用户的家目录 |
---|---|
$PWD | 显示当前路径 |
$SHELL | 显示默认的解析器 |
$USER | 显示当前文件的所属用户 |
自定义变量
一般变量
不需要定义变量类型,直接在命令行输入A=2
就可以定义一个变量A,注意=左右不能有空格。使用echo $A
可以输出变量A的值,使用unset A
可以删除变量。自定义变量全部都是字符串类型,不能进行逻辑运算,比如语句C=2+3
,C并不会等于5,而是等于2+3
字符串。
声明有空格的字符串变量时,需要用双引号将字符串括起来,如D="i am fine"
静态变量
在命令行使用语句readonly B=1
可以声明一个静态变量B,也可以叫只读变量,不能使用unset
删除。
全局环境变量
在命令行输入语句export B=5
可以定义一个全局环境变量,该变量可以给所有的Shell文件使用。全局环境变量也不可以被```unset``删除,只能在操作系统重启时被删除。
特殊变量
$n | n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,10和10以上的参数需要用大括号包含,如${10} |
---|---|
$# | 获取所有输入参数的个数,注意是参数,不包括下标为0的,也就是不包括脚本名称 |
$* | 代表命令行中所有的参数,$*把所有参数看成一个整体 |
$@ | 代表命令行中所有的参数,不过$@把每个参数区分对待 |
$? | 最后一次执行命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行。 |
三、运算符
基本语法有两种:
$((运算表达式))
或$[运算表达式]
expr 运算表达式
expr运算符间必须有空格
举例:
expr 3 + 2
expr `expr 3 + 2` * 5
s=$((2+3-1))
echo $s
p=$[2+5*6]
echo $p
四、条件判断
基本语法[ condition ]
(condition前后要有空格),条件非空即为true,[]返回false。
常用判断条件
(1) 两个整数之间比较
== | 字符串比较 |
---|---|
-lt | 小于(less than) |
-le | 小于等于(less equal) |
-eq | 等于(equal) |
-gt | 大于(greater than) |
-ge | 大于等于 |
-ne | 不等于(not equal) |
(2)按照文件权限进行判断
-r | 有读的权限(read) |
---|---|
-w | 有写的权限(write) |
-x | 有执行的权限(execute) |
(3) 按照文件类型进行判断
-f | 文件存在并且是一个常规的文件(file) |
---|---|
-e | 文件存在(existence) |
-d | 文件存在并是一个目录(directory) |
运行例子:
[ 23 -ge 20 ]
echo $?
[ -w helloworld.sh ]
echo $?
[ -e /home/yuqing/test.sh ]
echo $?
[ 23 -ge 20 ]&&[ 15 -le 20 ]
echo $?
[23 -ge 20]&&echo ok
五、流程控制(重点)
1. if基本语法:
if [ 条件判断式 ];then
程序
fi
if [ 条件判断式 ]
then
程序
fi
例子:
#!/bin/bash
if [ $1 -eq 1 ];then
echo "input:1"
elif [ $1 -eq 2 ];then
echo "input:2"
fi
2.case基本语法
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
例子:
#!/bin/bas
case $1 in
1)
echo "input:1"
;;
2)
echo "input:2"
;;
*)
echo "other"
;;
esac
3.for循环
基本语法:
for(( 初始值;循环控制条件;变量变化 ))
do
程序
done
for 变量 in 值1 值2 值3
do
程序
done
例子:
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
#!/bin/bash
s=0
for i in $1 $2 $3
do
s=$[$s+$i]
done
echo $s
4.while循环
基本语法
while [ 条件判断式 ]
do
程序
done
例子
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
六、read读取控制台输入
基本语法:read(选项)(参数)
选项:
-p | 指定读取值时的提示符 |
---|---|
-t | 指定读取值时等待的时间(秒) |
参数:变量:指定读取值的变量名
例子:
#!/bin/bash
read -t 7 -p "input your name:" NAME
echo $NAME
七、函数
系统函数
basename [string/pathname] [suffix]
功能描述:basename命令会删掉所有前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
basename `pwd`
basename `pwd` .txt
dirname 文件绝对路径
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
dirname `pwd`
自定义函数
基本语法:
function funname()
{
Action;
[return int;]
}
funname
注意事项:
- 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行,不会像其它语言一样先编译。
- 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运算结果作为返回值。return后跟数值n(0-255)
例子:
#!/bin/bash
function sum()
{
s=0
s=$[$1+$2]
echo $s
}
read -p "input your paratemer1:" p1
read -p "input your paratemer2:" p2
sum $p1 $p2
八、Shell工具(重点)
1、cut
cut的工作就是“剪”,具体来说就是在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符、字段输出。
基本语法:
cut [选项参数] filename
默认分隔符是制表符
选项参数
选项参数 | 功能 |
---|---|
-f | 列号,提取第几列 |
-d | 分隔符,按照指定分隔符分割列 |
例子:
cut -d ' ' -f 1 data.txt
cut -d ' ' -f 2,3 data.txt
2、sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。
基本语法:
sed [选项参数] 'command' filename
选项参数
选项参数 | 功能 |
---|---|
-e | 直接在指令列模式上进行sed的动作编辑 |
命令功能描述
命令 | 功能描述 |
---|---|
a | 新增,a的后面可以接字串,在下一行出现 |
d | 删除 |
s | 查找并替换 |
例子:
sed "2a somrthing important" data.txt
cat data.txt
3、awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
基本语法
awk [选项参数] 'pattern1{action1} pattern2{action2}...' filename
pattern:表示awk在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项参数
选项参数 | 功能 |
---|---|
-F | 指定输入文件折分隔符 |
-v | 赋值一个用户定义变量 |
例子 |
#!/bin/bash
awk -F : '/^root/ {print $7}' passwd
#"/^root/"中'^'表示行的开头
#{print $7}表示打印第七列
4、sort
sort命令在Linux里非常有用,它将文件进行排序,并将排序结果标准输出
sort [选项] (参数)
参数 | 描述 |
---|---|
-n | 依照数值大小排序 |
-r | 以相反的顺序来排序 |
-t | 设置排序时所用的分隔字符 |
-k | 指定需要排序的列 |
例子
#!/bin/bash
sort -t : -nrk 2 data.txt