超详细的Shell学习教程第一篇

2023-10-26

1.1 Shell介绍

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

1.2我的第一个Shell脚本

echo "hello world"  

hello world

脚本运行方式:sh  脚本名称.sh  或者 ./脚本名称.sh

这里讲解下chmod权限问题

chmod 设置权限

  1.     u 文件的拥有者
  2.     g 文件的拥有者组
  3.     o 其它用户
  4.     a 所有用户

 权限操作

  1.     +添加权限
  2.     -删除权限
  3.     =设置权限

给文件的拥有者添加r权限

chmod u+r test.txt  
chmod u=rwx test.txt
ll -d /var/www/html/ 查看文件权限
chmod +x ./test.sh 使脚本具备
如果某个文件只有读权限,使用chmod +x 提示不可更改
如:
修改/etc/profile时提示为只读文件,不允许修改,

敲#chmod 777 /etc/profile后仍不允许修改

解决办法:

在root权限下敲 #:mount -o remount,rw /

1.3Shell语法

$ a="hello world"
$ echo a
hello world

$ echo $a
hello world

$ echo echo $a" good"
hello world good

单引号和双引号
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
echo '$a hello'
$a hello

$ echo "$a hello"
hello world hello

$ echo ${a}
hello world

删除变量

root@ubuntu:/home/lulu/Desktop/Test# a="hello"
root@ubuntu:/home/lulu/Desktop/Test# echo $a
hello
root@ubuntu:/home/lulu/Desktop/Test# unset a
root@ubuntu:/home/lulu/Desktop/Test# echo $a

特殊符号的使用:

双引号用于括起来一段字符串值,支持$var形式的变量替换
单引号也表示其内容是字符串,不支持转义
\范斜线,某些情况下表示转义
$(ls) 表示执行ls的结果,与''类似,不过不可以嵌套
`反引号 用法比较特殊,代表命令的输出,非常有用
root@ubuntu:/home/lulu/Desktop/Test# echo `ls`
grep.txt OpenSed Psed sed Sed sed.txt students_store test
root@ubuntu:/home/lulu/Desktop/Test# a=`ls`
root@ubuntu:/home/lulu/Desktop/Test# $a

root@ubuntu:/home/lulu/Desktop/Test# array=(`ls`)
root@ubuntu:/home/lulu/Desktop/Test# echo $array

$() 对变量进行操作,比如相加$(a+b)或者$($a+$b)
$ echo $((2+3))
5$ echo $((2+3*4))
14




(())是整数扩展,把里面的变量当做整数去处理
({1,10})等价于seq 1 10,表示1到10

$ echo -e "aaa\nbbb"
aaa
bbb

$ seq 1 10
1
2
3
4
5
6
7
8
9
10

预定义变量:

$ echo $PWD
$ echo $HOME
$ echo $USER
$ echo $PATH
root@ubuntu:/home/lulu/Desktop/Test# echo $PWD
/home/lulu/Desktop/Test
root@ubuntu:/home/lulu/Desktop/Test# echo $HOME
/root
root@ubuntu:/home/lulu/Desktop/Test# echo $USER
root
root@ubuntu:/home/lulu/Desktop/Test# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

字符串操作:

提取子字符串:

$ a="hello world"
$ echo ${a:1:4}
ello


获取字符串长度:

$ a="hello world"

$echo ${#a}
11

查找子字符串:

查找字符o的位置,如果查找多个字符

$ a="hello world"

$ echo `expr index "$a" o`
5
$ echo `expr index "$a" ow`

拼接字符串:

root@ubuntu:/home/lulu/Desktop/Test# a="hello"
root@ubuntu:/home/lulu/Desktop/Test# b="world"
root@ubuntu:/home/lulu/Desktop/Test# echo $a $b
hello world

root@ubuntu:/home/lulu/Desktop/Test# c="$a $b"
root@ubuntu:/home/lulu/Desktop/Test# echo $c
hello world

使用单引号
root@ubuntu:/home/lulu/Desktop/Test# d='hello ,${b}'
root@ubuntu:/home/lulu/Desktop/Test# echo $d
hello ,${b}

双引号:
root@ubuntu:/home/lulu/Desktop/Test# d="hello ,${b}"
root@ubuntu:/home/lulu/Desktop/Test# echo $d
hello ,world


截取字符串:

去头
root@ubuntu:/home/lulu/Desktop/Test# s="hello from world"
root@ubuntu:/home/lulu/Desktop/Test# echo ${s}
hello from world
root@ubuntu:/home/lulu/Desktop/Test# echo "${s#hello}"
 from world
root@ubuntu:/home/lulu/Desktop/Test# echo ${s#hello}
from world
root@ubuntu:/home/lulu/Desktop/Test# echo ${s#*o}
from world
root@ubuntu:/home/lulu/Desktop/Test# echo ${s#**o}
root@ubuntu:/home/lulu/Desktop/Test# echo ${s##*o}
rld
root@ubuntu:/home/lulu/Desktop/Test# echo ${s##*ho}
hello from world

掐尾
root@ubuntu:/home/lulu/Desktop/Test# echo ${s%%f}
hello from world
root@ubuntu:/home/lulu/Desktop/Test# echo ${s%%f*}
hello

替换

root@ubuntu:/home/lulu/Desktop# s="hello from testerhome"
root@ubuntu:/home/lulu/Desktop# echo $s
hello from testerhome
root@ubuntu:/home/lulu/Desktop# echo ${s/testerhome/aaa}
hello from aaa
root@ubuntu:/home/lulu/Desktop# echo ${s/testerhome/home}
hello from home

数组讲解: 

数组变量:
array=(1,2,3,4,5)

输出数组元素
$ echo ${array[@]}
$ echo ${array[*]}
$ echo ${array}

获取数组大小长度

$ length=${#a[*]}

读取数组元素

${数组名[下标]}

$echo ${array_name[@]}

$ array[0]="hello"

$ array[1]="world"

$ array[2]="good"

$ echo ${#array[*]}
3

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

超详细的Shell学习教程第一篇 的相关文章

  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少

随机推荐

  • Android——(高级控件下拉框与搜索框)

    1 高级控件与低级控件区别 是否使用适配器 2 适配器种类和作用 2 1 种类 数组适配器 ArrayAdapter new ArrayAdapter
  • MySQL - java链接mysql8 并兼容链接mysql5 亲测可用

    开始之前先去官网捋一遍 MySQL Connector J开发人员指南 看看官方的一些变动 和一些可能要注意的点 或者一些可能会踩到的坑 事先 我们要有一个使用mysql5 x的应用或者服务 需要修改的部分不算多 但是要想同时想兼容5 x和
  • java: cannot find symbol symbol: variable log

    使用Intellij idea的时候 编译项目始终报错java cannot find symbol symbol variable log 装Lombok Plugin 插件 设置 build execution deployment g
  • react-redux库

    安装react redux tnpm i react redux 未优化前 src components Count index tsx import React useState from react export default fun
  • UE4命令行打包项目

    RunUAT bat在ue安装路径找 1 Compiling the client 编译客户端的命令行代码 RunUAT BuildCookRun project full project path and project name upr
  • MySQL 命令环境变量设置方法

    安装完MySQL之后 大家可以直接打开MySQL的client输入命令 操作MySQL数据库 当然也可以使用dos窗口输入MySQL命令操作MySQL数据库 方法1 1 打开dos窗口 具体怎么打开 百度 2 定位到MySQL安装目录下的b
  • jmeter生成随机数

    打开函数助手 Random 写入随机范围的最小值 和最大值 name of variable in which to store the result 为变量名 写好后 点击生成 复制字符串 粘贴到需要的请求上即可
  • linux查看vlan命令,[转]linux VLAN配置(vconfig)

    1 安装vlan vconfig 和加载8021q模块 aptitude install vlan modprobe 8021q 2 使用linux vconfig命令配置vlan vconfig add eth0 100 vconfig
  • 网络安全——cobalt Strike 之office钓鱼

    一 office钓鱼 在无需交互 用户无感知的情况下 执行office文档中内嵌的恶意代码 例如宏 从远控地址中下载并运行恶意可执行程序 例如远控木马 勒索病毒等 cobalt strike office钓鱼原理 主要生成一段vba代码 然
  • 前端发送的form-data类型name=“carNumber“的参数后端怎么接收

    需求 前端将图片和其他信息一起已form data类型发送给后端 图片以二进制流的形式 其他信息以key value的键值对的形式 举例 具体荷载 后端controller层接收的方法 RequestMapping value upload
  • linux安装jdk8

    1 官网下载链接 Java Downloads Oracle 2 下载完成之后 我们打开linux 执行如下命令 最后通过rz命令将文件上传 root localhost local mkdir usr local java root lo
  • android imageloader 进度条,Android-Universal-Image-Loader使用介绍

    图片开源库是一个应用非常广泛的第三方库 几乎所有的应用都会使用 目前而言常见的图片库有 Android Universal Image Loader Picasso Fresco Glide等 下面是国内Top500Android应用分析报
  • Win10笔记本屏幕最低亮度依旧很亮?最高亮度依旧很暗?

    左下角搜索 显卡 打开 英特尔R显卡控制中心 点击 显示器 点击 颜色 里面有 全部颜色 在这里调节即可 嫌太亮 调低些 反之则反
  • 必刷算法题之排序篇(题目及代码)---C++

    前言 该篇博客记录了和排序有关的一些题目 差不多是逐级递增的难度 后续还会补充 有具体思路和代码 文章目录 第一题 排序 第二题 判断字符是否唯一 第三题 最小的k个数 第四题 单链表的排序 第五题 最大数 第六题 调整数组顺序使奇数位于偶
  • javaScript中Float精度计算

    在项目中做了一个计算统计值的部分 实现过程是通过 javaScript 进行累加的 在测试时出现了一个很乖的问题 在此记录一下 1 问题背景 项目中有一个表格字段 数据类型是float的 在数据库中均以Decimal 10 2 的格式保存
  • springMVC(数据格式化+验证以及国际化+中文乱码处理+处理 json 和 HttpMessageConverter<T>+SpringMVC 文件上传+自定义拦截器+异常处理)

    目录 一 数据格式化 1 基本介绍 2 基本数据类型和字符串自动转换 2 1总结 3 特殊数据类型和字符串间的转换 二 验证以及国际化 1 概述 1 1 概述 2 JSR 303 验证框架 1 1Hibernate Validator 扩展
  • layui.table.render如何改变表格的高度

    1 将checkbox 和 操作 设置固定高度 type checkbox fixed left style height 111px field id title ID sort true width 120 fixed right ti
  • 数据结构:排序(Sort)【详解】

    目录 排序 知识框架 排序概述 一 排序的相关定义 二 排序用到的结构与函数 常见的排序算法 一 冒泡排序 交换排序 1 算法 2 性能分析 二 简单选择排序 1 算法 2 性能分析 三 直接插入排序 1 算法 2 性能分析 四 折半插入排
  • 【xenclient】 使用小结 -- 片花

    片花1 磁盘共享 同一台电脑上装的系统多了 各个系统间难免重复内容很多 不免就有共享的需求 最简单的想法 单独做个vhd 只用来保存共享的数据 然后加到每一个虚拟机上 不就行了 当然 同一块vhd挂到多台虚拟机上 同时运行的话肯定有数据一致
  • 超详细的Shell学习教程第一篇

    1 1 Shell介绍 Shell 是一个用 C 语言编写的程序 它是用户使用 Linux 的桥梁 Shell 既是一种命令语言 又是一种程序设计语言 Shell 是指一种应用程序 这个应用程序提供了一个界面 用户通过这个界面访问操作系统内