shell编程课程日志(Shell编程一)

认识Shell1.1 概述

我们知道计算机是无法直接识别我们键入的指令的,在计算机语言里只有二进制的0和1,所有信息都将转化为由0和1组成的代码进行存储和传输。那么我们和计算机之间进行交互就需要有一个翻译官来翻译我们键入的指令以便计算机能够识别,在Linux系统中这个翻译官正是由Shell来担任的。简单来说,Shell就是用户与Linux内核之间的解释器,负责将用户的指令翻译为内核可以识别的指令。

1.2 常见Shell解释器

常见的Shell解释器有:

/bin/bash

/bin/sh

/bin/csh

/bin/tcsh

等等。

1.3 查看Shell解释器

如何查看本机所支持的Shell解释器有哪些呢?

可以使用命令:

cat /etc/shells

shell编程课程日志(Shell编程一)(1)

1.4 修改Shell解释器

Linux系统中新创建的用户默认的登录Shell为/bin/bash,可以使用usermod或chsh命令修改用户的登录shell:

shell编程课程日志(Shell编程一)(2)

本系列文章使用的操作系统为CentOS7.5,Shell解释器为/bin/bash。

Shell脚本基础2.1 什么是Shell脚本?

简单地说就是将Linux或类UNIX系统的命令写入一个文件中,这个文件就是一个Shell脚本文件。

2.2 Shell脚本的书写格式

一个合格规范的脚本应该包含以下这些内容:

  1. #!脚本声明:标明使用哪种解释器来解释该脚本的代码
  2. 注释信息:标明该脚本编写的步骤、思路、用途等等其他信息,方便阅读
  3. 脚本正式可执行指令语句:具体的Shell代码语句块
2.3 编写第一个Shell脚本

#!/bin/bash # 第一个Shell脚本,输入Hello World echo "Hello World"

2.4 Shell脚本的注释

注释的内容计算机将自动忽略,这部分内容是给阅读者看的。

单行注释:# 第一行的#!为标识所使用的解释器

单行或多行注释:<<字符

字符

shell编程课程日志(Shell编程一)(3)

脚本文件的执行方式3.1 脚本文件没有可执行权限时

新创建的脚本文件,默认是没有可执行权限的,不可以直接执行,此时可以使用bash、sh、source、. 来执行脚本文件。

[root@localhost shell]# chmod -x first.sh [root@localhost shell]# ls -l first.sh -rw-r--r-- 1 root root 122 Aug 30 11:55 first.sh [root@localhost shell]# bash first.sh Hello World [root@localhost shell]# sh first.sh Hello World [root@localhost shell]# source first.sh Hello World [root@localhost shell]# . first.sh Hello World

上述各命令执行脚本的区别:

bash/sh:执行脚本时将会开启一个shhd子进程进行执行脚本命令

source/.:执行脚本时是直接在bash终端下执行的,没有开启子进程。

3.2 脚本文件有可执行权限时

脚本文件分配了可执行权限后,可以直接使用绝对路径或相对路径来执行脚本文件。

[root@localhost shell]# ./first.sh Hello World [root@localhost shell]# /opt/shell/first.sh Hello World

数据的输入与输出4.1 数据输出4.1.1 echo 命令

功能描述:echo命令主要用来输出显示字符串信息。

语法格式:echo [选项] 字符串

常用选项:

  1. -n:不换行输出
  2. -e:扩展输出,可以让echo命令识别\后面的转义符号含义。

[root@localhost shell]# echo "Hello World" #echo默认换行输出 Hello World [root@localhost shell]# echo -n "Hello World" #添加-n选项不换行 Hello World[root@localhost shell]# echo -e "\033[031mHello World\033[0m" # 使用-e选项输出带颜色的字符串 Hello World # 在第3行,第10列输出红色字体的Hello World [root@localhost shell]# echo -e "\033[31m\033[3;10H Hello World\033[0m" Hello World

shell编程课程日志(Shell编程一)(4)

4.1.2 printf 命令

功能描述:格式化输出数据,printf默认不换行输出

语法格式:printf [格式] 参数(一般参数就是要输出的内容)

常用的格式字符串及功能描述如下表:

格式字符

功能描述

%d或%i

十进制整数

%o

八进制整数

%x

十六进制整数

%u

无符号十进制整数

%f

浮点数(小数点数)

%s

字符串

\b

退格键

\f

换行且光标仍停留在原位置

\n

换行且光标移至行首

\r

光标移至行首,但不换行

\t

Tab键

[root@localhost shell]# printf "%d" 23 #不换行输出数字 23[root@localhost shell]# printf "%d\n" 23 # 换行输出数字 23 [root@localhost shell]# printf "|]|\n" 23 #换行输出数字并且宽度为5右对齐 | 23| [root@localhost shell]# printf "|%-5d|\n" 23 #换行输出数字并且宽度为5左对齐 |23 | [root@localhost shell]# printf "|%-5s|\n" aaa #左对齐输出字符串 |aaa | [root@localhost shell]# printf "|%5s|\n" aaa #右对齐输出字符串 | aaa| [root@localhost shell]# printf "%3.2f\n" 626.327237 #输出浮点数,保留两位小数 626.33 [root@localhost shell]# printf "%.3f\n" 626.327237 #输出浮点数,保留三位小数 626.327

4.2 输入数据4.2.1 read 命令

功能描述:可以从标准输入中读取一行数据

语法格式:read [选项] [变量名]

默认变量名为REPLY。

常用选项:

  1. -p:显示提示信息
  2. -t:设置读入数据的超时时间
  3. -n:设置读取n个字符后结束,默认会读取标准输入的一整行内容
  4. -r:支持读取\,默认read命令理解\为特殊符号(转义字符)
  5. -s:静默模式,不显示标准输入的内容

[root@localhost shell]# read key1 aaa [root@localhost shell]# echo $key1 aaa [root@localhost shell]# read key1 key2 key3 11 22 33 [root@localhost shell]# echo $key1 11 [root@localhost shell]# echo $key2 22 [root@localhost shell]# echo $key3 33 [root@localhost shell]# read -p "请输入账号:" uname 请输入账号:test [root@localhost shell]# echo $uname test [root@localhost shell]# read -s -p "请输入密码:" passwd 请输入密码:[root@localhost shell]# echo $passwd 123456

5. 输入与输出重定向

在Linux系统中输出可以分为标准输出和标准错误输出。标准输出的文件描述符为1,标准错误输出的描述符为2。而标准输入的文件描述符为0。

如果希望改变输出信息的方向,可以使用>或>>符号将输出信息重定向到文件中。

重定向符号与功能描述表

符号

功能描述

1>

标准输出覆盖重定向

1>>

标准输出追加重定向

2>

标准错误输出覆盖重定向

2>>

标准错误输出追加重定向

&>

标准输出和标准错误输出覆盖重定向

&>>

标准输出和标准错误输出追加重定向

<

输入重定向,后面需要跟一个文件名

<<

可以将数据内容重定向传递给前面的一个命令,作为命令的输入

5.1 输出重定向

[root@localhost shell]# echo "Hello the world" > test.txt [root@localhost shell]# cat test.txt Hello the world [root@localhost shell]# echo "My Shell Scripts" > test.txt [root@localhost shell]# cat test.txt My Shell Scripts [root@localhost shell]# echo "test file" >> test.txt [root@localhost shell]# cat test.txt My Shell Scripts test file [root@localhost shell]# ls /etc/hosts /abc > test.txt ls: cannot access /abc: No such file or directory [root@localhost shell]# cat test.txt /etc/hosts [root@localhost shell]# ls /etc/hosts /abc 2> test.txt /etc/hosts [root@localhost shell]# cat test.txt ls: cannot access /abc: No such file or directory [root@localhost shell]# ls /etc/hosts /abc &> test.txt [root@localhost shell]# cat test.txt ls: cannot access /abc: No such file or directory /etc/hosts [root@localhost shell]# ls /etc/hosts /abc > ok.txt 2> error.txt [root@localhost shell]# cat ok.txt /etc/hosts [root@localhost shell]# cat error.txt ls: cannot access /abc: No such file or directory

另外,可以使用2>&1将错误输出重定向到标准输出,也可以使用1>&2将标准输出重定向到错误输出。

[root@localhost shell]# ls /abc > ok.txt 2>&1 [root@localhost shell]# cat ok cat: ok: No such file or directory [root@localhost shell]# echo "hello" 2> error.txt 1>&2 [root@localhost shell]# cat error.txt Hello

Linux系统中有一个特殊的设备文件/dev/null,这是一个黑洞。无论往该文件中写入多少数据,都会被系统吞噬、丢弃。

[root@localhost shell]# echo "hello" > /dev/null [root@localhost shell]# ls /abc 2> /dev/null [root@localhost shell]# ls /etc/hosts /abc &> /dev/null

5.2 输入重定向5.2.1 < file 输入重定向

例:将/etc/hosts文件中的内容输入重定向到邮件内容中,发送给root用户

[root@localhost shell]# mail -s warning root@localhost < /etc/hosts [root@localhost shell]# mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 1 message 1 new >N 1 root Mon Aug 30 15:47 19/769 "warning" & 1 Message 1: From root@localhost.localdomain Mon Aug 30 15:47:16 2021 Return-Path: <root@localhost.localdomain> X-Original-To: root@localhost Delivered-To: root@localhost.localdomain Date: Mon, 30 Aug 2021 15:47:16 0800 To: root@localhost.localdomain Subject: warning User-Agent: Heirloom mailx 12.5 7/5/10 Content-Type: text/plain; charset=us-ascii From: root@localhost.localdomain (root) Status: R 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 & exit

5.2.2 <<输入重定向

<<符号(也称为Here Document)代表你需要的内容在这里。

[root@localhost shell]# vim second.sh #!/bin/bash # cat 通过Here Document读取数据,再通过输出重定向将数据导入文件 cat > /opt/shell/test.txt << HERE 该文件为测试文件。 <<输入重定向测试。 HERE [root@localhost shell]# chmod x second.sh [root@localhost shell]# ./second.sh [root@localhost shell]# cat test.txt 该文件为测试文件。 <<输入重定向测试。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页