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

这篇博客是为了写作业写的,目标是写出用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编程 -学习笔记_第1张图片

字符串测试:

看例子:
Linux之自学shell编程 -学习笔记_第2张图片以下两种方式作用效果相同:
Linux之自学shell编程 -学习笔记_第3张图片
Linux之自学shell编程 -学习笔记_第4张图片

整数测试:

Linux之自学shell编程 -学习笔记_第5张图片

逻辑测试:

看例子:
Linux之自学shell编程 -学习笔记_第6张图片
Linux之自学shell编程 -学习笔记_第7张图片

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编程 -学习笔记_第8张图片

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编程 -学习笔记_第9张图片
函数可以有返回值(return);

2. 参数

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

3. 库函数

4. 递归函数

重定向

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

1. 文件标识符

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

2. I/O重定向

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

标准输出覆盖重定向:>

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

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

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

标识输出重定向:>&

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

例子:将stdout与stderr同时定向到同一个文件中。
在这里插入图片描述
忽略错误输出:
在这里插入图片描述

标准输入重定向:<

将文件作为输入。
看例子:
Linux之自学shell编程 -学习笔记_第15张图片

管道:|

3. 使用exec

字符处理

管道

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

ls -l /etc/init.d | more

grep搜索文本

【grep命令区分大小写】
Linux之自学shell编程 -学习笔记_第16张图片

sort排序

Linux之自学shell编程 -学习笔记_第17张图片
一个例子:
Linux之自学shell编程 -学习笔记_第18张图片

uniq删除重复内容

Linux之自学shell编程 -学习笔记_第19张图片
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编程 -学习笔记_第20张图片

split分割大文件

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

sed命令

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

脚本

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

vsftpd自动配置:

在我的这一篇有写!!!
内容其实很弱鸡啦 主要就是完成了下载、创建文件夹、赋予文件夹权限、修改配置文件允许匿名用户的上传下载 也没有登陆的内容)

环境:fedora8;VMWARE;(不知道为什么要用这么古早的版本反正我们上课就是要用这个)

就是说关注了才能看哦!

感谢阅读!!!

你可能感兴趣的:(笔记)