当前位置: 首页 > news >正文

【运维进阶】Shell 变量

Shell 变量

Shell 变量基础知识

什么是 Shell 变量

什么是 Shell 变量

在 Shell 脚本中,变量就像是一个 “容器”,用来存储数据(比如数字、字符串、路径等),方便在脚本中重复使用、修改或传递。它的作用类似于我们日常生活中的 “标签”—— 给某样东西贴上标签,之后通过标签就能快速找到或操作这个东西。

Shell 变量的特点
  1. 无需声明类型
    和其他编程语言(如 Python、Java)不同,Shell 变量不需要提前声明 “是数字还是字符串”,直接赋值即可。例如:

    name="Alice"  # 字符串变量
    age=25        # 数字变量
    path="/home"  # 路径变量
    
  2. 命名规则

    • 只能包含字母、数字和下划线(_
    • 不能以数字开头
    • 区分大小写(nameName 是两个不同的变量)
    • 建议使用大写字母命名环境变量(如 PATH),小写字母命名自定义变量(如 user
  3. 赋值与使用

    • 赋值时,等号(=)两边不能有空格(例如 a=10 正确,a = 10 错误)。

    • 使用变量时,需要在变量名前加美元符号($),例如:

      name="Bob"
      echo $name  # 输出:Bob
      echo "Hello, $name"  # 输出:Hello, Bob
      
Shell 变量的分类
  1. 用户自定义变量(普通变量)
    由用户在脚本中自行定义和使用,仅在当前 Shell 会话或脚本中有效。例如:

    # 定义变量
    score=90
    subject="Math"# 使用变量
    echo "科目:$subject,分数:$score"  # 输出:科目:Math,分数:90
    
  2. 环境变量
    全局生效的变量,用于存储系统或 Shell 的配置信息(如路径、用户名等),可以被所有子进程访问。
    常见的环境变量:

    • PATH:存储可执行程序的路径(输入命令时,Shell 会从这些路径中查找程序)。
    • HOME:当前用户的主目录(如 /home/laoma)。
    • USER:当前登录的用户名。
      可以用 echo $变量名 查看,例如 echo $HOME
  3. 位置参数变量
    用于接收脚本运行时传入的参数,格式为 $nn 是数字,$1 表示第一个参数,$2 表示第二个参数,以此类推)。
    例如,运行脚本 bash test.sh apple banana 时:

    # test.sh 内容
    echo "第一个参数:$1"  # 输出:第一个参数:apple
    echo "第二个参数:$2"  # 输出:第二个参数:banana
    
  4. 特殊变量
    Shell 内置的具有特殊含义的变量,例如:

    • $0:当前脚本的文件名。
    • $?:上一条命令的执行结果(0 表示成功,非 0 表示失败)。
    • $*$@:所有传入的参数的集合。

示例:

假设你写了一个脚本,需要多次用到 “你的名字” 和 “年龄”,就可以用变量存储:

#!/bin/bash# 定义变量
myname="小明"
myage=18# 多次使用变量
echo "我叫$myname,今年$myage岁。"
echo "明年,$myname$((myage + 1))岁了。"

运行后输出:

我叫小明,今年18岁。
明年,小明就19岁了。

这里的 mynamemyage 就是变量,它们像 “标签” 一样,让你不用重复写 “小明” 和 “18”,还能方便地修改(比如把 myage=18 改成 myage=19,整个脚本的相关内容都会自动更新)。

简单来说,Shell 变量就是脚本中的 “数据标签”,让代码更灵活、更易维护。

环境变量

环境变量就像是 Shell 世界里的 “全局通行证”,而export命令就是给它们盖上 “通行章” 的工具。这些变量负责给 Shell 搭好 “运行舞台”,小到确定你的用户名、命令在哪儿找,大到终端显示样式、登录目录,全靠它们来安排明白。

更方便的是,这些 “通行证” 是全局有效的,不管是编辑器、脚本还是各种应用程序,都能认得出它们,用得上它们的信息。

不过要注意,如果你只是在命令行里临时设置了环境变量,那等你退出命令行,这些变量就会 “消失不见”。想让它们 “常住” 下来也很简单:把它们写进用户家目录的.bash_profile.bashrc(比如远程 SSH 连接时就常用这个)里,或者系统全局的/etc/bashrc/etc/profile文件中。这样一来,每次用户登录,这些变量就会自动 “上岗”,随时待命。

按照 Shell 世界的 “规矩”,所有环境变量都得用大写字母命名,而且在让它们为用户程序 “服务” 之前,必须先用export命令给它们 “登记备案”。像HOME(家目录)、PATH(命令路径)、USER(用户名)这些 “老员工”,早在用户登录前,就被/bin/login程序安排到位了。通常情况下,环境变量要么住在用户家目录的.bash_profile里,要么住在全局配置文件/etc/profile中。

再给你介绍几个常见的 “环境变量员工”:

  • EDITOR:默认的编辑器,就像你的 “御用文书”。
  • HISTFILE:历史命令存放在哪儿,相当于命令的 “日记本”。
  • HISTSIZE:能记住多少条历史命令,是 “日记本” 的页数限制。
  • PS1:命令行提示符的样子,比如[user@host ~]$就是它设计的。
  • LANG:Shell 环境用什么语言,决定了提示信息是中文还是英文。
  • PATH:命令的 “藏身之处”,Shell 找命令全靠它指路。
  • HOME:当前用户的家目录,相当于你的 “专属房间”。
  • USER:当前登录的用户名,就是你的 “ID 卡”。
  • PWD:当前所在的路径,告诉你 “现在在哪儿”。
  • IFS:字符串的 “分割器”,决定了怎么把一串字符拆分开。

想看看这些变量的具体信息?有三个命令可以帮你:

  • set命令:相当于 “变量大百科”,不管是全局变量还是局部变量,都能一股脑列出来。
  • env命令:专门展示 “全局变量”,包括 Shell 环境的相关配置,相当于 “全局变量名录”。
  • declare命令:功能更全,不仅能显示所有变量,还能展示函数、整数和已经导出的变量,堪称 “变量全能查询器”。另外,set -o命令能显示 bash Shell 的所有参数配置,就像查看 Shell 的 “系统设置” 一样。
设置环境变量
1. 设置环境变量

如果想要设置环境变量,就要在给变量赋值之后或在设置变量时使用export命令,具体设置见下文的示例。其实,除了 export 命令,带-x选项的declare内置命令也可以完成同样的功能(注意:此处不要在变量名前面加$)。

export 命令和 declare 命令的格式如下:

  • export 变量名=value
  • 变量名=value ; export 变量名
  • declare -x 变量名=value

示例:

export NAME=lth
declare -x NAME=lth
NAME=lth;export NAME

下面来看看让环境变量永久生效的常用设置文件。

  • 用户的环境变量配置文件~/.bash_profile~/.bashrc推荐在(~/.bashrc)文件中设置。

  • 全局环境变量的配置文件/etc/profile/etc/bashrc/etc/profile.d/。**推荐在 /etc/bashrc 文件中设置。**若要在登录后初始化或显示加载内容,则把脚本文件放在/etc/profile.d/下即可(无须加执行权限)。

2. 设置登录后提示信息

方法1:编辑/etc/motd文件(登录后显示)

[root@controller ~ 22:43:36]# vim /etc/motd
welcome to lth linux Shell training.

方法2:在/etc/profile.d/创建脚本

[lth@controller ~ 22:46:01]$ sudo vim /etc/profile.d/lth.sh
echo Welcome to lth linux Shell training.

补充

  • 登录前提示符由文件 /etc/issue 提供。
  • 登录后时间提示符由ssh服务提供:在 /etc/ssh/sshd_config 文件中配置PrintLastLog yes,默认启用。
显示与取消环境变量
  1. 通过echoprintf命令打印环境变量。
  2. envset显示默认的环境变量。
  3. unset消除本地变量和环境变量。
环境变量的知识小结
  1. 变量名通常要大写。
  2. 变量可以在自身的 Shell 及子 Shell 中使用。
  3. 常用 export 来定义环境变量。
  4. 执行 env 默认可以显示所有的环境变量名称及对应的值。
  5. 输出时用 $变量名,取消时用 unset变量名
  6. 书写 crond 定时任务时要注意,脚本要用到的环境变量最好先在所执行的 Shell 脚本中重新定义。
  7. 如果希望环境变量永久生效,则可以将其放在用户环境变量文件或全局环境变量文件里。

普通变量

普通变量就像是 Shell 脚本里的 “临时小纸条”,专门用来存一些临时要用的数据 —— 可能是一串文字、一个数字,或者一段路径。它们只在 “自己的小圈子” 里管用,出了这个圈子就没人认识了。

比如说,你在脚本里写了 name="小明",这个 name 就是个普通变量。它就像你随手记在纸条上的名字,只有当前这个脚本在运行时能用到它。如果脚本跑完了,或者你新开了一个命令行窗口,这张 “小纸条” 就自动消失了,再想找 name 里的内容,就找不到啦。

普通变量的用法很随意:

  • 起名的时候,只要别用数字开头,别掺空格和特殊符号就行(比如 age=18fruit="apple" 都没问题)。
  • 用的时候在前面加个 $,比如 echo $name,就能把 “小纸条” 上的内容读出来。
  • 不用特意告诉 Shell 它是数字还是文字,直接赋值就行,Shell 自己会搞定。

但它有个 “小脾气”:默认只在当前的 Shell 或脚本里生效,不会传给子进程。比如你在命令行里定义了 num=5,然后运行一个脚本,这个脚本里可看不到 num 的值 —— 就像你在客厅写的纸条,卧室里拿不到一样。

普通变量定义

为普通变量的定义赋值,一般有以下3 种写法:

  • 变量名=value,赋值时不加引号。
  • 变量名='value',赋值时加单引号。
  • 变量名="value",赋值时加双引号。
变量名及变量值要求
  • 变量名:一般是由字母、 数字 、下划线组成的,只可以以字母或下划线开头,例如:laomalaoma_123laoma_training
  • 变量值:可以用单引号或双引号引起来,也可不加引号,但是这三者的含义是不同的。
普通变量的定义及输出示例

采用不同的方式对普通变量进行定义,并打印输出。

示例1:

# 给变量a赋值,没加引号,像直接把地址写在标签上
[lth@controller ~ 22:51:47]$ a=192.168.1.2 
# 给变量b赋值,用单引号括起来,像把地址放进密封的信封
[lth@controller ~ 22:51:51]$ b='192.168.1.2'  
# 给变量c赋值,用双引号括起来,像把地址放进透明的信封
[lth@controller ~ 22:52:24]$ c="192.168.1.2"  
# 打印a的值,$a就像撕开标签看内容
[lth@controller ~ 22:52:29]$ echo "a=$a"  
a=192.168.1.2
# 打印b的值,单引号里的内容原封不动,信封拆开会看到完整地址
[lth@controller ~ 22:52:36$ echo "b=$b"  
b=192.168.1.2
# 打印c的值,${c}是更规范的写法,透明信封里的内容看得清清楚楚
[lth@controller ~ 22:52:41]$ echo "c=${c}"  
c=192.168.1.2

这段代码就像在玩 “给地址贴标签” 的游戏:

  • 变量a没穿 “引号外衣”,直接把地址写在标签上,简单直接。
  • 变量b穿了 “单引号外衣”,就像把地址封在不透明信封里,不管里面有啥特殊符号,都会原封不动保存。
  • 变量c穿了 “双引号外衣”,类似透明信封,既能保护内容,又能让里面的变量(如果有的话)被识别。

echo命令就像拆信封的动作,不管用哪种方式保存,只要内容一样,拆出来的结果就相同 —— 这里三个变量存的都是同一个 IP 地址,所以打印出来都一样~
另外,${c}$c的 “加强版写法”,当变量名和其他字符挨得近时,用它能避免混淆,这里单独用效果和$c一样哦。

变量定义的基本技巧总结

  1. 不加引号定义变量:适用于内容是简单连续的数字、字符串、路径名等情况。此时变量值中若包含其他变量,会先解析这些变量的值,再整合为最终的变量内容。例如a=192.168.1.2-$a中,$a会被解析成已有值,最终形成新的a值。
  2. 单引号定义变量:单引号会 “原样保留” 其中的所有内容,无论里面有变量还是命令(命令需用反引号包裹),都不会被解析,只会直接输出原始字符。这种方式适合定义纯字符串,尤其不希望其中的变量、命令被处理的场景。比如b='192.168.1.2-$a',输出时就是192.168.1.2-$a
  3. 双引号定义变量:双引号中的内容会进行解析,若包含变量或命令(命令需用反引号包裹),会先处理这些变量和命令,再输出最终结果。这种方式适合定义包含变量、命令,且需要它们被解析后再呈现的字符串。例如c="192.168.1.2-$a",其中$a会被解析成具体值,最终c的内容是解析后的组合结果。

变量定义技巧总结

一、变量名规则与命名规范

  1. 命名限制:只能包含字母、数字、下划线,且必须以字母或下划线开头
  2. 命名规范(见名知意):
    • 单词首字母大写:LaomaAge
    • 下划线连接:laoma_age
    • 驼峰式:laomaAge(首个单词小写,后续单词首字母大写)
    • 全大写(常用于环境变量):LAOMAAGE

二、变量赋值与内容处理

  1. 赋值符号:使用=(等号两边无空格)
  2. 引号使用场景:
    • 双引号:最常用,可解析变量和命令,适合大多数场景
    • 无引号:适用于简单连续的字符串、数字、路径
    • 单引号:原样输出内容,不解析变量和命令
  3. 命令结果赋值:
    • 用反引号:var=命令 ``
    • $()var=$(命令)(推荐,可读性更好)

三、变量使用与输出

  1. 引用方式:
    • 基础形式:$变量名(如$a
    • 变量后接其他字符时:${变量名}(如${a}b
  2. 特殊场景:
    • unsetexport(())等操作中直接用变量名(不加$
  3. 输出规范:
    • 字符串变量建议加双引号输出
    • 需原样展示时用单引号
    • 普通场景可直接使用或加双引号

四、学习建议

参考系统自带脚本(如/etc/init.d/functions)的变量定义风格,逐步形成自己的规范和习惯。

Shell 变量进阶知识

Shell 中特殊变量

Shell 位置参数变量

Shell 中的位置参数变量,就像是给脚本或函数 “传递包裹” 的标签,专门用来接收运行时传入的参数。它们按顺序编号,就像快递单号一样,第一个参数对应 “1 号标签”,第二个对应 “2 号标签”,以此类推,方便脚本按顺序读取这些外部输入的信息。

常见的位置参数变量

变量含义
$nn 是数字,$1 表示第一个参数,$2 表示第二个参数……$9 之后需要用 ${10} 表示(比如 ${10} 是第十个参数)
$*代表所有参数的集合,把所有参数看成一个整体(用双引号括起来时,会被当作单个字符串)
$@也代表所有参数的集合,但把每个参数看成独立的个体(用双引号括起来时,会保留每个参数的独立性)
$#表示参数的总个数
$0表示当前脚本的文件名(不是参数,但常和位置参数一起使用)

示例1:showargs.sh 内容如下

#!/bin/bash
echo $0
echo $1
echo $2
echo $10
echo ${10}
echo $#
echo $*
echo $@
echo "$@"
[lth@controller ~ 23:06:02]$ bash showargs.sh {a..z}
showargs.sh
a
b
a0
j
26
a b c d e f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z

示例2:ssh_ctl 内容如下

#!/bin/bash
systemctl $1 sshd

执行效果如下:

[lth@controller ~ 23:06:11]$ sudo ssh_ctl stop
[lth@controller ~ 23:06:16]$ sudo ssh_ctl status
[lth@controller ~ 23:06:25]$ sudo ssh_ctl start
Shell 进程中的特殊状态变量
# 1. $? - 获取上一条命令的执行结果(0表示成功,非0表示失败)
echo "=== 测试 \$? 变量 ==="
ls /non_existent_file  # 执行一个肯定失败的命令
echo "上一条命令的退出状态码: $?"  # 会输出非0值(通常是2)echo "Hello World"  # 执行一个肯定成功的命令
echo "上一条命令的退出状态码: $?"  # 会输出0# 2. $$ - 获取当前脚本的进程ID(PID)
echo -e "\n=== 测试 \$\$ 变量 ==="
echo "当前脚本的进程ID是: $$"  # 输出当前脚本运行时的PID
# 可以用ps命令验证:ps -p $$# 3. $! - 获取上一个后台运行命令的PID
echo -e "\n=== 测试 \$! 变量 ==="
sleep 30 &  # 让sleep命令在后台运行30秒
echo "后台运行的sleep命令的PID是: $!"  # 输出刚才后台命令的PID
# 可以用ps命令查看这个后台进程:ps -p $!# 4. $_ - 获取上一条命令的最后一个参数
echo -e "\n=== 测试 \$_ 变量 ==="
echo "apple" "banana" "cherry"  # 这条命令的最后一个参数是cherry
echo "上一条命令的最后一个参数: $_"  # 会输出cherry# 5. $0 - 获取当前脚本的文件名(包含路径时会显示路径)
echo -e "\n=== 测试 \$0 变量 ==="
echo "当前脚本的文件名是: $0"  # 输出脚本名,如./special_vars_demo.sh# 6. $# - 获取脚本接收的参数总数(位置参数相关,但常与状态判断结合)
echo -e "\n=== 测试 \$# 变量 ==="
echo "当前脚本接收的参数个数: $#"
if [ $# -eq 0 ]; thenecho "提示:运行脚本时可以传入一些参数,比如 ./special_vars_demo.sh a b c"
fi

Shell 内置变量命令

echo

echo命令参数选项:

  • -n,不换行输出内容。
  • -e,解析转义字符(见下面的字符)

转义字符:

  • \n,换行。
  • \t,制表符(tab)。
  • \b,退格。

示例:

[lth@controller ~ 23:11:54]$ echo -n "lth";echo laowang
lth laowang
[lth@controller ~ 23:11:59]$ echo -e "lth\nlaowang"
lth
laowang
[lth@controller ~ 23:12:36]$ echo -e "lth\tlaowang"
lth	laowang[lth@controller ~ 23:12:45]$ echo -e "1\b23"
23[lth@controller ~ 23:12:50]$ echo -e "123\b"
123# 后面有东西才会覆盖
[lth@controller ~ 23:12:55]$ echo -ne "123\b";echo haha
12haha
read

从标准输入读取字符串等信息, 传给 Shell 程序内部定义的变量。

[lth@controller ~ 23:13:10]$ cat read.sh 
#!/bin/sh
read -p "输入你想要说的话:" str
echo "你想要说的话是:$str"[lth@controller ~ 23:13:23]$ bash read.sh 
输入你想要说的话:`hello world`
你想要说的话是:hello world# 不显示输入的内容
[lth@controller ~ 23:13:31]$ read -s -p "请设置用户密码: " password 
请设置用户密码: '123'
[lth@controller ~ 23:13:44]$ echo $password
123

Shell 变量子串知识

Shell 变量子串介绍

Shell 变量子串(也叫 “变量字符串截取”)就像给字符串 “剪裁缝补” 的工具,能从变量存储的字符串中提取部分内容、替换字符或判断字符串特征,无需调用外部命令,效率很高。以下是常用的子串操作及示例:

一、提取子串(从指定位置截取)

假设变量 str="hello world, welcome to shell",我们可以按 “位置” 或 “模式” 截取其中的部分内容:

  1. ${变量:起始位置:长度}

从 “起始位置”(0 开始计数)截取指定 “长度” 的字符,省略 “长度” 则截取到末尾。

str="hello world"
echo ${str:0:5}   # 从位置0开始,取5个字符 → hello
echo ${str:6}     # 从位置6开始,取到末尾 → world
  1. ${变量: -起始位置:长度}(注意空格)

从字符串末尾开始截取(“起始位置” 为负数,前面必须加空格)。

str="hello world"
echo ${str: -5}   # 从末尾取5个字符 → world
echo ${str: -10:5} # 从末尾第10位开始,取5个字符 → hello

常见 Shell 变量子串说明:

  • ${parameter},返回变量 parameter 的内容。
  • ${#parameter},返回变内容的长度(按字符),也适用于特殊变量。
  • ${parameter:offset},在变量parameter中,从位置offset之后开始提取子串到结尾。
  • ${parameter:offset:length},在变量parameter中,从位置offset之后开始提取长度为length
    的子串。
  • ${parameter#word},从变量parameter开头开始删除最短匹配的word子串。
  • ${parameter##word},从变量parameter开头开始删除最长匹配的word子串。
  • ${parameter%word},从变量parameter结尾开始删除最短匹配的word子串。
  • ${parameter%%word},从变量parameter结尾开始删除最长匹配的word子串。
  • ${parameter/pattem/string},使用string代替第一个匹配的pattern。
  • ${parameter//pattem/string},使用string代替所有匹配的pattern。
Shell 变量子串的实践

示例1: ${parameter}

[lth@controller ~ 23:19:11]$ str="abc123abc123"[lth@controller ~ 23:19:16]$ echo ${str}
abc123abc123

示例2:${#parameter}

[lth@controller ~ 23:19:20]$ str="abc123abc123"# 此方法获取字符串长度速度最快
[lth@controller ~ 23:19:26]$ echo ${#str}
12# 其他方式计算字符串长度
[lth@controller ~ 23:19:31]$ echo ${str} | wc -L
12
[lth@controller ~ 23:19:33]$ expr length "${str}"
12
[lth@controller ~ 23:19:37]$ echo "$str" | awk '{ print length($0)}'
12

示例3:${parameter:offset}${parameter:offset:length}

[lth@controller ~ 23:20:48]$ str="abc123abc123"# 提取子串
[lth@controller ~ 23:20:52]$ echo ${str:3}
123abc123
[lth@controller ~ 23:20:58]$ echo ${str:3:4}
123a

示例4:${parameter#word}${parameter##word}

[lth@controller ~ 23:21:12]$ str="abc123abc123"# 从左侧开始删除子串
[lth@controller ~ 23:21:20]$ echo ${str#b*a}
abc123abc123# 未匹配到,第一个字符必须与元字串第一个子符一致
[lth@controller ~ 23:21:28]$ echo ${str#a*c}
123abc123
[lth@controller ~ 23:21:34]$ echo ${str##a*c}
123

示例5:${parameter%word}${parameter%%word}

[lth@controller ~ 23:21:43]$ str="abc123abc123"# 从右侧开始删除子串
[lth@controller ~ 23:21:49]$ echo ${str%a*c}
abc123abc123# 未匹配到,最后一个字符必须与元字串最后一个子符一致
[lth@controller ~ 23:21:56]$ echo ${str%c*3}
abc123ab
[lth@controller ~ 23:22:12]$ echo ${str%%c*3}
ab

示例6:${parameter/pattem/string}

[lth@controller ~ 23:22:23]$ str="abc123abc123"# 只替换第一个
[lth@controller ~ 23:22:31$ echo ${str/abc/def}
def123abc123# 所有的全替换
[lth@controller ~ 23:22:43]$ echo ${str//abc/def}
def123def123
变量子串的生产场景应用案例

**示例1:**替换文件名中特定字符串

# 先创建一个图片文件,名字里藏着"2022"这个年份
[lth@controller ~ 23:25:28]$ touch stu-202212-snap.jpg  # 查看所有以"stu-"开头的文件,确认刚创建的文件存在[laoma@shell ~]$ ls stu-*  
stu-202212-snap.jpg# 把文件名存进变量file,像给文件挂个"姓名牌"
[lth@controller ~ 23:25:28]$ file="stu-202212-snap.jpg"  # 这步是"改名魔法":用mv命令移动/重命名文件
# ${file/2022/2021}就像给姓名牌做修改,把"2022"换成"2021"
[lth@controller ~ 23:25:28]$ mv $file ${file/2022/2021}  # 再看一眼,文件名里的年份真的变了!
[lth@controller ~ 23:25:28]$ ls stu-*  
stu-202112-snap.jpg

**示例2:**删除文件名中特定字符串

# 新建一个文件,名字里带着"-snap"标记,像给照片加了个"快照"水印
[lth@controller ~ 23:29:00]$ touch stu-202212-snap.jpg  # 查看以"stu-"开头的文件,确认这个带"快照"标记的文件存在
[lth@controller ~ 23:29:13]$ ls stu-*  
stu-202212-snap.jpg# 把文件名存进变量file,好比把带水印的照片放进相框
[lth@controller ~ 23:29:19]$ file="stu-202212-snap.jpg"  # 这里是"去水印"魔法:用mv命令给文件改名
# ${file/-snap/}就像擦掉相框里照片的"-snap"水印,替换成空(相当于删掉)
[lth@controller ~ 23:29:26]$ mv $file ${file/-snap/}  # 再看一眼,文件名里的"-snap"标记真的不见了!
[lth@controller ~ 23:29:34]$ ls stu-*  
stu-202212.jpg

Shell 脚本的条件测试

文件判断表达式

Bash 条件判断和目录操作
[lth@controller bin 23:31:19]$ [ -r /etc/shadow ] && echo i can read /etc/shadow
[lth@controller bin 23:31:23]$ ls -l /etc/shadow
---------- 1 root root 776 821 23:31 /etc/shadow
[lth@controller bin 23:31:29]$ [ ! -r /etc/shadow ] && echo i can not read /etc/shadow
i can not read /etc/shadow
[lth@controller bin 23:31:37]$ [ -d $path ] && echo $path is a directory
is a directory
[lth@controller bin 23:32:19]$ ls $path
666.sh  999.sh  eval.sh  monitory_os  noeval.sh  read.sh  showargs.sh  ssh_ctl[lth@controller bin 23:32:34]$ [ ! -d $path ] && echo $path is not a directory
[lth@controller bin 23:32:49]$ [ ! -d $path ] && mkdir $path && echo 创建 $path 成功Try 'rmdir --help' for more information.[lth@controller bin 23:32:53]$ ls $path
666.sh  999.sh  eval.sh  monitory_os  noeval.sh  read.sh  showargs.sh  ssh_ctl[lth@controller bin 23:33:34]$ [ -d $path ] && echo $path is exist
is exist[lth@controller bin 23:33:41]$ path=/tmp/data
[lth@controller bin 23:33:47]$ mkdir $path
[lth@controller bin 23:33:52]$ [ -d $path ] && echo $path is exist
/tmp/data is exist[lth@controller bin 23:35:12]$ [ -d $path ] || mkdir $path
[lth@controller bin 23:36:54]$ ls $path
判断当前用户是否是root用户
[lth@controller bin 23:38:06]$ vim 123.sh
[lth@controller bin 23:38:11]$ cat 123.sh 
#!/bin/bash
[ "$(whoami)" != "root" ] && echo pls run as root. && exit
[ "$USER" != "root" ] && echo pls run as root. && exit
[ "$UID"  -ne 0 ] && echo pls run as root. && exit
((UID!=0)) && echo pls run as root. && exit[lth@controller bin 23:40:21]$ chmod +x 123.sh 
[lth@controller bin 23:40:36]$ 123.sh 
pls run as root.
http://www.xdnf.cn/news/1342297.html

相关文章:

  • VASPKIT模版INCAR笔记
  • 同题异构解决leetcode第3646题下一个特殊回文数
  • Effective C++ 条款55:熟悉Boost库
  • 2025-08-21 Python进阶2——数据结构
  • imx6ull-驱动开发篇33——platform 平台驱动模型
  • C++ this 指针
  • 分治思想在系统分流削峰中的实践与Golang前沿实现
  • Python读取和设置PNG图片的像素值
  • MFC随笔—不使用对话框资源模板创建对话框
  • Effective C++ 条款54:熟悉标准库
  • 【lucene】lucene常用查询一览
  • python 项目编号 2025821 有关于中英文数据的收集、处理
  • 数据结构之排序大全(3)
  • Python数据可视化利器:Matplotlib从入门到实战全解析
  • C ++代码学习笔记(一)
  • TDengine IDMP 运维指南(常见问题)
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(18):文法+单词第6回1
  • 虚幻基础:曲线
  • 基于STM32单片机的二维码识别物联网OneNet云仓库系统
  • 图--常见面试问题
  • 从源码中学习Java面向对象的多态
  • 多级缓存一致性矩阵:ABP vNext 下的旁路 / 写穿 / 写回组合实战
  • MiniGPT-4
  • FPGA 在情绪识别领域的护理应用(三)
  • 机器学习1
  • 结合 Flutter 和 Rust 的跨平台开发方案
  • Vibe Coding v.s Prompt Engineering
  • 数据库面试常见问题
  • gsplat在windows本地部署
  • Dockerfile