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空格];
文件测试:
看例子:
字符串测试:
看例子:
以下两种方式作用效果相同:
整数测试:
逻辑测试:
看例子:
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
读取文件:
看例子:
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. 基本知识
函数定义和调用:
看例子:
函数可以有返回值(return);
2. 参数
可以接受两个位置参数$ 1 和$ 2,计算$ 1的$ 2次方的值;
看例子:
【使用set 指定位置参数的值(重置)】
看例子:
【shift表示将所有参数左移,即溢出最左位($ 1的值),参数的个数将减1】
看例子:
3. 库函数
略
4. 递归函数
略
重定向
重定向:将输入、输出方向改为其他设备或文件。
1. 文件标识符
Linux使用0到9的整数指明了特定进程相关的数据流,系统在启动一个进程的同时会为该进程打开三个文件:标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr),分别用文件标识符0、1、2来标识。如果要为进程打开其他的输入输出,则要从整数3开始标识。默认情况,stdin为键盘,stdout和stderr为显示器。
2. I/O重定向
I/O重定向:从文件、命令、脚本或程序到文件、命令、脚本或程序。
常用符号:
标准输出覆盖重定向:>
如果文件不存在,创建文件并写入;如果文件存在,会覆盖原文件内容写入。
看例子:
标准输出追加重定向:>>
如果文件不存在,创建文件并写入;如果文件存在,在原文件尾部开始写入。
其余用法与“>”相同。
标识输出重定向:>&
将一个表示的输出重定向到另一个标识的输入。
例子:将stdout与stderr同时定向到同一个文件中。
忽略错误输出:
标准输入重定向:<
将文件作为输入。
看例子:
管道:|
略
3. 使用exec
略
字符处理
管道
Linux中的管道是一个4KB大小的缓冲区。用来把一个命令的输出内容当作另一个命令的输入。
ls -l /etc/init.d | more
grep搜索文本
【grep命令区分大小写】
sort排序
一个例子:
uniq删除重复内容
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隔开。
看例子:
split分割大文件
已经不太经常使用了 。。。略
sed命令
sed命令可以看这篇大神博客:https://blog.csdn.net/wdz306ling/article/details/80087889
脚本
终于开始写自己的shell程序了