linux shell脚本开发基础操作汇总

发布时间:2023年12月29日

经常用到,有时候就会忘,收藏起来备忘查看。

目录

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

# 方式1
get_state=`docker inspect --format '{{.State.Running}}' f10f6c02b276` ?# 此行反引号中的指令已执行
# 方式2
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

如上几种方式均可。

文章来源:https://blog.csdn.net/HYZX_9987/article/details/135219847
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。