Shell编程基础(一)

1. 认识Shell

1.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

 

1.4 修改Shell解释器

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

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

2. 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脚本的注释

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

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

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

字符

 

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. 数据的输入与输出

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

 

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 "|%5d|\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

该文件为测试文件。

<<输入重定向测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值