shell脚本学习

9 篇文章 2 订阅
2 篇文章 0 订阅
本文介绍了Shell脚本的基础知识,包括脚本头、参数、循环、条件语句和常见命令的使用。讲解了如何通过`echo`、`tar`、`for`循环和`while`循环等操作文件和处理数据。同时,提到了数组、字符串操作以及`awk`的使用方法,是初学者入门Shell编程的实用教程。
摘要由CSDN通过智能技术生成

以一个例子为例:

#!/bin/bash
echo this is the script file $0
echo untarring the file $1
# this calls tar with options -xvzf (extract,
# verbose, filter through gzip, input filename)
tar -xvzf $1

tar -xvzf $1
第一行:
以“#!”开始是特别的提示-它告诉shell应该用哪一个程序来解释我的脚本。在这个例子里,我使用bash shell /bin/bash。
第一行必须使用“#!”开头,否则脚本不会运行(系统认为是一个文本文件)。
其他以“#”开始的行是注释行
第二行、第三行:
在以上脚本里,参数$0, $1, $2…是传递到脚本里面的参数。
举个例子,如果我运行我的脚本名“myscript”带七个参数如下:
myscript a b c d e f g
那么,参赛$0就是myscript, $1就是a, $2就是b,$3就是c,依此类推。

一旦脚本已经写好,我把文件属性改成对文件拥有者是“可执行”的:
chmod u+x untar

双引号里可以有变量
例如:

your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

获取字符串长度
string=“abcd”
echo ${#string}

提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:

string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

Shell 数组
bash支持一维数组(不支持多维数组)

Shell 传递参数
在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数
例如:
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

传递到脚本的参数个数
KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ echo "参数个数为:#";

显示结果定向至文件
echo “It is a test” > myfile

8.显示命令执行结果
echo date
注意: 这里使用的是反引号 `, 而不是单引号 '。
结果将显示当前日期
Thu Jul 24 10:08:46 CST 2014

for 循环
Shell支持for循环。
for循环一般格式为:
for var in item1 item2 … itemN
do
command1 command2 … commandN
done

解释:
for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。
例:

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

while 语句
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。
Shell 输入/输出重定向
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
**加粗样式在这里插入图片描述
**
输出重定向
重定向一般通过在命令间插入特定的符号来实现。
command1 > file1

shell脚本之grep的使用方法

grep是用来处理行数据的基本命令集,简单来说它的使用意义就在于当你想要找到某个文件中的某个字符串以及它相关联的信息时(比如说行数),那么你就需要这个命令了。
grep的基本用法
grep使用的格式为 grep [参数] “模式” 文件
grep ‘num’ pinatrace.out > file1 //搜索num
grep的作用域主要是由最后一个参数文件所决定的,换句话说,如果决定在某个文件中查找字符串,那么直接在后面书写某个文件即可
,而如果在某个文件夹,那么要做两件事:1、首先需要在参数中加 -r(表示递归的意思)。2、在文件参数上加上文件夹。

grep的参数
-A(after):表示匹配之后的第n行。
-B(before):表示匹配之前的第n行。
-C(context):表示匹配之前和之后的第n行。
-i(ignore):忽略大小写
-o(output):判断只输出这个
-v(verse):判断不输出这个
–color:颜色
首先说一下加引号(单引号和双引号都算上)和不加引号的区别。这个主要应用于空格上面。
如果你搜索的文本中包含空格,那么你就必须加引号。

字符串截取办法:
假设有变量 var=http://www.aaa.com/123.htm.
5. 从左边第几个字符开始,及字符的个数
代码如下:
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
6. 从左边第几个字符开始,一直到结束。
代码如下:
echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm

shell脚本–awk的用法
语法格式:awk [选项] ‘指令’ 操作文件
实例1:在命令行直接输入awk指令
awk ‘{print}’ 1.txt #逐行读取文件1.txt内容并打印

awk的BEGIN块和END块
BEGIN用于初始化FS变量(列分隔符),打印标题,或者初始化后需要在程序中调用的全局变量
END用于执行最后的运算或者打印最终的输出结果
END块和BEGIN不是必须的

BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

在 awk 程序处理完所有数据,即将结束时执行?END 后的动作只在程序结束时执行一次

1) BEGIN
BEGIN 是 awk 的保留字,是一种特殊的条件类型。BEGIN 的执行时机是"在 awk 程序一开始,尚未读取任何数据之前"。

一旦 BEGIN 后的动作执行一次,当 awk 开始从文件中读入数据时,BEGIN 的条件就不再成立,所以 BEGIN 定义的动作只能被执行一次。例如:

[root@localhost ~]# awk ‘BEGIN{printf “This is a transcript\n”}
{printf $2 “\t” $6 “\n”}’ student.txt
#awk命令只要检测不到完整的单引号就不会执行,所以这条命令的换行不用加入"“,就是一行命令
#这里定义了两个动作
#第一个动作使用BEGIN条件,所以会在读入文件数据前打印"这是一张成绩单”(只会执行一次)
#第二个动作会打印文件的第二个字段和第六个字段

2) END
END 也是 awk 的保留字,不过刚好和 BEGIN 相反。END 是在 awk 程序处理完所有数据,即将结束时执行的。END 后的动作只在程序结束时执行一次。例如:
[root@localhost ~]# awk ‘END{printf “The End \n”}
{printf $2 “\t” $6 “\n”}’ student.txt
#输出结尾输入"The End",这并不是文档本身的内容,而且只会执行一次。
在这里插入图片描述
获取首行
NR==1
tid=awk 'NR==1{print $5}' file2

cut方法
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值