Shell——变量与脚本运行的方式

news2024/11/15 11:14:55

文章目录

    • 变量
      • 定义变量的几种方式
        • 1)无引号
        • 2)单引号
        • 3)双引号
        • 4)反引号
        • export定义变量
      • 变量的提取、修改与删除
        • 1)变量的提取
        • 2)变量的修改
        • 3)变量的删除
      • 特殊变量
        • 1)位置参数
        • 2)${#}获取传入参数的个数
        • 3)\${$}获取当前进程ID
        • 4)${*}和\${@}接收所有参数
        • 5)${?}获取上一条命令执行结果
        • 6)$()获取命令
    • Shell脚本的两种执行方式
      • 1)添加执行权限运行
      • 2)无需执行权限,以解释器运行
        • 1.bash、source和 . 运行的区别
        • 2.什么是shebang

变量

其他编程语言中,例如C语言变量是具有多种类型的:整型、浮点型、字符型、逻辑类型等等

但是shell中的变量一切皆为字符串


定义变量的几种方式

shell为变量赋值时,=左右两边不能有空格,例如a=1表示赋值关系,如果写成a = 1则表示等量关系测试

1)无引号

  • 解析特殊符号
  • 无法解析特殊命令
  • 无法输入空格
age=18

2)单引号

  • 不解析一切特殊符号、命令
  • 可以输入空格
  • 所见即所得
name='echo zhang san'

3)双引号

  • 解析特殊符号
  • 无法解析特殊命令
  • 可以输入空格
phone_num="123 456"

4)反引号

  • 解析特殊符号
  • 解析特殊命令
  • 可以输入空格
a='echo hello world!'
b=`${a}`
echo ${b}

上述代码最终会输出 hello world!,过程分为2步:

  • 解析了特殊符号${a},把a中存储的字符串拿出来
  • 发现字符串是特殊命令,再对该字符串进行解析,最终把打印的结果赋给b

export定义变量

如果变量a是在父bash中创建的,当进入子bash时,将无法访问变量a的内容

用export创建变量可以解决上述问题

export创建变量方法如下:

export a=1

变量的提取、修改与删除

1)变量的提取

变量提取的格式如下:

name="变量名"
${name}  #推荐使用该方法
$name

上述方法中,为了减少bug并且增加代码的可读性,推荐使用${}的方法。

2)变量的修改

直接对变量重新赋值即可完成变量的修改

name="zhangsan"
name="lishi"

3)变量的删除

利用unset命令可以指删除指定变量,unset支持一次删除多个变量;如果有一系列特征相同的的变量,可以通过set | grep对变量进行查找,再根据查找的结果进行删除

name1="zhangsan"
name2="lisi"
name3="wangwu"
set | grep "^name"

其中:set表示查找所有变量,包括系统变量,|表示管道,gerp “^name”表示找到以name开头的变量

运行结果如下:

name1=zhangsan
name2=lisi
name3=wangwu

然后即可通过unset对变量进行删除

unset name1 name2 name3

特殊变量

特殊变量也遵循变量提取的基本语法,即${};为了方便书写,下列代码采取简写。

1)位置参数

在linux中,执行一条命令或脚本时,后面可以输入多个参数,这些参数统称位置参数;其中${0}表示执行的命令或脚本,${1}表示第一个位置参数,${2}表示第二个位置参数,依次往后。

编写一个脚本pos_param.sh

#!/bin/bash
echo "执行的脚本或命令是${0}"
echo "第一个位置参数是${1}"
echo "第二个位置参数是${2}"
echo "第三个位置参数是${3}"
echo "第四个位置参数是${4}"
echo "第五个位置参数是${5}"

运行脚本

bash pos_param.sh 1111 2222 3333 4444 5555

结果如下

执行的脚本或命令是pos_param.sh
第一个位置参数是1111
第二个位置参数是2222
第三个位置参数是3333
第四个位置参数是4444
第五个位置参数是5555

注:当位置参数的个数小于10时,{}可以省略,例:$0,$1,$2等;而10以上的位置参数则必须以${}的形式,例:${10}、${11}等


位置参数练习:创建新用户

cat > makeuser.sh << "EOF"
#!bin/bash
useradd ${1}
echo "${2}" | passwd --stdin ${1}
EOF
bash makeuser.sh lisi 1234

注:该方式修改用户密码的方式不适用于ubuntu

运行成果,会报如下提示:

Changing password for user lisi.
passwd: all authentication tokens updated successfully.

2)${#}获取传入参数的个数

echo 'echo "共传入$#个参数"' >> pos_param.sh 

bash pos_param.sh 1111 2222 3333 4444 5555

在1)的基础上,继续在脚本中添加如下命令,再次运行1)中命令执行脚本,会打印如下内容:

共传入5个参数

显然,$#会获取传入脚本中所有参数的个数。

3)${$}获取当前进程ID

继续添加如下命令:

echo 'echo "当前进程ID是$$"' >> pos_param.sh 

bash pos_param.sh 1111 2222 3333 4444 5555

打印内容下:

当前进程ID是14109

14109则是pos_param.sh的进程ID号

4)${*}和${@}接收所有参数

${*}和${@}均为接收所有参数,但二者又略有不同

执行下列代码:

cat >> pos_param.sh << "EOF"
echo "\$*接收的参数为:$*" 
echo "\$@接收的参数为:$@" 

echo "用for循环打印\$*接收的参数为:"
count=0;
for a in "$*"
do 
let count++ 
echo "第${count}个位置参数是:${a}"
done

echo "用for循环打印\$@接收的参数为:"
count=0;
for b in "$@"
do 
let count++ 
echo "第${count}个位置参数是:${b}"
done
EOF

bash pos_param.sh 111 222 333 

运行结果如下:

$*接收的参数为:111 222 333
$@接收的参数为:111 222 333
用for循环打印$*接收的参数为:
第1个位置参数是:111 222 333
用for循环打印$@接收的参数为:
第1个位置参数是:111
第2个位置参数是:222
第3个位置参数是:333

显然:二者都能够接收传入的参数

  • ${*}是将所有参数作为一个字符串进行整体存储,无法分开
  • ${@}是将所有参数进行分开存储

5)${?}获取上一条命令执行结果

在平时写代码中,例如C语言:我们常常利用返回值来判断某个函数、程序的运行结果是否正确,shell脚本中也是如此

shell中如果返回值为0则表示运行正确,非0则表示出错

例如:

[wjj@why1472587 ~]$ ls 777
ls: cannot access 777: No such file or directory
[wjj@why1472587 ~]$ echo $?
2
[wjj@why1472587 ~]$ ls
study
[wjj@why1472587 ~]$ echo $?
0

6)$()获取命令

$()中()中的内容不再视为变量,而是作为命令进行处理。

例如:通过whoami命令可以查看当前用户,可以有如下用法:

echo "当前用户:$(whoami)"

Shell脚本的两种执行方式

首先编写一个打印Hello World!的脚本

cat > test1.sh << 'EOF' 
#!/bin/bash
echo "Hello World!"
EOF

1)添加执行权限运行

chmod u+x test1.sh
./test1.sh

2)无需执行权限,以解释器运行

  • bash运行
  • source运行
  • .运行(需要文件开头有shebang)
#1
bash test1.sh
#2
source test1.sh
#3
. tesh1.sh #文件开头需要有shebang

1.bash、source和 . 运行的区别

  • 使用source.运行时,是在当前bash环境中运行的
  • 使用bash运行时,会额外创建一个子bash环境

以pstree -p命令可打开当前linux系统运行的进程,并且查看PID进程号

1)以source.运行:

在这里插入图片描述

2)以bash运行:

在这里插入图片描述

脚本运行结束后,会退出当前的子bash环境

2.什么是shebang

shebang是一个文本行,放在shell脚本的第一行,告诉计算机当前脚本采用什么解释器运行

#!/bin/bash

其中,#!表示这是一个shebang,/bin/bash为解释器路径。

上述shebang表示该脚本用bash解释器运行;如果是python脚本,则需要改为:

#!/bin/python

shell和python作为解释型语言可以通过加入shebang的方式,直接用解释器运行脚本;而其他编译型语言,例如:C/C++、Java等需要先编译才能运行,并且需要安装编译时所需要的环境。

如果脚本第一行中没有声明shebang,那么系统会默认以当前bash环境运行脚本。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jetpack组件(fragment)(1)

一.什么是Fragment? 碎片是活动的一部分&#xff0c;使得活动更加的模块化设计。我们可以认为碎片是一种子活动。 碎片拥有自己的布局&#xff0c;自己的行为及自己的生命周期回调。当活动在运行的时候&#xff0c;你可以在活动中添加或者移除碎片。你可以合并多个碎片在一个…

Android修炼之混淆

自嘲时刻 作为Java和Android开发者&#xff0c;大家应该都对混淆很熟悉了。网上也有各路大神提供的混淆模板&#xff0c;基本上直接拿来用就好。但我还是想捋一捋&#xff0c;因为工作中被混淆这家伙“玩弄”了好几次&#xff0c;必须把它记在小本本上。 介绍 基本概念 混淆…

Cesium中使用Sampler3D,3D纹理,实现体渲染

Cesium中使用Sampler3D&#xff0c;3D纹理&#xff0c;实现体渲染 Cesium目前&#xff08;20221231&#xff09;还不支持直接使用3D纹理&#xff0c;但是其实内部已经可以WebGL2&#xff0c;而且内置常量也有3DTexture。所以&#xff0c;可以通过仿Texture&#xff0c;来实现3…

如何彻底的理解需求,做出更好的软件

背景&#xff1a; 最近接到了一个需求&#xff0c;大概的需求就是我们有一些数据&#xff0c;默认分为了两类。如果变多的话&#xff0c;用户找起来非常的困难&#xff0c;针对这个现象我们提出了两点解决方案。1&#xff1a;添加搜索。2&#xff1a;添加分组。 第一波设计&…

Android的adb命令实战篇-1

2023年 —— 是充满希望的一年. 对于Android开发者而言&#xff0c;ADB命令或多或少都使用过&#xff0c;今天我们就一起来整体回顾一下吧。 ADB的全称&#xff1a;Android Debug Bridge 1. ADB(Android Debug Bridge) 在实际工作中&#xff0c;周围同事会抱怨记不住常用的a…

过寒假

小时候&#xff0c;每到一放假就被父亲送回奶奶家。除了寒假作业&#xff0c;我还会带一堆书回去看。我小时候特别喜欢到邮电局大厅去订阅报刊杂志&#xff0c;就连学校也会报名订阅报刊。我小学时看完梁羽生的《七剑下天山》就是翻日报上每天的小说连载看完的。那时候过年时家…

Unity AR小游戏(玩具小车)踩坑记

最近对AR产生了兴趣。先科普一下什么是AR吧。AR是Augmented Reality&#xff08;增强现实&#xff09;的简称&#xff0c;是基于摄像头对现实世界的实时图像采集、分析和理解&#xff0c;然后在此基础上融入虚拟物体&#xff08;信息&#xff09;&#xff0c;以达到增强体验的目…

Three.js学习(一)初识three.js

文章目录1.基本配置2.基本概念3.Api4.实现一个旋转动画1.基本配置 &#xff08;1&#xff09;安装 ​ npm install three &#xff08;2&#xff09;引入 import * as THREE from three2.基本概念 Three.js是基于原生WebGL封装运行的三维引擎。 &#xff08;1&#xff09;一…

【Linux】实验四 进程信号通信

文章目录一、实验目的二、 实验内容三、 实验原理1、信号3.1.1 信号的基本概念3.1.2、信号的发送2、所涉及的系统函数调用3.2.1 fork()3.2.2 kill( )This is my question.3.2.3 signal( )代码例子3.2.4 getpid()3.2.5 wait()四、 实验内容五、程序代码运行结果六、实验总结及心…

来玩,前端性能优化(+面试必问:宏任务和微任务)

前端性能优化相关的“技能点”笔者之前也写过几篇&#xff0c;但是大多都是小打小闹。我重新整理了曾经使用过的性能优化手段。本文介绍三种方案&#xff1a;页面资源预加载、服务请求优化和非首屏视图延迟加载。 页面资源预加载 页面是不可能真正预加载的&#xff0c;但是有…

Linux | PCIe Hotplug | 概念及工作原理的不完全总结

本文对 PCIe 热插拔的概念及工作原理进行不完全总结。 更新&#xff1a; 2022 / 12 / 31 Linux | PCIe Hotplug | 概念及工作原理的不完全总结热插拔组成部件实现代码通知式热插拔线程中断功耗管理意外移除错误处理整合移除BAR参考链接参考这里 1’ 2’ 3‘ 4’ 5 1992年初始…

postgresql数据库安装,备份还原

一.postgresql数据库安装 1.下载软件包 地址&#xff1a;PostgreSQL: File Browser 2.解压安装 [rootpostgresql u01]# tar -zxf postgresql-14.2.tar.gz安装环境 yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel op…

(深度学习快速入门)第一章:深度学习概述、应用、学习路线和框架选择

文章目录一&#xff1a;基本概念&#xff08;1&#xff09;神经网络&#xff08;2&#xff09;感知器&#xff08;3&#xff09;深度学习&#xff08;4&#xff09;前向运算和反向传播二&#xff1a;DeepLearning学习路线三&#xff1a;深度学习应用&#xff08;1&#xff09;生…

基于Stream的Redis消息队列

目录一、消息队列二、基于List结构模拟消息队列基于List的消息队列的优点&#xff1a;基于List的消息队列的缺点&#xff1a;三、基于PubSub的消息队列基于PubSub的消息队列的优点&#xff1a;基于PubSub的消息队列的缺点&#xff1a;四、基于Stream的消息队列1、XADD语法2、XR…

C++ Primer笔记——allocator、unique_ptr和release、智能指针与动态数组、阻止拷贝

目录 一.P418 unique_ptr和release 二.P426 智能指针与动态数组 &#xff08;一&#xff09;.unique_ptr &#xff08;二&#xff09;.shared_ptr 三.P428 allocator &#xff08;一&#xff09;.申请空间 &#xff08;二&#xff09;.初始化构造 &#xff08;三&#…

活动星投票少儿模特大赛网络评选制作一次图文分组投票怎么制作

关于微信投票&#xff0c;我们现在用的最多的就是小程序投票&#xff0c;今天的网络投票&#xff0c;在这里会教大家如何用“活动星投票”小程序来进行投票。我们现在要以“国际车展少儿模特大赛”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“…

aws cloudformation 使用模板配置 ecs 蓝绿部署

参考资料 Perform ECS blue/green deployments through CodeDeploy using AWS CloudFormationAWS::CodeDeployBlueGreen 在之前的文章中&#xff0c;使用codepipeline中通过控制台的方式创建了ecs蓝绿部署的demo。实际上可以单独通过codedeploy完成ecs服务的蓝绿部署 参考官…

【ARMv8 SIMD和浮点指令编程】Libyuv I420 转 ARGB 流程分析

Libyuv 可以说是做图形图像相关从业者绕不开的一个常用库&#xff0c;它使用了单指令多数据流提升性能。以 ARM 处理为主线&#xff0c;通过 I420 转 ARGB 流程来分析它是如何流转的。 Libyuv 是一个开源项目&#xff0c;包括 YUV 的缩放和转换功能。 使用邻近、双线性或 box…

QThread、moveToThread用法详述

1.吐槽 QThread类提供了一种平台无关的方法对线程进行管理。但对于QThread类的熟练使用&#xff0c;即使是从事Qt开发多年的程序猿们&#xff0c;往往也会踩雷、入坑。总之&#xff1a;QThread类不好用、如果对该类理解不透&#xff0c;很容易导致程序崩溃。本人强烈建议&#…

(函数介绍)puts()函数

功能介绍 1. puts()函数用来向标准输出设备屏幕输出字符串并换行。 2. 函数的参数就是一个起始的地址&#xff0c;然后就从这个地址开始一直输出字符串&#xff0c;直到碰到\0就停止&#xff0c;然后这个\0是不进行输出的&#xff0c;是不能够算在里面的。与此同时&#xff…