一、shell简介
参考博文1
参考博文2——shell语法及应用
参考博文3——vi的使用
在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是 / b in/ b a s h ,流行的shell有ash、bash、ksh、csh、zsh等
#!/bin/bash #这一行被称为shebang 行 [指定告知系统当前这个脚本要使用的shell解释器]
1.1 shell常用的命令和概念
(1)echo:用于在屏幕上显示文本或变量的值
echo "Hello, World!"
(2)read:用于从用户那里读取输入并将其赋值给变量
read -p "Enter your name: " name
echo "Hello, $name"
(3)if:条件判断语句,用于根据条件执行不同的命令
if [ $num -gt 10 ]; then
echo "Number is greater than 10"
else
echo "Number is less than or equal to 10"
fi
(4)for:循环语句,用于重复执行一系列命令。
for i in 1 2 3 4 5; do
echo "Welcome $i times"
done
for i in {1..10};do #遍历1-10,并输出
echo $i
done
(5)while:循环语句,只要条件为真就继续执行
while [ $num -lt 10 ]; do
echo $num
num=$((num+1))
done
(6)case:多条件判断语句,用于根据不同的条件执行不同的命令。
case $choice in
1) echo "Option 1 selected";;
2) echo "Option 2 selected";;
*) echo "Invalid option";;
esac
1.2shell脚本的写入和运行
1.写入的4种方式
shell脚本的写入方式
1.cat > test.sh
"hello world"
"hello boys" #键入写入test.sh的内容,写完后按CTRL+D退出
2.echo "hello world" > test.sh #写入test.sh并覆盖原有内容
3.echo "hello world" >> test.sh #写入test.sh的末尾,不覆盖原有内容
4.vi test.sh #使用vi编辑
#在文件指定行写入内容
sed -i "5i 写入内容" test.sh #在第5行写入内容
注意执行前先给shell脚本可执行的权限:chmod +x test.sh(最开始创建的test.sh只是一个文本文件,必须给权限后才可运行)
#3种方式均可运行sh脚本
bash test.sh
sh test.sh
./test.sh #注意!!! 不可忽略./
2.输入/输出重定向
linux标准输入输出:
- 0:键盘(/dev/stdin)——标准输入
- 1:显示器(/dev/stdout)——标准输出
- 2:显示器(/dev/stderr)——标准错误输出
输入重定向:不使用标准输入端口输入文件,而是使用指定的文件作为标准输入设备。(使用 “<”符来修改标准输入设备)
echo "today is $(date)" #输出Today id 2024年 05月 20日 星期一 14:26:59 CST
echo " today is $(date)" >> test.sh #将输出内容写到test.sh文件的末尾
常用的转义字符:\n:换行 \t:制表符 \\反斜杠 \" 双引号 \'单引号
3.shell变量
注意事项!!!
1.等号两侧不能有空格,如:name="john"
2.环境变量建议大写
3.单引号(全引用):单引号括起的内容不管是常量还是变量都不会发生替换(引用的即输出的)
4.双引号(部分引用):变量发生替换,常量保持不变
5.无引号:字符串不能包含空白字符(space/tab),一般连续的字符串、数字、路径等可以不加引号
字符串常量使用单引号括起来,如果字符串含有变量、命令等使用双引号括起来,不建议不加引号
命令执行:必须用反引号(`命令`)或$(命令):如:echo `ls` 或者echo $(ls) ,才会输出ls命令执行结果(也即显示当前目录下的文件)
#单引号使用
var=double
echo '$var' #输出:$var
#双引号使用
var=double
echo "$var" #输出:double
#无引号使用
str1="test1",str2='test2',str3=teststring
echo $str1,$str2,$str3 #输出test1,str2=test2,str3=teststring
3.1变量分类
- 自定义变量:户自由定义变量名和变量的值
- 环境变量:保存和系统操作环境相关的数据
- .位置参数变量:向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
- 预定义变量:Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
#变量的调用
[root@root scripts]# name="shen zhen"
[root@root scripts]# echo $name
shen zhen
3.2变量查看
set指令能设置所使用shell的执行方式,可依照不同的需求来做设置。
set [+-abCdefhHklmnpPtuvx]
unset name #删除变量
env #查看系统默认环境变量
3.2.1位置参数变量
$n: n为数字,$0表示当前 Shell 脚本程序的名称,$1-9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 ,如{10}
$*:代表命令行中所有的参数,$把所有的参数看成一个整体
$@:代表命令行中所有的参数,不过$@把每个参数区分对待
$#:代表命令行中所有参数的个数
#! /bin/bash
echo "shell脚本本身的名字:$0" #输出:shell脚本本身的名字:test.sh
echo "传给shell的第一个参数:$1" #输出:传给shell的第一个参数:1
echo "传给shell的第二个参数:$2" #输出:传给shell的第二个参数:2
3.2.2预定义变量
$?: 最后一次执行命令的返回状态。为0则命令执行成功,反之,不成功
$$: 当前进程的进程号PID
$!: 后台运行的最后一个进程的进程号
1.cat:用于查看和连接文件
'>'用于创建文件, '>>'用于追加内容(不覆盖原内容)
cat file #查看文件
cat > test.py # 将标准输入到重定向文件,覆盖该文件内容
cat >> test.py #将标准输入写到文件末尾
cat file1 file2 > file3 #将file1和file2的内容合并写到file3(若file3有内容,则会被覆盖)
cat file1 file2 > file3 #将file1和file2的内容合并写到file3(若file3有内容,则会写到文件后)
cat file1 file2 #显示多个文件内容
cat filename | command #将cat命令的输出作为另一个命令的输入
cat -n textfile1 > textfile2 # textfile1 的文档内容加上行号后输入 textfile2
cat filename | tail -n 10 #显示file的最后10行
nl filename #显示行号(包括空白行)
cat -n filename #显示行号(包括空白行)
cat -b filename #显示行号(不包括空白行)
cat -e filename #在每行结尾处添加符号"$"
cat /dev/null > /etc/tsst.txt #清空 /etc/test.txt 文档内容
cat /dev/fd0 > OUTFILE #制作镜像文件,如要制作 软盘的镜像文件OUTFILE,将软盘放好后,使用此命令
cat /IMG_FILE > /dev/fd0 #相反的,如果想把 image file镜像文件 写到软盘,使用此命令
2.more 文件内容或输出查看工具
more /root/test.py #查看文件内容,同cat,并可分页显示文件内容
参数如下:
+num 从第num行开始显示;
-num 只显示前num行;
+/pattern 从pattern 前两行开始显示;
-c 从顶部清屏然后显示;
-d 提示Press space to continue, 'q' to quit.(按空格键继续,按q键退出),禁用响铃功能;
-l 忽略Ctrl+l (换页)字符;
-p 通过清除窗口而不是滚屏来对文件进行换页。和-c参数有点相似;
-s 把连续的多个空行显示为一行;
-u 把文件内容中的下划线去掉退出more的动作指令是q
more -dc test.sh #清屏查看当前文件
ls -l /etc |more #通过管道与more结合(当要显示的内容很多时,cat直接打印了所有内容,可能会看不到前面部分的内容,就可利用more分屏显示)
#查看大文件时,有以下常用快捷键:
Enter: 向下1行(默认,可修改多行)
Ctrl+f: 向下滚动1屏;
空格键: 向下滚动1屏;
Ctrl+b: 返回上一屏;
= : 输出当前行的行号;
:f: 输出文件名和当前行的行号;
v: 调用vi编辑器;
! : 调用Shell,并执行命令;
q : 退出more当我们查看某一文件时,想调用vi来编辑它,不要忘记了v动作指令,这是比较方便的;
3.less查看文件
less test.sh
常用参数
-c 从顶部(从上到下)刷新屏幕,并显示文件内容。而不是通过底部滚动完成刷新;
-f 强制打开文件,二进制文件显示时,不提示警告;
-i 搜索时忽略大小写;除非搜索串中包含大写字母;
-I 搜索时忽略大小写,除非搜索串中包含小写字母;
-m 显示读取文件的百分比;
-M 显法读取文件的百分比、行号及总行数;
-N 在每行前输出行号;
-p pattern 搜索pattern;比如在/etc/profile搜索单词MAIL,就用 less -p MAIL /etc/profile
-s 把连续多个空白行作为一个空白行显示;
-Q 在终端下不响铃;
man less #查看less 使用
head -n 5 /var/log/msg #显示msg文件的前5行
tail -n 5 /var/log/msg #显示msg文件的最后5行
tail -f /var/log/msg #实时显示msg文件
二、shell运算符
在shell中,常见的有算数运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符等
2.1算术运算符
# bash不支持简单的数学运算,但是可以通过其他命令来实现,利用awk 、expr(常用)完成表达式的计算
条件表达式:
= |赋值| a=$b 将把变量 b 的值赋给 a。
==| 相等。用于比较两个数字,相同则返回 true(真)。| [ $a == $b ] 返回 false(假)。
!= |不相等。用于比较两个数字,不相同则返回 true。 |[ $a != $b ] 返回 true。注意:条件表达式要放在方括号之间,并且要有空格,如: [ $a == $b ]、[ $a != $b ]
a=30
b=10
echo "$a"
echo "$b"
echo "a + b = " `expr $a + $b` #输出40
echo "a - b = " `expr $a - $b` #输出20
echo "a * b = " `expr $a \* $b` #输出300
echo "a / b = " `expr $a / $b` #输出3
echo "a % b = " `expr $a % b` #输出
--------------------------------------------
if [$a == $b]
then
ech和b相等"
else
echo "a和b不等" #输出a和b不等
fi
2.2关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
四、vim的使用
Vim是vi的增强版,继承了vi的基本使用,新增了语法高亮、多窗口编辑、撤销与重做 。
目前大部分版本都以 vim 取代 vi 的功能了,如果你使用 vi 后,却看到画面的右下角有显示目前光标所在的行列号码,表明 vi 已经被 vim 所取代
- 进入编辑模式:键入按键aori(AORI),进入insert模式,即可编辑文档
- 命令行模式: 键入按键:/?(任意一个)即可移动光标到文档最下方
- 常用指令:’:wq’(保存并退出)、’:q’(不保存退出)、’:q!’(不保存强制退出)
- 移动光标到文件顶部:gg
- 移动光标到文件底部:G
- 移动光标到指定行数:ngg(如:移动到第5行:5gg)
- 撤销上一步操作:进入命令行模式(esc+ u)u 或 :undo
- 恢复撤销的操作:Ctrl + r 或 :redo
- 选择文本:Ctrl+v(进入可视块模式,移动光标选择文本)
- 选择文本进行复制:Ctrl+v +y +p(选择+复制+粘贴)
- 复制整行:进入命令行模式(esc+ yy) -----(复制5行:5yy)
- 粘贴:进入命令行模式(esc)+ p
- 删除:进入命令行模式(esc)+ dd/D
- 指定行编辑:vim filename +n
- 控制光标移动方向:hjkl分别对应:左下上右
光标每次移动一个单词:w(word):向后移动一个单词;b(back):向前移动一个单词
屏幕移动:Ctrl+b:向上翻页 ; Ctrl+f:向下翻页; H / M / L:屏幕顶部/中间底部