【运维进阶】Shell 变量
Shell 变量
Shell 变量基础知识
什么是 Shell 变量
什么是 Shell 变量
在 Shell 脚本中,变量就像是一个 “容器”,用来存储数据(比如数字、字符串、路径等),方便在脚本中重复使用、修改或传递。它的作用类似于我们日常生活中的 “标签”—— 给某样东西贴上标签,之后通过标签就能快速找到或操作这个东西。
Shell 变量的特点
-
无需声明类型
和其他编程语言(如 Python、Java)不同,Shell 变量不需要提前声明 “是数字还是字符串”,直接赋值即可。例如:name="Alice" # 字符串变量 age=25 # 数字变量 path="/home" # 路径变量
-
命名规则
- 只能包含字母、数字和下划线(
_
) - 不能以数字开头
- 区分大小写(
name
和Name
是两个不同的变量) - 建议使用大写字母命名环境变量(如
PATH
),小写字母命名自定义变量(如user
)
- 只能包含字母、数字和下划线(
-
赋值与使用
-
赋值时,等号(
=
)两边不能有空格(例如a=10
正确,a = 10
错误)。 -
使用变量时,需要在变量名前加美元符号($),例如:
name="Bob" echo $name # 输出:Bob echo "Hello, $name" # 输出:Hello, Bob
-
Shell 变量的分类
-
用户自定义变量(普通变量)
由用户在脚本中自行定义和使用,仅在当前 Shell 会话或脚本中有效。例如:# 定义变量 score=90 subject="Math"# 使用变量 echo "科目:$subject,分数:$score" # 输出:科目:Math,分数:90
-
环境变量
全局生效的变量,用于存储系统或 Shell 的配置信息(如路径、用户名等),可以被所有子进程访问。
常见的环境变量:PATH
:存储可执行程序的路径(输入命令时,Shell 会从这些路径中查找程序)。HOME
:当前用户的主目录(如/home/laoma
)。USER
:当前登录的用户名。
可以用echo $变量名
查看,例如echo $HOME
。
-
位置参数变量
用于接收脚本运行时传入的参数,格式为$n
(n
是数字,$1
表示第一个参数,$2
表示第二个参数,以此类推)。
例如,运行脚本bash test.sh apple banana
时:# test.sh 内容 echo "第一个参数:$1" # 输出:第一个参数:apple echo "第二个参数:$2" # 输出:第二个参数:banana
-
特殊变量
Shell 内置的具有特殊含义的变量,例如:$0
:当前脚本的文件名。$?
:上一条命令的执行结果(0 表示成功,非 0 表示失败)。$*
或$@
:所有传入的参数的集合。
示例:
假设你写了一个脚本,需要多次用到 “你的名字” 和 “年龄”,就可以用变量存储:
#!/bin/bash# 定义变量
myname="小明"
myage=18# 多次使用变量
echo "我叫$myname,今年$myage岁。"
echo "明年,$myname就$((myage + 1))岁了。"
运行后输出:
我叫小明,今年18岁。
明年,小明就19岁了。
这里的 myname
和 myage
就是变量,它们像 “标签” 一样,让你不用重复写 “小明” 和 “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
,默认启用。
显示与取消环境变量
- 通过
echo
或printf
命令打印环境变量。 - 用
env
或set
显示默认的环境变量。 - 用
unset
消除本地变量和环境变量。
环境变量的知识小结
- 变量名通常要大写。
- 变量可以在自身的 Shell 及子 Shell 中使用。
- 常用
export
来定义环境变量。 - 执行
env
默认可以显示所有的环境变量名称及对应的值。 - 输出时用
$变量名
,取消时用unset变量名
。 - 书写
crond
定时任务时要注意,脚本要用到的环境变量最好先在所执行的 Shell 脚本中重新定义。 - 如果希望环境变量永久生效,则可以将其放在用户环境变量文件或全局环境变量文件里。
普通变量
普通变量就像是 Shell 脚本里的 “临时小纸条”,专门用来存一些临时要用的数据 —— 可能是一串文字、一个数字,或者一段路径。它们只在 “自己的小圈子” 里管用,出了这个圈子就没人认识了。
比如说,你在脚本里写了 name="小明"
,这个 name
就是个普通变量。它就像你随手记在纸条上的名字,只有当前这个脚本在运行时能用到它。如果脚本跑完了,或者你新开了一个命令行窗口,这张 “小纸条” 就自动消失了,再想找 name
里的内容,就找不到啦。
普通变量的用法很随意:
- 起名的时候,只要别用数字开头,别掺空格和特殊符号就行(比如
age=18
、fruit="apple"
都没问题)。 - 用的时候在前面加个
$
,比如echo $name
,就能把 “小纸条” 上的内容读出来。 - 不用特意告诉 Shell 它是数字还是文字,直接赋值就行,Shell 自己会搞定。
但它有个 “小脾气”:默认只在当前的 Shell 或脚本里生效,不会传给子进程。比如你在命令行里定义了 num=5
,然后运行一个脚本,这个脚本里可看不到 num
的值 —— 就像你在客厅写的纸条,卧室里拿不到一样。
普通变量定义
为普通变量的定义赋值,一般有以下3 种写法:
变量名=value
,赋值时不加引号。变量名='value'
,赋值时加单引号。变量名="value"
,赋值时加双引号。
变量名及变量值要求
- 变量名:一般是由字母、 数字 、下划线组成的,只可以以字母或下划线开头,例如:
laoma
、laoma_123
、laoma_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
一样哦。
变量定义的基本技巧总结
- 不加引号定义变量:适用于内容是简单连续的数字、字符串、路径名等情况。此时变量值中若包含其他变量,会先解析这些变量的值,再整合为最终的变量内容。例如
a=192.168.1.2-$a
中,$a
会被解析成已有值,最终形成新的a
值。 - 单引号定义变量:单引号会 “原样保留” 其中的所有内容,无论里面有变量还是命令(命令需用反引号包裹),都不会被解析,只会直接输出原始字符。这种方式适合定义纯字符串,尤其不希望其中的变量、命令被处理的场景。比如
b='192.168.1.2-$a'
,输出时就是192.168.1.2-$a
。 - 双引号定义变量:双引号中的内容会进行解析,若包含变量或命令(命令需用反引号包裹),会先处理这些变量和命令,再输出最终结果。这种方式适合定义包含变量、命令,且需要它们被解析后再呈现的字符串。例如
c="192.168.1.2-$a"
,其中$a
会被解析成具体值,最终c
的内容是解析后的组合结果。
变量定义技巧总结
一、变量名规则与命名规范
- 命名限制:只能包含字母、数字、下划线,且必须以字母或下划线开头
- 命名规范(见名知意):
- 单词首字母大写:
LaomaAge
- 下划线连接:
laoma_age
- 驼峰式:
laomaAge
(首个单词小写,后续单词首字母大写) - 全大写(常用于环境变量):
LAOMAAGE
- 单词首字母大写:
二、变量赋值与内容处理
- 赋值符号:使用
=
(等号两边无空格) - 引号使用场景:
- 双引号:最常用,可解析变量和命令,适合大多数场景
- 无引号:适用于简单连续的字符串、数字、路径
- 单引号:原样输出内容,不解析变量和命令
- 命令结果赋值:
- 用反引号:
var=
命令 `` - 用
$()
:var=$(命令)
(推荐,可读性更好)
- 用反引号:
三、变量使用与输出
- 引用方式:
- 基础形式:
$变量名
(如$a
) - 变量后接其他字符时:
${变量名}
(如${a}b
)
- 基础形式:
- 特殊场景:
unset
、export
、(())
等操作中直接用变量名(不加$
)
- 输出规范:
- 字符串变量建议加双引号输出
- 需原样展示时用单引号
- 普通场景可直接使用或加双引号
四、学习建议
参考系统自带脚本(如/etc/init.d/functions
)的变量定义风格,逐步形成自己的规范和习惯。
Shell 变量进阶知识
Shell 中特殊变量
Shell 位置参数变量
Shell 中的位置参数变量,就像是给脚本或函数 “传递包裹” 的标签,专门用来接收运行时传入的参数。它们按顺序编号,就像快递单号一样,第一个参数对应 “1 号标签”,第二个对应 “2 号标签”,以此类推,方便脚本按顺序读取这些外部输入的信息。
常见的位置参数变量
变量 | 含义 |
---|---|
$n | n 是数字,$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"
,我们可以按 “位置” 或 “模式” 截取其中的部分内容:
${变量:起始位置:长度}
从 “起始位置”(0 开始计数)截取指定 “长度” 的字符,省略 “长度” 则截取到末尾。
str="hello world"
echo ${str:0:5} # 从位置0开始,取5个字符 → hello
echo ${str:6} # 从位置6开始,取到末尾 → world
${变量: -起始位置:长度}
(注意空格)
从字符串末尾开始截取(“起始位置” 为负数,前面必须加空格)。
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 8月 21 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.