shell 脚本关键字&符号

2023-11-18

shell概念

  • "shell"既是一种解释型编程语言,也是一个这种编程语言的解释器的名字
  • shell是解释型语言,就是解释器会一条一条的翻译每一条语句并执行,对比之下,C语言是编译型语言,编译器把整个工程编译成可执行文件才能执行
  • 在没有续行符(\回车)的情况下,shell脚本的一条语句以"回车"为结束
  • 任何一个shell脚本程序都必须在开头用#!标识使用的shell程序,如果用的是bash,那就是#!/bin/sh
  • shell脚本一行中的#之后的部分为注释
  • 刚刚写完的一个shell script程序通常是没有执行权限的,需要手动$chmod +x filename.sh来添加可执行权限
  • shell语言本身并不包含linux内置的命令,那些命令本质上都是一个可以在shell环境中执行的程序,只是在shell环境中执行shell脚本可以调用这些程序而已。

特殊符号

$

表示取结果。和变量名一起使用表示取变量的值,和()一起使用表示取命令群组的执行结果

$tunset=123
$echo "$tunset"
123
$echo $(ls Downloads)
lukas-h.github.io-theme.zip youdao-dict_1.1.0-0-deepin_amd64.deb

( )

  • 表示在"nested sub-shell"中划分一个命令群组(command group),如果我们希望里面的命令对之前和之后的设定不影响的话,就要用(),反之,如果需要在当前shell(non-named command group)中执行相关命令,就要用{}表示命令群组。
  • 在数学计算中就是数学中的()
  • 定义数组
$cat shell.sh;./shell.sh 
#!/bin/bash

line="123 25 36532 454"
(
	line="wwww"
	echo "$line"
)
echo "$line"

wwww
123 25 36532 454
$arr=(0 1 2 var)    #定义一个数组
$echo "${arr[0]}"   #显示数组下标为0的元素
0

{ }

  • 用作范围限定
  • 标明在"non-named command shell"中执行的命令群组。shell函数就是使用{}的特性来定义的
  • 配合-+=#/%对变量进行操作
$echo $var
123
$echo $variable

$echo ${var}iable
123iable
$cat shell.sh;./shell.sh 
#!/bin/bash

line="123 25 36532 454"
{
	line="wwww"
	echo "$line"
}
echo "$line"


wwww
wwww
$file=/opt/ros/jade/include/image_view/ImageViewConfig.h 
#匹配+删除
$echo ${file#*/}                #从左侧开始匹配符合模式最短部分,将其剔除,返回剩下的
opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file#*/*/}
ros/jade/include/image_view/ImageViewConfig.h
$echo ${file##*/}            #从左侧开始匹配符合模式的最长部分,将其剔除,返回剩下的
ImageViewConfig.h
$echo ${file%/*}            #从右侧开始匹配符合模式的最短部分,将其剔除,返回剩下的             
/opt/ros/jade/include/image_view
$echo ${file%%/i*}        #从右侧开始匹配符合模式的最长部分,将其剔除,返回剩下的
/opt/ros/jade
#按个数返回
$echo ${file:0:4}           
/opt
$echo ${file:4:9}            #将第4个字符当作第1个,计数9个, 返回   
/ros/jade
#匹配+替换
$echo ${file/opt/root}    #将file中的第一个opt替换为root
/root/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file//i/++}          #将file中的所有i都替换为++
/opt/ros/jade/++nclude/++mage_v++ew/ImageV++ewConf++g.h
#根据变量状态操作,
$echo ${file-fault}            #只要设定了,就返回file,否则返回fault                
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file1-fault}
fault
$echo ${file:-fault}            #只要设定了且非空,就返回file,否则返回fault
/opt/ros/jade/include/image_view/ImageViewConfig.h

$echo ${file+fault}            #只要设定了,就返回fault
fault
$echo ${file:+fault}           #只要设定了且非空,就返回fault
fault

$echo ${file=fault}            #只要file没设定,就将fault赋值给file并返回
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file1}

$echo ${file1=fault}
fault
$echo ${file1}
fault

$echo ${file:=fault}           #只要file没设定或非空,就将fault赋值给file并返回
/opt/ros/jade/include/image_view/ImageViewConfig.h

$echo ${file?fault}             #只要file没设定,就将fault输出至STDERR
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${file:?fault}            #只要file没设定或为空,就将fault输出至STDERR
#统计字符数

$echo ${file}
/opt/ros/jade/include/image_view/ImageViewConfig.h
$echo ${#file}
50

(( ))

用作计算,shell支持十进制/十六进制/二进制的+ - * / % & += -= *= /= %= ++ -- 等算术运算,以及| ^ ! > >= < <= !=等逻辑运算。同样的效果也可以使用expr ...来实现,但是expr是Linux的内置软件,并不是shell语言的关键字

$echo $((1 + 2))
3
$echo $((0xf + 1))
16
$cal=132
$echo $(($cal+1))
133

[ ]

  • 用作取数组元素,使用${arr[n]}访问数组编号为n的元素
$arr=(0 1 2 var)
$echo "${arr[0]}"
0
$echo "${arr[3]}"
var

` `

两个反单引号表示命令替换,和$()是等价的。个人觉得看着比$()清晰,但是如果多层嵌套的话可能需要转义,此时就没有$()看着易懂。在下面的嵌套结构中,我们本意是先执行cmd3,将执行结果传给cmd2,再将结果传给cmd1

cmd1 `cmd2 `cmd3``

但是其实被解析成了下面这个

cmd1 `cmd2`cmd3                   ``

为了解决这个问题,我们需要使用转义字符,写成下面这个样子才能正确的传达我们的意思

cmd `cmd2 \`cmd3\``

但如果我们使用$(),就可以让代码更清晰

$echo `echo`echo 12``   #被分解成了 echo `echo` echo 12``  
echo 12
$echo `echo \`echo 12\``    #这个才对
12
$echo $(echo $(echo 12))    #这个才对
12

|

管道表示将前一个命令的返回结果用作后一个命令的参数,管道的前后必须都是命令,管道是管理Linux十分有用的工具
$grep "test" file1.txt | wc -l

> >>

> 以新建的方式重定向,如果文件不存在就创建文件并将内容写入,如果文件存在就把文件清空再写入内容
>>以追加的方式重定向,如果文件不存在就创建文件并将内容写入,如果文件存在就在原文件后面写入内容

<

我们通常的操作就是文件,其实已经使用的输入重定向

2>

  • 标准输入,标准输出,标准错误其实是三个完全不同的文件,虽然我们看起来标准输出和标准错误都输入到显示屏中显示,但是不能用输出重定向将错误重定向到其他文件
  • 标准输入,标准输出,标准错误的文件描述符分别是0,1,2,这也是错误重定向2>的由来

&&

&&前的命令执行成功了就继续执行后面的命令

||

||前的命令执行失败了就去执行后面的命令

;

不论;前的命令执行成功与否都去执行后面的命令

关键字

readonly

相当于C中的const,readonly将变量设为只读模式,任何针对他们的赋值都是错误的

$readonly var=123
$var=345
bash: var: readonly variable

unset

删除变量

unset var_name 删除变量var_name
unset -v first middle last 删除其他变量
unset -f fcn 删除函数
$tunset=123
$echo $tunset
123
$unset tunset
$echo $tunset

$

shift

用来截去来自列表的位置参数,从左侧开始,一旦执行shift,$1的初始值就会永远消失,取而代之的是$2的旧值,依次类推,$#的值也会依次减1
shift也可以带一个参数,表示一次截取的个数

$cat shell.sh 
#!/bin/bash
echo "${1}"

shift

echo "${1}"
$./*.sh 123 456
123
456

set

设置新的位置参数

$set qq ww ee
$echo "${1}"
qq
$echo "${0}"
bash
$echo "${2}"
ww
$echo "$#"
3

export

添加变量到变量导出列表,即如果在shell中执行子shell,该变量将作为环境变量从而在子shell中变得可以使用。

$cat shell.sh 
#!/bin/bash
echo "$NEWENV"

$NEWENV=123
$./shell.sh 

$export NEWENV
$./shell.sh 
123

exit

提前结束标本

 

原文:

https://www.cnblogs.com/xiaojiang1025/p/5863984.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell 脚本关键字&符号 的相关文章

  • 如何通过管道将输入和输出传送到交互式 shell?

    我正在尝试构建一个应用程序 使用户能够与命令行交互式 shell 例如 IRB 或 Python 进行交互 这意味着我需要将用户输入通过管道传输到 shell 并将 shell 的输出返回给用户 我希望这会像管道 STDIN STDOUT
  • 如何在c#中使用net user

    我正在尝试将 net user 与 c 一起使用 System Diagnostics ProcessStartInfo proccessStartInfo new System Diagnostics ProcessStartInfo n
  • 使用 AWK 或 SED 以及以下标签以逗号分隔

    使用 AWK 或 SED 以及下面使用的标签以逗号分隔 BEGIN AccountID BEGIN CallerID BEGIN Billed Account Attributes 1111111 1111111 1111111 END B
  • bash while 循环线程

    我有一个 while 循环读取来自 a 的行 hosts while read line do ip line check done lt hosts 我的问题是我可以使用某种方法来加快速度 或者一次在 10 个主机上运行检查 每个检查都在
  • 在 bash 函数中生成后台进程

    我正在编写一个 Bash 函数来启动需要从某个文件夹启动的服务器 但我不希望启动该服务器影响我当前的工作 我写了以下内容 function startsrv pushd cd TRUNK SERVERCOMMAND popd 我的变量都已设
  • 如何替换带引号的多单词字符串作为参数?

    我正在尝试替换包含多个带引号的单词的字符串变量作为命令的参数 因此 给出以下示例脚本 请注意 shebang 中的 x 这会导致输出被记录到 stderr bin bash x myArg hello world echo string i
  • 使用 shell 脚本在 docker 容器内运行脚本

    我正在尝试创建一个 shell 脚本来设置 docker 容器 我的脚本文件如下所示 bin bash docker run t i p 5902 5902 name mycontainer privileged myImage new b
  • 如何在 Bash 中将字符串转换为小写

    有办法进去吗bash questions tagged bash将字符串转换为小写字符串 例如 如果我有 a Hi all 我想将其转换为 hi all 有多种方法 POSIX标准 https en m wikipedia org wiki
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 让 Emacs ansiterm 和 Zsh 更好地发挥作用

    我一直在尝试在 emacs 会话中使用 Zsh 而无需 emacs 重新映射所有 Zsh 键 我发现 ansi term 对此非常有效 但是我仍然遇到一些问题 我输出了很多垃圾字符 我可以用以下方法修复它 Setup proper term
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • 如何仅将整个嵌套目录中的头文件复制到另一个目录,在复制到新文件夹后保持相同的层次结构

    我有一个目录 其中有很多头文件 h 和其他 o 和 c 文件以及其他文件 这个目录里面有很多嵌套的目录 我只想将头文件复制到一个单独的目录 并在新目录中保留相同的结构 cp rf oldDirectory newDirectory将复制所有
  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • linux下如何获取昨天和前天?

    我想在变量中获取 sysdate 1 和 sysdate 2 并回显它 我正在使用下面的查询 它将今天的日期作为输出 bin bash tm date Y d m echo tm 如何获取昨天和前天的日期 这是另一种方法 对于昨天来说 da
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • 列出破折号中当前定义的函数?

    我想列出当前定义的函数dash 有什么办法可以做到这一点吗 我能想到的最接近的是type它可以用来测试一个函数是否存在 但除此之外我很困惑 附 我说的是dash在这里 不是bash or zsh 看看 exec c 似乎没有 没有 表是静态
  • 为什么减法返回 - 符号

    我对简单的减法有疑问 但我不明白出了什么问题 我的代码 start date s N cut b1 13 Treatment end date s N cut b1 13 delta expr end start echo delta de
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase

随机推荐

  • asm: 实现打印“Hello, world!“

    使用汇编打印 Hello world 实现打印 Hello world 的汇编代码 代码详细剖析 实现打印 Hello world 的汇编代码 我们来直接贴代码 section text global start start mov edx
  • 【华为OD机试真题 JAVA】可以组成网络的服务器

    JS版 华为OD机试真题 JS 可以组成网络的服务器 标题 可以组成网络的服务器 时间限制 1秒 内存限制 262144K 语言限制 不限 在一个机房中 服务器的位置标识在 n m 的整数矩阵网格中 1 表示单元格上有服务器 0 表示没有
  • UI页面切换按钮随页面切换缩放

    选中按钮放大其余按钮缩小的 效果 using System Collections using System Collections Generic using UnityEngine public class BottomBarBtn M
  • No module named cv2 报错处理

    运行python脚本出现 No module named cv2 这时我们安装下opencv python依赖即可 python3 m pip install opencv python 转载于 https www cnblogs com
  • flutter for循环removeAt(i)数据遇到的问题

    通常都是for循环遍历从前往后顺序 这时候遇到符合条件的通过下标把该数据删掉 for int i 0 i lt 40 i if i 2 removeAt i 删一个数据不会出问题 如果要删多个数据就会有问题了 比如i为0时删了列表第一个 那
  • Windows安装Linux子系统

    win10更新了安装linux子系统的步骤 使之更加方便 只需要在CMD运行命令 wsl install 当然这会涉及很多默认的选项 Windows 命令提示符中输入以下命令 找到可供安装的 Linux 发行版列表 wsl list onl
  • LSPosed 安装教程(LSP框架安装教程)

    1 下载LSPosed模块 CSDN下载 Riru 版 LSPosed Riru Zygisk版 LSPosed Zygisk 或 github下载 LSPosed GitHub 2 打开Magisk 设置 开启 Zygisk 3 打开面具
  • 手把手教你玩转YOLOX--Windows(上)

    旷视开源的YOLOX其性能超越 YOLOv3 YOLOv4 和 YOLOv5 应不少小伙伴的要求 我在这里用手把手教学的方式展示一下YOLOX的搭建 上篇 下一篇将着重介绍YOLOX如何进行模型的训练 进阶篇介绍YOLOX的原理 代码讲解及
  • 卷积原理(卷积,padding填充,步长,多通道卷积)

    1 卷积 卷积可以用于对输入数据进行特征提取 特征提取的过程可以理解为通过卷积对输入特征进行加权运算 提取输入中的重要信息 卷积运算的过程就是通过卷积核扫描输入矩阵的元素 将卷积核和扫描对应的元素相乘再相加 得到一个输出 通过不断地滑动 得
  • 看书标记【R语言数据分析与挖掘实战】4

    第四章 数据预处理 4 1 数据清洗 缺失值处理 使用is na 判断缺失值是否存在 complete cases 可以识别样本数据是否完整从而判断缺失情况 删除法 na omit 函数移除所有含有缺失数据的行 data p 删除p列 替换
  • canal简介及canal部署、原理和使用介绍

    阿里canal简介及canal部署 原理和使用介绍 canal入门 什么是canal 阿里巴巴B2B公司 因为业务的特性 卖家主要集中在国内 买家主要集中在国外 所以衍生出了杭州和美国异地机房的需求 从2010年开始 阿里系公司开始逐步的尝
  • 学习心态

    今天 2019年6月4日 将属于自己的域名写上了属于我决定的页面 那种感觉我觉得对于正在学习的我们来说是一种催化剂 尽管还有很多很多我们不知道 等待我们去发掘和使用 但当我们时刻保持这种一边学习一边让自己充满自豪的感觉 那会让我们学的轻松
  • promise和async await的区别

    之前面试的时候被面试官问到 你能说说Promise和async await的区别吗 我才发现自己写了这么久的Promise then all async await 还真是没了解过这两者的原理和区别 于是赶紧学习了些资料 拿出小本本记录下来
  • 华为od机试题9 真题

    华为od机试题 真题 9 寻找重复字符 7 字符串翻转 6 小朋友身高排序 5 CPU最少执行时间 4 猴子爬山 3 输出信元的值 2 指定元素对最小和 1 勾股数元组 以下题目附带Java解法 是我个人写的 不一定是标准答案 没有真正的测
  • 对JS中global、window、document、this区别的理解

    本文章综合了很多地方对global和widow区别的解释 我加以挑选再结合我自己的理解以及遇到的问题写出来的 可能比较乱 但是全部看完或许对global和window对象的理解还是有帮助的 一个关于window和global区别的链接 可以
  • 12-Linux下Oracle 11g R2数据库安装

    Oracle 11g R2数据库安装 安装环境准备 需要先装centos系统 并更新组件 安装请参考centos6 5安装手册 用户一览 用户 所在组 权限 Root root 超级用户 Oracle oinstall dba 安装地址 组
  • 【windows核心编程】第二章-笔记

    一个字节8位 最多表示256个字符 UTF 16 将每个字符编码为2个字节 即Unicode windows使用 utf 16 支持代理 代理使用32位来表示一个字符 UTF 8 将一些字符编码为1个字节 一些字符编码为2个字符 一些字符编
  • IDEA 集成VisualVM Launcher JDK 监控程序插件

    IDEA 安装VisualVM Launcher 插件 1 打开setting 找到Plugins选项 安装VisualVM Launcher 插件 如果有就跳过这一步 检索 VisualVM Launcher 安装成功后 重新启动IDEA
  • 感知机与支持向量机

    感知机 追求最大程度正确划分 最小化错误 容易造成过拟合 SVM 追求大致正确分类的同时 最大化分类间隔 一定程度上避免过拟合 1 普通感知机不能产生最大间隔 而SVM可以 2 带margin的感知机可以通过两种手段实现 早停 加正则化项
  • shell 脚本关键字&符号

    shell概念 shell 既是一种解释型编程语言 也是一个这种编程语言的解释器的名字 shell是解释型语言 就是解释器会一条一条的翻译每一条语句并执行 对比之下 C语言是编译型语言 编译器把整个工程编译成可执行文件才能执行 在没有续行符