shell脚本相关基础操作汇总

2023-09-22 06:15:00

汇总起来,备忘查看。

目录

1,脚本的参数传递与接收

2,判断是否有传入的参数、获得参数个数

3,获取传入的全部参数、遍历全部参数

4,获取当前脚本对应的进程pid

5,判断目录、文件等是否存在

6,判断变量是否为空

7,判断上一个命令是否执行正常

8,获取命令的结果

9,设置/删除全局环境变量

设置环境变量

将命令执行结果设置为环境变量

设置全局环境变量

修改

删除

10,获取字符串长度

11,内置可直接使用的环境变量

12,脚本如何执行


1,脚本的参数传递与接收

如下,执行x.sh脚本,传入两个参数a、b:

bash  x.sh  a  b

脚本中接收标识:

$0:获取当前脚本文件名称,即x.sh
$1:第1个参数,即上述例子中的a
$2:第2个参数,即上述例子中的b
...
...

使用:

#!/bin/bash

a="hello"
# 双引号下使用
echo "$a"
# 单引号下使用
echo ''$a''

2,判断是否有传入的参数、获得参数个数

$#是特殊变量,表示参数个数:

echo "params length is $#"

if [ $# -eq 0 ]; then
    # 没有参数
else
    # 有参数
fi


3,获取传入的全部参数、遍历全部参数

如下脚本:

#!/bin/bash

echo "params length is $#"

# 打印所有参数
echo "all params: $*"

# 遍历所有参数
for x in $*
do
    echo "get $x"
done

脚本名称b,带三个参数执行:

# sh b 1 2 3
params length is 3
all params: 1 2 3
get 1
get 2
get 3

4,获取当前脚本对应的进程pid

用$$获取,编写如下脚本:

#!/bin/bash

echo "this is a, pid is $$"

验证:

# source a
this is a, pid is 11980

5,判断目录、文件等是否存在/是否是目录、文件

-d:检查目录是否存在、是否是目录

-f:检查文件是否存在、是否是文件

# 目录是否存在
if [ -d "/root/shell_test" ]; then
    # 存在
    echo "dir exists"
else
    echo "dir does not exists"
fi

# 文件是否存在
if [ -f "/root/shell_test/a" ]; then
    # 存在
    echo "file exists"
fi


6,判断变量/字符串是否为空

if [ -z "$a" ]; then
    echo "is null"
else
    echo "is not null"
fi

或使用test探测:

id=$(docker ps|grep mysql |awk '{print $1}')
if test  !$id ; then    # id为空
        echo "mysql doesn't exists!"
fi

7,判断上一个命令是否执行正常

$? 可判断上一个命令是否执行正常,执行成功时会正常退出0状态码,通过结果是否为0即可判断是否正常。


8,获取命令的结果

如下脚本检查指定docker容器是否正在运行:

#!/bin/bash

get_state=`docker inspect --format '{{.State.Running}}' f10f6c02b276`  # 此行反引号中的指令已执行
get_state2=$(docker inspect --format '{{.State.Running}}' f10f6c02b276) 

res=$get_state      # 结果保存在res中

echo "result is $res"    # 使用res
echo "result is $get_state"   # 直接使用get_state
echo "result is $get_state2"   # 直接使用get_state2

使用反引号或 $() 都可以。

那么如果命令对应的那一行仅是字符串保存一下,在需要的时候执行,而不是立即执行,怎么办?

#!/bin/bash

# 定义变量,保存命令
get_state="docker inspect --format '{{.State.Running}}' f10f6c02b276"

# 需要执行的时候
res=`$get_state`     # 执行指令并将结果保存在res中,第一次执行

echo "result is $res"            # 使用res
echo "result is `$get_state` "   # 字符串中执行,反引号的形式,第二次执行
echo "result is $($get_state)"   # 字符串中执行,使用$()的形式,第三次执行

echo "-----------------"
mk="mkdir ./yyy"
echo "over $($mk)   # 注意括号内给变量需带上$,否则会认为mk是一个可执行程序而报错:mk: command not found

9,设置/删除全局环境变量

如果不是全局环境变量,脚本结束后,环境变量将被清除。

设置环境变量

export KEY=VAL    # 即时生效

将命令执行结果设置为环境变量

export KEY=$(command)

设置全局环境变量

echo "export KEY=VAL" >> /etc/profile

文件外保存:

source  /etc/profile

修改

export KEY=NEW_VAL

删除

unset KEY

10,获取字符串长度

a="123"
echo "${#a}"

${#a} 表示获取字符串a的长度

11,内置可直接使用的环境变量

echo $BASH_VERSION     # 当前使用的Bash版本号
echo $BASH_ENV         # Bash的启动脚本文件路径
echo $HOSTNAME         # 主机名
echo $MAIL             # 邮箱文件路径
echo $OLDPWD           # 上一个工作目录
echo $SHLVL            # Shell嵌套层数
echo $TERM             # 终端类型
echo $UID              # 当前用户的UID

12,脚本如何执行

shell程序a,执行:

sh a
bash a
source a
chmod +x a && ./a

如上几种方式均可。

更多推荐

Bash脚本学习:AWK, SED

1.AWKAWK是一种编程语言,设计用于处理文件或数据流中基于文本的数据,或者使用shell管道。可以将awk与shell脚本结合使用或直接在shell提示符下使用。以上展示使用AWK分别打印第一个位置变量和第二个位置变量。建立一个文档csvtest.csv。文档内容为:one,two,threeawk-F,'{pri

C语言每日一题(9):跳水比赛猜名次

文章主题:跳水比赛猜名次🔥所属专栏:C语言每日一题📗作者简介:每天不定时更新C语言的小白一枚,记录分享自己每天的所思所想😄🎶个人主页:[₽]的个人主页🏄🌊目录前言编程起因项目介绍设计思路1.整体逻辑2.具体逻辑代码展示效果展现结语前言编程起因最近牛客网刷到的一个编程题,综合运用了循环和条件判断语句,觉得该题

数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC...

全文链接:http://tecdat.cn/?p=27384在本文中,数据包含有关葡萄牙“VinhoVerde”葡萄酒的信息(点击文末“阅读原文”获取完整代码数据)。介绍该数据集(查看文末了解数据获取方式)有1599个观测值和12个变量,分别是固定酸度、挥发性酸度、柠檬酸、残糖、氯化物、游离二氧化硫、总二氧化硫、密度、

跨端开发方案之桌面应用小程序

小程序容器技术的未来是充满希望的,它为我们开辟了一个全新的数字世界,连接了桌面操作系统和移动生态系统之间的界限。正如技术不断演进,我们可以期待着更多的创新和发展,为用户带来更加便捷和多样化的应用体验。这一技术的推广和应用将继续推动数字科技的发展,塑造着未来的数字生活。QtGroup在提及2023年有桌面端应用程序开发热

【微服务实战之Docker容器】第四章-【微服务实战之Docker容器】第三章-镜像仓库

系列文章目录【微服务实战之Docker容器】第一章-下载及安装文章目录系列文章目录坑:容器卷记得加入以下命令配置是个啥?能干啥?基本的命令读写规则映射添加说明卷的继承和共享坑:容器卷记得加入以下命令配置--privileged=trueDocker挂载主机目录访问如果出现cannotopendirectory.:Per

第24章_瑞萨MCU零基础入门系列教程之内部温度传感器-TSN

本教程基于韦东山百问网出的DShanMCU-RA6M5开发板进行编写,需要的同学可以在这里获取:https://item.taobao.com/item.htm?id=728461040949配套资料获取:https://renesas-docs.100ask.net瑞萨MCU零基础入门系列教程汇总:https://b

通过 Helm Chart 部署 Easysearch

Easysearch可以通过Helm快速部署了,快来看看吧!Easysearch的Chart仓库地址在这里https://helm.infinilabs.com。使用Helm部署Easysearch有两个前提条件:cert-managerlocal-path我们先按照Chart仓库的说明来快速部署一下。~helmrep

LLM(二)| LIMA:在1k高质量数据上微调LLaMA1-65B,性能超越ChatGPT

本文将介绍在Lit-GPT上使用LoRA微调LLaMA模型,并介绍如何自定义数据集进行微调其他开源LLM监督指令微调(SupervisedInstructionFinetuning)什么是监督指令微调?为什么关注它?目前大部分LLM都是decoder-only,通常是续写任务,有时候未必符合用户的需求,SFT是通过构造

锐捷交换机vlan隔离(wifi段仅能访问外网,和内网隔离)

因为公司的wifi段,未做隔离,无意间上了网,发现能访问内网网段,这里内网是10、20段,管理网段是100段,于是做了和内网的vlan隔离。拓朴如下,所有vlan的网关都起在核心上,核心上起了DHCP,分配wifi段为80段。所有交换机通过trunk连接。要求把80段和内网的其它网段隔离开,不让它访问:在锐捷核心上配置

深度学习归一化原理及代码实现(BatchNorm2d,LayerNorm,InstanceNorm,GroupNorm)

文章目录概述形式原理理解源代码实现1.BatchNorm2d2.LayerNorm3.InstanceNorm4.GroupNorm概述本文记录总结pytorch中四种归一化方式的原理以及实现方式。方便后续理解和使用。本文原理理解参考自https://zhuanlan.zhihu.com/p/395855181形式四种

【无标题】

文章目录ListView是怎么渲染的?ListView怎么做到控制性能?_ViewportElementRenderViewport先从这一块朴素的代码开启我们的旅程:ListView.builder(itemBuilder:((context,index){returnListTile(title:Text("thi

热文推荐