Linux脚本语言学习--上

发布于:2024-12-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

1.shell概述

1.1 shell是什么?

Shell是一个命令行解释器,他为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以使用Shell来启动,挂起,停止甚至是编写一些程序。

Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

1.2.Shell的分类

**Bourne Shell:**从1979年起Unix就开始使用,他的主文件名为sh。

**C Shell:**他主要在BSD版本的unix系统中使用,其语法和C语言相似。

Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh,ksh,Bash,psh,zsh;C家族主要包括:csh,tcsh。

Bash:Bash和sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。

1.3.Linux支持的Shell

# 查看shell的文件
/etc/shells

root@:~# cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/sh
/bin/dash
/usr/bin/dash

2.shell脚本的执行方式

2.1.echo输出命令

echo [选项] [输出内容]
-e :支持反斜线控制字符转换
eg:
root@:~# echo 'hello world!'
hello world!

# 删除左侧字符
root@:~# echo -e "ab\\bc"
ac
# 制表符与换行符
root@:~# echo -e "a\\tb\\tc\\nd\\te\\tf"
a       b       c
d       e       f
# 按照十六进制ascll码输出
root@:~# echo -e "\\x61\\t\\x62\\t\\x63\\t\\x65\\t\\x66"
a       b       c       e       f
root@:~# echo -e "\\x61\\t\\x62\\t\\x63\\n\\x65\\t\\x66\\t\\x67"
a       b       c
e       f       g
# 颜色输出
root@:~# echo -e "\\e[1;31m abcd \\e[0m"
 abcd
\\e[1 :开启颜色输出
\\e[0m:关闭颜色输出
# 支持的颜色
#30m=黑色,31m=红色,32m=绿色,33m=黄色
#34m=蓝色,35m=洋红,36m=青色,37m=白色

2.2.第一个脚本

#!/bin/bash       #标注我写的是shell脚本
#This is program
#Author:db (E-mail:xxxx@qq.com)

echo -e 'hello world!!'

# 记得chmod 755 hello.sh 加上可运行权限
root@:~/sh# ./hello.sh
hello world!!

# 也可以通过绝对路径来执行脚本文件
root@:~/sh# /root/sh/hello.sh
hello world!!

2.3.脚本执行

赋予执行权限,直接运行

通过bash调用执行脚本

root@:~/sh# bash hello.sh hello world!!

注意如果在Windows系统中编写shell脚本的话会出现字符错误,Windows的回车键与Linux的回车不相同

root@:~/sh# ./hellodos.sh
-bash: ./hellodos.sh: /bin/bash^M: bad interpreter: No such file or directory
root@:~/sh# cat -A hellodos.sh
#!/bin/bash^M$
#The first program^M$
#Author:db (E-mail:xxxx@qq.com)^M$
^M$
echo -e 'hello world!!'
root@:~/sh# cat -A hello.sh
#!/bin/bash$
#The first program$
#Author:db (E-mail:xxxx@qq.com)$
$
echo -e 'hello world!!'$

Windows中的回车是^M$符号
Linux中的是$
如何解决呢?
root@:~/sh# dos2unix hellodos.sh
dos2unix: converting file hellodos.sh to Unix format...
root@:~/sh# ./hellodos.sh
hello world!!
使用dos2unix 将格式进行转换

3.Bash的基本功能

3.1.历史命令与命令补全

# 历史命令
history [选项] [历史命令保存文件]
选项:
-c:清空历史命令  # 建议不要情况
-w:把缓存的历史命令写入历史命令保存文件 (~/*bash_history)
默认保存1000条,想要更改的话需要修改配置文件/etc/profile
# 注意Ubuntu的就在~/.bashrc 文件内就可以直接修改

3.1.1.历史命令的调用

  • 使用上,下箭头调用以前的历史命令
  • 使用“!n”重复执行第n条历史命令
  • 使用“!!”重复执行上一条命令
  • 使用”!字串” 重复执行最后一条以该字串开头的命令
  392  ls
  393  ./hellodos.sh
  394  cat -A hellodos.sh
  395  cat -A hello.sh
  396  dos2unix hellodos.sh
  397  ./hellodos.sh
  398  cd ..
  399  clear
  400  history
  401  vim /etc/profile
  402  vim ~/.bashrc
  403  history
  404  clear
  405  history
root@:~# !392
ls
qemu-aarch64-static  sh  snap
root@:~# !!
ls
qemu-aarch64-static  sh  snap

root@:~# !l
ls
qemu-aarch64-static  sh  snap
root@:~#

3.1.2.命令与文件补全

在bash中,命令与文件补全是非常方便与常用的功能,我们只要输入命令或文件时,按“Tab”键就会自动进行补全

3.2.命令别名与常用快捷键

3.2.1.别名

# 命令别名
alias 别名='原命令'

命令执行时顺序

  1. 第一顺位执行用绝对路径或者相对路径执行的命令
  2. 第二顺位执行别名
  3. 第三顺位执行bash的内部命令
  4. 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令

别名永久生效

修改 .bashrc文件,将别名写入这个文件中

删除别名

unalias 别名

3.2.2.bash常用快捷键

3.3.输入输出重定向

3.3.1.标准输入输出

设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stout 1 标准输出
显示器 /dev/sdterr 2 标准错误输出

3.3.2.输出重定向

# 示例
root@:~# ls -l > ls.txt
root@:~# cat ls.txt
total 380
-rw-r--r-- 1 root root      0 Dec 18 14:49 ls.txt
-rw-r--r-- 1 root root 376832 Dec  5 17:01 qemu-aarch64-static
drwxr-xr-x 2 root root   4096 Dec 18 11:25 sh
drwx------ 5 root root   4096 Oct 18 15:39 snap
# 想要将错误命令的提示保存下来需要在 >> 加上2,2>>,2>
# 把命令的结果通过输出重定向保存下来,管理员进行查看就可以知道命令运行是否有错误了
这样不太智能,所以有了下面能同时将正确和错误的命令都输出的命令。

root@:~# ls -l >> ls2.txt 2>> lserorr.txt
root@:~# ls
ls.txt  ls2.txt  lserorr.txt  qemu-aarch64-static  sh  snap
root@:~# cat lserorr.txt
root@:~# cat ls2.txt
total 384
-rw-r--r-- 1 root root    362 Dec 18 15:38 ls.txt
-rw-r--r-- 1 root root      0 Dec 18 15:49 ls2.txt
-rw-r--r-- 1 root root      0 Dec 18 15:49 lserorr.txt
-rw-r--r-- 1 root root 376832 Dec  5 17:01 qemu-aarch64-static
drwxr-xr-x 2 root root   4096 Dec 18 11:25 sh
drwx------ 5 root root   4096 Oct 18 15:39 snap
root@:~# lss -l >> ls2.txt 2>> lserorr.txt
root@:~# cat lserorr.txt
Command 'lss' not found, but there are 15 similar ones.

3.3.3.输入重定向

#示例:
wc [选项] [文件名]
#选项:
-c     统计字节数
-w     统计单词数
-l     统计行数
root@mfedang-virtual-machine:~# wc < ls.txt
  8  63 362
root@mfedang-virtual-machine:~# wc << h
> sad
> sadas
> asdsaf
> h
      3       3      17
输入重定向使用很少,详细资料需要上网查询,这里只是一个示例

3.4.多命令顺序执行与管道符

3.4.1.多命令顺序执行

root@:~# ls;pwd
ls.txt  ls2.txt  lserorr.txt  qemu-aarch64-static  sh  snap
/root
root@:~# lsd;pwd
Command 'lsd' not found, but can be installed with:
snap install lsd
/root
root@:~# lsd&&pwd
Command 'lsd' not found, but can be installed with:
snap install lsd
root@:~# lsd||pwd
Command 'lsd' not found, but can be installed with:
snap install lsd
/root
# 可以查看当前系统创建一个100M的文件需要多久时间
root@:~# date;dd if=/dev/zero of=/root/testfile bs=1k count=100000;date
Wed Dec 18 16:27:49 CST 2024
100000+0 records in
100000+0 records out
102400000 bytes (102 MB, 98 MiB) copied, 0.827522 s, 124 MB/s
Wed Dec 18 16:27:50 CST 2024
## 可以判断上一个命令是否被成功执行
root@:~# lsd && echo yes || echo no
Command 'lsd' not found, but can be installed with:
snap install lsd
no

3.4.2.管道符

格式:命令1 | 命令2

命令1的正确输出作为命令2的操作对象

ll /etc | more        #ll /etc的输出内容,作为more的操作对象

# 示例
grep [选项] "搜索内容" 文件名
选项:
-i:忽略大小写
-n:输出行号
-v:反向查找
--color=auto 搜索出的关键字用颜色显示 

**root@:~# grep -i -n "gs" /etc/wifibroadcast.cfg
7:[gs_mavlink]
11:[gs_video]
13:                                   # video sink (QGroundControl on GS)
root@:~# grep -i -n --color"gs" /etc/wifibroadcast.cfg
--color
root@:~# grep -i -n --color"gs" /etc/wifibroadcast.cfg
--color
root@:~# grep -i -n --color "gs" /etc/wifibroadcast.cfg
7:[gs_mavlink]
11:[gs_video]
13:                                   # video sink (QGroundControl on GS)
root@:~# grep -i -n --color=auto "gs" /etc/wifibroadcast.cfg
7:[gs_mavlink]
11:[gs_video]
13:                                   # video sink (QGroundControl on GS)**

3.5通配符与其他特殊符号

3.5.1.通配符

3.5.2.bash中其他特殊符号


网站公告

今日签到

点亮在社区的每一天
去签到