命令行之巅:Linux Shell编程的至高艺术(中)

文章一览

  • 前言
  • 一、输入/输出及重定向命令
    • 1.1 输入/输出命令
      • 1.1.1 read命令
      • 1.1.2 echo命令
    • 1.2 输入/输出重定向
    • 1.3 重定向深入讲解
    • 1.4 Here Document
      • 1.4.1 /dev/null 文件
  • 二、shell特殊字符和命令语法
    • 2.1 引号
      • 2.1.1 双引号
      • 2.1.2 单引号
      • 2.1.3 倒引号
    • 2.2 注释、管道线和后台命令
    • 2.3 命令执行操作符
    • 2.4 复合命令
  • 三、shell脚本调试
    • 3.1 解决环境设置问题
    • 3.2 解决脚本错误
  • 四、文件包含

前言

在Shell编程中,重定向和特殊字符是非常重要的概念。它们允许我们控制输入和输出,并使我们能够构建复杂的脚本和命令。通过重定向和特殊字符,我们可以将命令的输出保存到文件中,从文件中读取输入,以及将多个命令连接在一起执行。这些功能极大地增强了Shell编程的灵活性和实用性。

重定向是将命令的输入或输出从默认位置改变到指定的位置的过程。在命令行中,我们可以使用特殊字符来指定要进行重定向的位置。例如,使用>字符将命令的输出重定向到文件中。这使得我们可以将命令的结果保存到文件中,而不是在终端上显示出来。类似地,使用<字符可以将文件中的内容重定向为命令的输入。这使得我们可以从文件中读取数据,而不是手动输入。此外,还可以使用>>字符将输出追加到文件中,而不是覆盖原有内容。

本篇文章将会讲解重定向以及一些特殊字符与命令

一、输入/输出及重定向命令

1.1 输入/输出命令

1.1.1 read命令

利用read命令从键盘上读取数据,然后赋给指定的变量。

一般格式: read [-u fd] [-n nchars] [name1 name2…]

变量个数M与输入数据N个数之间的关系:

例:(判断闰年与平年)

#!/bin/bash
#determing if a year is a leap year
echo  "Input a year number"                         #提示输入一个年号
read  year                                                     #读取输入的年号
let  "leap=year%4==0&&year%100!=0||year%400==0"     #计算给定年号是闰年吗?
if [ $leap –eq 0 ]                                            #若leap等于0,则不是闰年
then  echo  "$year is not a leap year. "         #输出不是闰年信息
else  echo  " $year is a leap year. "              #否则,输出闰年信息
fi 

1.1.2 echo命令

显示其后的变量值或者直接显示它后面的字符串。

一般格式: echo [-neE] [arg…]

-e 选项代表不换行

$ echo  -e  "Enter  the  file  name  ->\c" 
Enter  the  file  name  ->$ ▌

这种形式与带“-n”选项的命令行功能相同:

-n 选项代表解释转义符

$ echo  -n  "Enter  the  file  name  ->"
Enter  the  file  name  ->$ ▌

1.2 输入/输出重定向

1.输入重定向符

一般形式是:命令 < 文件名

让命令(或可执行程序)从指定文件中取得输入数据。例如:

\$ score < file1

注意

$ wc -l zhangyu
2 zhangyu
$ wc -l < zhangyu
2

上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。

2.输出重定向符

一般形式是:命令 > 文件名

把命令(或可执行程序)执行的结果输出到指定的文件。例如:

\$ who > abc

3.输出附加定向符

一般形式是: 命令>>文件名

把命令(或可执行程序)的输出附加到指定文件的后面,而该文件原有内容不被破坏。例如:

$ date>> file2

注意:需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

1.3 重定向深入讲解

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
command1 < infile > outfile

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

1.4 Here Document

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。

command << delimiter  
    document  
delimiter

它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

注意

结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。

开始的delimiter前后的空格会被忽略掉

wc -l << EOF  
    欢迎来到  
    章鱼大数据  
    www.ipieuvre.com  
EOF  

1.4.1 /dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

command > /dev/null  

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

command > /dev/null 2>&1  
sudo apt-get update  > /dev/null 2>&1

二、shell特殊字符和命令语法

2.1 引号

2.1.1 双引号

由双引号括起来的字符(除$、倒引号(`)和转义字符(\)外)均作为普通字符对待。

$ cat  exam9
echo  "current  directory  is  ` pwd ` "      #倒引号表示命令替换
echo  "home  directory  is  $HOME"       #以HOME的值代替$HOME
echo  "file*.?"                                          #其中的字符都作为普通字符出现
echo  "directory  '$HOME ' "                   #单引号仍作为普通字符出现
echo  "Filename  is  No\$\* "                   #其中有转义字符
$ exam9
current  directory  is  /home/ciee/dir1
home  directory  is  /home/ciee
file*.?
directory  '/home/ciee'
Filename  is No$\* 

2.1.2 单引号

由单引号括起来的所有字符都作为普通字符出现。例如:

$ str=' echo  "directory  is  $HOME" '
$ echo  $str
echo  "directory  is  $HOME "

2.1.3 倒引号

用倒引号括起来的字符串被shell解释为命令行。

可以将一个命令的执行结果赋给变量,即命令替换

一般形式是:变量名=`命令表` 例如:dir=`pwd`

另一种形式是:变量名=$(命令表) 例如:dir=$(pwd)

$ users=` who | wc -l `
$ echo  The  number  of  users  is  $users
The  number  of  users  is  3
$ Nuser=`echo  The  number  of  users  is  \` who | wc -l \` `
$ echo  $Nuser
The  number  of  users  is  3

2.2 注释、管道线和后台命令

1.注释

  • shell程序中以“#”开头的正文行表示注释。

  • #! /bin/bash 说明该脚本是用Bourne Again shell编写的,应该调用相应的解释程序予以执行。

2.管道线

$ ls -l $HOME | wc –l

执行时,前一个命令的输出正好是下一个命令的输入。

$ ls | grep m?.c | wc –l

3.后台命令

$ gcc m1.c m2.c -o prog&

$

后台进程的调度优先级都低于前台进程的优先级

2.3 命令执行操作符

1.顺序执行

各条命令之间以分号(;)隔开,从左到右依次执行。例如:

\$ pwd ; who | wc -l ; cd /home/bin

2.逻辑与

一般形式:命令1 && 命令2

先执行命令1,如果成功,才执行命令2;否则,不执行命令2。例如:

\$ cp ex1 ex10 && rm ex1

3.逻辑或

一般形式:命令1 || 命令2

先执行命令1,如果不成功,则执行命令2;否则,不执行命令2。例如:

$ cat abc || pwd

用&&或||可以把多个命令联系起来

2.4 复合命令

1.{ }形式

以{ }括起来的全部命令可视为语法上的一条命令,出现在管道符的一边。成组命令的执行顺序是根据命令出现的先后次序由左至右执行

$ { echo “User Report for date.”;who; }

应注意,左括号“{”后面应有一个空格右括号“}”之前应有一个分号(;)。

花括号也可以包含若干单独占一行的命令,例如:

{  echo  "Report  of  users  for  ` date ` . "
echo
echo  "There  are  ` who | wc -l `  users  logged  in. "
echo
who | sort ; } 

2.( )形式

(echo  "Current  directory  is  ` pwd ` . "
cd  /home/cieeqc ;  ls -l ;
cp  m1  em1 && rm  m1
cat  em1) 

二者执行过程相同,但存在重要区别:{ }成组命令只在本shell内执行命令表,不产生新的进程;而()成组命令在新的子shell内执行,要建立新的子进程。

$ a="current  value "
$ echo  $a
current  value
$ ( a="new  value-1 " ;  echo  $a )
new  value-1                                                 #(子shell内部a的值)
$ echo  $a
current  value                                              # (与前者不同,这是外部a的值)
$ {  a="new  value-2 " ; echo  $a ;  }
new  value-2                                                #(a的新值)
$ echo  $a
new  value-2                                                #(同一进程,a的值也相同)
$ pwd
/home/ciee /dir1
$ (cd  /bin ;  pwd )                                        #(在子shell中将工作目录改为/bin)
/bin
$ pwd
/home/ciee /dir1                                     #(仍是原来的目录,不受上面命令影响)
$ {  cd  /bin ;  pwd ;  }
/bin
$ pwd
/bin                                                              #(同一进程,前后关联)

三、shell脚本调试

3.1 解决环境设置问题

环境设置不对通常包括以下情况:

​ ① 不能直接在其他shell下运行bash脚本。解决的办法是在脚本的第一行写上:#!/bin/bash。

​ ② 在PATH环境变量中没有包括“.”(当前目录)。解决办法是设置PATH:PATH=$PATH:.

​ ③ 脚本文件与已存在命令的名字相同。

3.2 解决脚本错误

基本的错误类型有两种:语法错误逻辑错误

  • 语法错误是编写程序时违反了所用编程语言的规则而造成的。
  • 逻辑错误通常是由于程序的逻辑关系存在问题。对此类问题需要进行程序调试。

调试技巧——设置x标志:

  • 使用set -x命令:设置x标志后,执行下面命令前先显示该行的内容。

  • 使用bash –x命令:在启动shell时,将它设置成跟踪模式。

四、文件包含

Shell和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

Shell 文件包含的语法格式如下:

. filename   # 注意点号(.)和文件名中间有一空格  
  
#或  
  
source filename  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/943313.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文理解机器学习中二分类任务的评价指标 AUPRC 和 AUROC

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在机器学习的二分类任务中&#xff0c;评估模型性能是至关重要的一步。两种常用的评价指标是 Precision-Recall Curve 下的面积 (AUPRC) 和 Receiver Operating Characteristic Curve 下的面积 (AUROC)…

Visual Studio Code(VS Code)配置C/C++环境

一、Visual Studio Code安装 Visual Studio Code&#xff0c;下文中简称为VS Code的详细安装方法请参考VSCode安装教程&#xff08;超详细&#xff09;-CSDN博客 二、MinGW编译器下载与配置 1、MinGW介绍 MinGW(Minimalist GNU for Windows)是一款用于Windows 平台的轻…

少儿编程在线培训系统:客户服务与学习支持

2.1 VUE技术 VUE它是由HTML代码&#xff0c;配上嵌入在HTML代码里面的Java代码组成的应用于服务器端的语言&#xff0c;使用VUE进行开发能够更加容易区分网页逻辑以及网页设计内容&#xff0c;让程序员开发思路更加清晰化&#xff0c;VUE在设计组件时&#xff0c;它是可以重用的…

uniapp Native.js原生arr插件服务发送广播到uniapp页面中

前言 最近搞了个设备&#xff0c;需求是读取m1卡&#xff0c;厂家给了个安卓原生demo&#xff0c;接入arr插件如下&#xff0c;接入后发现还是少了一部分代码&#xff0c;设备服务调起后触发刷卡无法发送到uniapp里。 中间是一些踩坑记录&#xff0c;最后面是解决办法&#xf…

C项目 天天酷跑(下篇)

上篇再博客里面有&#xff0c;接下来我们实现我们剩下要实现的功能 文章目录 碰撞检测 血条的实现 积分计数器 前言 我们现在要继续优化我们的程序才可以使这个程序更加的全面 碰撞的检测 定义全局变量 实现全局变量 void checkHit() {for (int i 0; i < OBSTACLE_C…

HarmonyOS NEXT 实战之元服务:静态案例效果--航空出行

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

福特汽车物流仓储系统WMS:开源了,可直接下载

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。欢迎大家到本文底部评论区留言。 近日&#xff0c;福特汽车公司推出了其广受好评的仓库管理系统GreaterWMS&#xff08;更大仓库管理系统&#xff09;的开源版本&#xff0c;意味着各行…

STM32完全学习——FLASH上FATFS文件管理系统

一、需要移植的接口 我们通过看官网的手册&#xff0c;可以看到我们只要完成下面函数的实现&#xff0c;就可以完成移植。我们这里只移植前5个函数&#xff0c;获取时间的函数我们不在这里移植。 二、移植接口函数 DSTATUS disk_status (BYTE pdrv /* Physical drive nmuber…

pyqt5冻结+分页表

逻辑代码 # -*- coding: utf-8 -*- import sys,time,copy from PyQt5.QtWidgets import QWidget,QApplication, QDesktopWidget,QTableWidgetItem from QhTableWidgetQGN import Ui_QhTableWidgetQGN from PyQt5.QtCore import Qt from PyQt5 import QtCore, QtGui, QtWidgets…

Windows 使用 非安装版MySQL 8

1.下载MySQL 8 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.40-winx64.zip 2.创建my.ini 下载解压后&#xff0c;发现根目录没有my.ini文件&#xff0c;需手动创建 my.ini # For advice on how to change settings please see # http://dev.mysql.com/doc/refma…

海外招聘丨 苏黎世联邦理工学院—机器学习在社会和政治科学中的应用博士后

雇主简介 苏黎世联邦理工学院是世界领先的科技大学之一。我们以优质的教育、尖端的基础研究和将新知识直接转化为社会而闻名。来自 120 多个国家的 30,000 多名学生认为我们的大学是一个鼓励独立思考和激励卓越的环境的地方。 我们位于欧洲中心&#xff0c;但与世界各地建立联…

微信小程序中遇到过的问题

记录微信小程序中遇到的问题&#xff08;持续更新ing&#xff09; 问题描述&#xff1a;1. WXML中无法直接调用JavaScript方法。2. css中无法直接引用背景图片。3. 关于右上角胶囊按钮。4. 数据绑定问题。5. 事件处理问题。 问题描述&#xff1a; 1. WXML中无法直接调用JavaSc…

idea 8年使用整理

文章目录 前言idea 8年使用整理1. 覆盖application配置2. 启动的时候设置编辑空间大小&#xff0c;并忽略最大空间3. 查询类的关系4. 查看这个方法的引用关系5. 查看方法的调用关系5.1. 查看被调用关系5.2. 查看调用关系 6. 方法分隔线7. 选择快捷键类型8. 代码预览插件9. JReb…

RAGFLOW使用笔记【更新ing】

0.引言 本文记录使用RAGFLOW的一些问题以及解决办法&#xff0c;它以笔记的形式存在&#xff0c;方便我以后回顾自己的学习工作。 1.RAGFLOW上传文件大小默认是128M,如何修改上传文件大小&#xff1f; 更新ragflow/docker/.env中的MAX_CONTENT_LENGTH 环境变量 然后同步更新…

ubuntu22.04安装PaddleX3

PaddleOCR 安装过程可以参考PaddleX本地安装教程 我的电脑环境配置&#xff1a; ubuntu22.04 cuda11.8&#xff08;之前安装的是12.4没有匹配的paddle-gpu;这里改成11.8&#xff09; 一、安装基础环境 1、 conda create -n ppx1 python3.10 2、 conda activate ppx1 3、…

Android 之 Activity 的启动模式(launchMode)

一、Activity 启动模式 在实际项目中&#xff0c;应该根据项目的实际需要来为每个 Activity 指定恰当的启动模式 launchMode。启动模式一共有四种&#xff0c;分别是 standard、singleTop、singleTask 和 singleInstance。可以在 AndroidManifest.xml 中通过给 <activity&g…

软件老化分析

软件老化 课程&#xff1a;软件质量分析 作业 解答 Python代码如下&#xff1a; n int(input("类别数&#xff1a;")) theta list(map(float, input("各个类别的权重&#xff1a;").split())) m list(map(int, input("各个类别的度量元数量&…

Jenkins 构建流水线

在 Linux 系统上安装 Jenkins 服务&#xff0c;以及配置自动化构建项目 前置准备环境&#xff1a;docker、docker-compose、jdk、maven 一、环境搭建 1. Jenkins 安装 &#xff08;1&#xff09;拉取镜像 # 安装镜像包&#xff0c;默认安装最新版本 docker pull jenkins/jen…

5G学习笔记之Non-Public Network

目录 0. NPN系列 1. 概述 2. SNPN 2.1 SNPN概述 2.2 SNPN架构 2.3 SNPN部署 2.3.1 完全独立 2.3.2 共享PLMN基站 2.3.3 共享PLMN基站和PLMN频谱 3. PNI-NPN 3.1 PNI-NPN概述 3.2 PNI-NPN部署 3.2.1 UPF独立 3.2.2 完全共享 0. NPN系列 1. NPN概述 2. NPN R18 3. 【SNPN系列】S…

若依plus apifox导入接口显示为空

项目已经正常启动 访问接口有些没问题&#xff0c;有些有问题 其他模块都可以正常导入 解决&#xff1a;