命令行之巅: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  

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ANGULAR网站开发】初始环境搭建

1. 初始化angular项目 1.1 创建angular项目 需要安装npm和nodejs&#xff0c;这边不在重新安装 直接安装最新版本的angular npm install -g angular/cli安装指定大版本的angular npm install -g angular/cli181.2 启动angular 使用idea启动 控制台启动 ng serve启动成功…

Unity3D仿星露谷物语开发8之角色移动

1、目标 通过键盘上的上下左右控制角色移动&#xff0c;默认情况下是run&#xff0c;按住Shift为walk。 2、流程 &#xff08;1&#xff09;优化Settings代码 此时的Settings.cs完整代码如下&#xff1a; using UnityEngine;public static class Settings {// Player Moveme…

使用Python获取PDF文本和图片的精确位置

在处理和分析PDF文档时&#xff0c;获取文本和图片在页面上的精确位置是一个重要的操作。通过确定这些元素的具体坐标&#xff0c;我们可以实现对PDF内容的更精细控制和理解&#xff0c;这对于自动化文档处理、信息提取以及内容重组等工作流程尤为关键。通过Python编程语言&…

浅谈ORACLE中间件SOA BPM,IDM,OID,UCM,WebcenterPortal服务器如何做迁移切换

背景&#xff1a;某集团企业需要将oracle中间件全套产品&#xff0c;包含SOA BPM,IDM,OID,UCM,Webcenter Portal等全套中间件服务器进行迁移&#xff0c;从物理机迁移到虚拟化机器,同时&#xff0c;将现有的单节点测试服务器优化成为高可用的集群服务器&#xff0c;如下是核心迁…

Ubuntu网络配置(桥接模式, nat模式, host主机模式)

windows上安装了vmware虚拟机&#xff0c; vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式&#xff1b;nat模式&#xff1b;host模式 一、桥接模式 所谓桥接模式&#xff0c;也就是虚拟机与宿主机处于同一个网段&#xff0c; 宿主机…

300多种复古手工裁剪拼贴艺术时尚字母、数字、符号海报封面Vlog视频MOV+PNG素材

300复古时尚大小写字母、数字、符号拼贴海报封面平面设计Vlog视频标题动画 Overlay - Cut-Out Letters Animations Pack - Animated Letters, Numbers, and Symbols 使用 Cut-Out Letters Animations Pack 提升您的内容&#xff01;包含 300多个高品质动画资源&#xff0c;包括…

探索Flink动态CEP:杭州银行的实战案例

摘要&#xff1a;本文撰写自杭州银行大数据工程师唐占峰、欧阳武林老师。将介绍 Flink 动态 CEP的定义与核心概念、应用场景、并深入探讨其技术实现并介绍使用方式。主要分为以下几个内容&#xff1a; Flink动态CEP简介 Flink动态CEP的应用场景 Flink动态CEP的技术实现 Flin…

ViT-Reg:面向tinyML平台的回归聚焦型硬件感知微调Vision Transformer

论文标题&#xff1a;ViT-Reg: Regression-Focused Hardware-Aware Fine-Tuning for ViT on tinyML Platforms 作者信息&#xff1a;Md Ragib Shaharear、Arnab Neelim Mazumder 和 Tinoosh Mohsenin&#xff0c;分别来自约翰霍普金斯大学电气与计算机工程系和马里兰大学巴尔的…

基于OpenCV和Python的人脸识别系统_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 公告信息管理 操作日志管理 用户登录界面 用户…

【原创学习笔记】近期项目中使用的西门子V20变频器总结(上篇)

现场V20 22kW变频器如图所示 进线分别为L1,L2,L3,PE线&#xff0c;出现分别为U,V,W接电机 在西门子官网查询手册后&#xff0c;查询可知可以通过多种方式控制变频器&#xff0c;比如&#xff1a;面板&#xff08;BOP&#xff09;控制&#xff0c;端子&#xff08;NPN/PNP&…

spring专题笔记(六):bean的自动装配(自动化注入)-根据名字进行自动装配、根据类型进行自动装配。代码演示,通俗易懂。

目录 一、根据名字进行自动装配--byName 二、根据类型进行自动装配 byType 本文章主要是介绍spring的自动装配机制&#xff0c; 用代码演示spring如何根据名字进行自动装配、如何根据类型进行自动装配。代码演示&#xff0c;通俗易懂。 一、根据名字进行自动装配--byName Us…

实战分享:开发设计文档模版及编写要点

总框架 一、需求类开发设计文档模版 1、PRD链接 PRD文档链接 2、后端设计 1&#xff09;流程图/代码逻辑描述 描述代码逻辑&#xff0c;要求清晰准确&#xff0c;尽量用图表描述 超过3人天工作量的需求必须有流程图 2&#xff09;库表设计 涉及数据库的改动&#xff0c…

Edge Scdn是用来干什么的?

酷盾安全Edge Scdn&#xff0c;即边缘式高防御内容分发网络&#xff0c;主要是通过分布在不同地理位置的多个节点&#xff0c;使用户能够更快地访问网站内容。同时&#xff0c;Edge Scdn通过先进的技术手段&#xff0c;提高了网上内容传输的安全性&#xff0c;防止各种网络攻击…

牛客周赛73B:JAVA

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 \hspace{15pt}小红拿到了正整数 xxx &#xff0c;她希望你找到一个长度为 kkk 的区间&#xff0c;满足区间内恰好有 nnn 个数是 xxx 的倍数。你能帮帮她吗&#xff1f; 输入描述: …

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

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

Docker 安装mysql ,redis,nacos

一、Mysql 一、Docker安装Mysql 1、启动Docker 启动&#xff1a;sudo systemctl start dockerservice docker start 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 2、查询mysql docker search mysql 3、安装mysql 3.1.默认拉取最新版…

Leecode刷题C语言之字符串及其反转中是否存在同一子字符串

执行结果:通过 执行用时和内存消耗如下&#xff1a; bool isSubstringPresent(char* s) {int i,lenstrlen(s),end;for(i0;i<len-1;i){if(s[i]s[i1]) return true;for(endlen-1;end>1;end--){if(s[i]s[end]&&s[i1]s[end-1]) return true;}}return false; }解…

uniapp登录

第一步整登录 先整个appid APPID和APPSecret https://developers.weixin.qq.com/community/develop/article/doc/000ca4601b8f70e379febac985b413 一个账号只能整一个小程序 正确流程 调用uni.login https://juejin.cn/post/7126553599445827621 https://www.jb51.net/a…

【开源免费】基于SpringBoot+Vue.JS安康旅游网站(JAVA毕业设计)

本文项目编号 T 098 &#xff0c;文末自助获取源码 \color{red}{T098&#xff0c;文末自助获取源码} T098&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

AIGC:生成图像动力学

文章目录 前言一、介绍二、方法2.1、运动预测模块运动纹理 2.2、图像渲染模块 三、数据集实验总结 前言 让静态的风景图能够动起来真的很有意思&#xff0c;不得不说CVPR2024 best paper实质名归&#xff0c;创意十足的一篇文章&#xff01;&#xff01;&#xff01; paper&a…