欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Linux之自学shell编程 -学习笔记

程序员文章站 2022-06-23 19:29:50
Linux知识体系:("[]"表示不需要的先修知识)Linux基础知识、Linux的用户管理和账户管理、Linux文件管理、Linux的文件系统;字符处理:文本搜索(grep)、排序(sort)、删除重复内容(uniq)、截取文本(cut)、文本转换(tr)、文本合并(paste)、分割大文件(split);[网络管理];[进程管理];[软件安装:rpm/yum];[编辑器];正则表达式:通配符、[文本处理工具sed、awk];目标是写出用shell编程实现ftp自动登录备份的程序(当然也包括对f...

这篇博客是为了写作业写的,目标是写出用shell编程实现ftp自动配置的部分。
主要涉及的部分是shell脚本语言里的文件处理和字符处理。

基础

1. 第一个shell程序

#! /bin/bash
#以“#!”开头 表明使用的编译器的位置
echo "Hello World"

按照惯例,打印HelloWorld! 将以上内容存入文件HelloWorld.sh中。

运行脚本
① 直接使用

  bash HelloWorld.sh

② 先给脚本赋予相应的可执行权限

 chmod +x HelloWorld.sh
 ./HelloWorld.sh

也可以将其复制到/bin目录下

mv HelloWorld.sh /bin/

下次可以直接使用文件名执行该脚本

HelloWorld.sh

2. 变量

①弱类型变量;
②区*部变量、环境变量;
③常用变量:PWD:当前路径、PATH:命令的搜索路径等等;
④取用变量的方式:$ variable或 $ {variable} ;
⑤取消变量的方式:unset;
⑥$ @ 或 $ * 表示脚本中的所有参数;
⑦脚本或(上一个)命令的返回值:$ ?:【Linux中以0值作为正常退出脚本和命令的返回值】
⑧数组:
定义:declare;
数组取值:$ {Array[index]} ;
取出数组中全部值:$ {Array[@]}或者$ {Array[* ]};
数组长度:
(数组中全部元素个数)$ {#Array[@]}或者 $ {Array[* ]};(某个元素的长度)$ {#Array[index]};
对数组中元素的截取$ {Array[@]:1:2};(对数组中元素地字符的截取)$ {Array[2]:0:5};
连接数组:略;
替换元素:略;

(这里的$ 和* 后面都不应该写空格但是我不知道为什么这个markdown总是格式错误啊淦

3. 转义和引用

转移:使用转义符引用单个字符;
引用:将字符串用某种符号括起来,以防止其被解析成为其他意思;

命令替换:‘order‘ 或者 $ (order);

4. 运算符

算术运算符:加减乘除、求余、幂运算等等;
位运算符:与、或、非、异或、左移、右移;
自增自减;
expr运算:略;
declare做运算;
算术扩展:$ ((expression));
bc运算;

5. 特殊字符

通配符:*、?、[]、引号、括号等;

语句

1. 测试

测试语句:
①test expression;② [空格expression空格];

文件测试:

看例子:
Linux之自学shell编程 -学习笔记

字符串测试:

看例子:
Linux之自学shell编程 -学习笔记以下两种方式作用效果相同:
Linux之自学shell编程 -学习笔记
Linux之自学shell编程 -学习笔记

整数测试:

Linux之自学shell编程 -学习笔记

逻辑测试:

看例子:
Linux之自学shell编程 -学习笔记
Linux之自学shell编程 -学习笔记

2. 判断语句

if/else

if [-x "$filename" ]; then
 echo "yes"
else
 echo "no"
fi

case

case $input in
*[[:abcd:]]*) echo-en "ABCD";;
*) echo-en "\*";;
esac

3. 循环语句

for

for i in ${Array}
do 
 echo "$i "
done

或者

for ((i=1; i<=10; i++))
do
 echo-n "$i "
done

while

sum计算出1到100的和,sum2计算出1到100的奇数和

sum=0
sum2=0
i=1
j=1
while [[ "$i"-le "100" ]]
do
 let "sum+=i"
 let "j=i%2"
 if [[ $j-ne 0 ]]; then
  let "sum2+=i"
 fi
 let "i++"
done

读取文件:
看例子:
Linux之自学shell编程 -学习笔记

until

sum=0
sum2=0
i=1
j=1
until [[ $i-gt 100 ]]
do
 let "sum+=i"
 let "j=i%2"
 if [[ $j-ne 0 ]]; then
  let "sum2+=i"
 fi
 let "i++"
done

函数

1. 基本知识

函数定义和调用:
看例子:
Linux之自学shell编程 -学习笔记
函数可以有返回值(return);

2. 参数

可以接受两个位置参数$ 1 和$ 2,计算$ 1的$ 2次方的值;
看例子:
Linux之自学shell编程 -学习笔记
【使用set 指定位置参数的值(重置)】
看例子:
Linux之自学shell编程 -学习笔记
【shift表示将所有参数左移,即溢出最左位($ 1的值),参数的个数将减1】
看例子:
Linux之自学shell编程 -学习笔记

3. 库函数

4. 递归函数

重定向

重定向:将输入、输出方向改为其他设备或文件。

1. 文件标识符

Linux使用0到9的整数指明了特定进程相关的数据流,系统在启动一个进程的同时会为该进程打开三个文件:标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr),分别用文件标识符0、1、2来标识。如果要为进程打开其他的输入输出,则要从整数3开始标识。默认情况,stdin为键盘,stdout和stderr为显示器。

2. I/O重定向

I/O重定向:从文件、命令、脚本或程序到文件、命令、脚本或程序。
常用符号:
Linux之自学shell编程 -学习笔记

标准输出覆盖重定向:>

如果文件不存在,创建文件并写入;如果文件存在,会覆盖原文件内容写入。
看例子:
Linux之自学shell编程 -学习笔记

标准输出追加重定向:>>

如果文件不存在,创建文件并写入;如果文件存在,在原文件尾部开始写入。
其余用法与“>”相同。

标识输出重定向:>&

将一个表示的输出重定向到另一个标识的输入。

例子:将stdout与stderr同时定向到同一个文件中。
Linux之自学shell编程 -学习笔记
忽略错误输出:
Linux之自学shell编程 -学习笔记

标准输入重定向:<

将文件作为输入。
看例子:
Linux之自学shell编程 -学习笔记

管道:|

3. 使用exec

字符处理

管道

Linux中的管道是一个4KB大小的缓冲区。用来把一个命令的输出内容当作另一个命令的输入。

ls -l /etc/init.d | more

grep搜索文本

【grep命令区分大小写】
Linux之自学shell编程 -学习笔记

sort排序

Linux之自学shell编程 -学习笔记
一个例子:
Linux之自学shell编程 -学习笔记

uniq删除重复内容

Linux之自学shell编程 -学习笔记
uniq命令经常和sort命令联合使用,因为uniq命令只会对比相邻行,所以如果相同行不连续则不具备去除功能。

cat uniq.txt | sort | uniq

cut截取文本

# 分隔符":"
cat /etc/passwd | cut -f1,6-8-d':'
#不使用分隔符
cat /etc/passwd | cut -c1-5,7-10

tr文本转换

文本转换或删除
小写字母转换大写字母:

cat /etc/passwd | tr '[a-z]' '[A-Z]'

取消冒号:

cat /etc/passwd | tr-d ':'

paste文本合并

按照行合并,中间使用tab隔开。
看例子:
Linux之自学shell编程 -学习笔记

split分割大文件

已经不太经常使用了 。。。略

sed命令

sed命令可以看这篇大神博客:https://blog.csdn.net/wdz306ling/article/details/80087889

脚本

终于开始写自己的shell程序了