shell变量进阶
1. Shell 位置参数变量
部分位置参数变量如下:
$0,获取当前执行的 Shell 脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径。
$n,获取当前执行的 Shell 脚本的第n个参数值。如果n大于9,则用大括号括起来,例如${10},接的参数以空格隔开。
$#,获取当前执行的 Shell 脚本后面接的参数数量。
$*,获取当前 Shell 脚本所有传参的参数,不加引号和
$@
相同;如果给$*
加上双引号,例如:"$*"
,则表示将所有的参数视为单个字符串,相当于$1 $2 $3
。$@,获取当前 Shell 脚本所有传参的参数,不加引号和$*相同;如果给$@加上双引号,例如:
$@
,则表示将所有的参数视为不同的独立字符串,相当于"$1"、"$2"、"$3"...
,这是将多参数传递给其他程序的最佳方式,因为它会保留所有的内嵌在每个参数里的任何空白。
示例1:showargs.sh 内容如下
[lyk@controller bin 14:55:49]$ vim showargs.sh1 #!/bin/bash2 echo $0 3 echo $1 4 echo $2 5 echo $10 6 echo ${10}7 echo $# 8 echo $* 9 echo $@ 10 echo "$@" [lyk@controller ~ 13:56:39]$ bash showargs.sh {a..z}showargs.shaba0j26a b c d e f g h i j k l m n o p q r s t u v w x y za b c d e f g h i j k l m n o p q r s t u v w x y za 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 内容如下
[lyk@controller bin 14:59:40]$ vim ssh_ctl1 #!/bin/bash2 systemctl $1 sshd
执行使用绝对路径:
[lyk@controller bin 15:04:23]$ sudo ~/bin/ssh_ctl status● sshd.service - OpenSSH server daemonLoaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)Active: active (running) since 三 2025-08-20 09:23:49 CST; 5h 41min ago......[lyk@controller bin 15:05:02]$ sudo ~/bin/ssh_ctl stop[lyk@controller bin 15:05:06]$ sudo ~/bin/ssh_ctl status● sshd.service - OpenSSH server daemonLoaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)Active: inactive (dead) since 三 2025-08-20 15:05:06 CST; 6s ago......[lyk@controller bin 15:05:12]$ sudo ~/bin/ssh_ctl restart[lyk@controller bin 15:05:15]$ sudo ~/bin/ssh_ctl status● sshd.service - OpenSSH server daemonLoaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)Active: active (running) since 三 2025-08-20 15:05:15 CST; 5s ago......
2. Shell 内置变量命令
echo
echo命令参数选项:
-n,不换行输出内容。
-e,解析转义字符(见下面的字符)
转义字符:
\n,换行。
\t,制表符(tab)。
\b,退格。
[lyk@controller bin 15:05:21]$ echo -n "lyk ";echo laowanglyk laowang[lyk@controller bin 15:08:48]$ echo -e "lyk\nlaowang"lyklaowang[lyk@controller bin 15:08:54]$ echo -e "lyk\tlaowang"lyk laowang[lyk@controller bin 15:09:00]$ echo -e "1\b23"23[lyk@controller bin 15:09:06]$ echo -e "123\b"123# 后面有东西才会覆盖[lyk@controller bin 15:09:10]$ echo -ne "123\b";echo haha12haha
echo -e "123\b" 1. 输出 123,光标在 3 右侧2. \b 使光标左移到 3 左侧3. 无后续字符,3 未被覆盖 显示 123 \b 后无新字符,光标移动但原有字符保留,没有覆盖效果echo -e "1\b23" 1. 输出 1,光标在 1 右侧2. \b 使光标左移到 1 左侧3. 输出 23,2 覆盖 1,3 紧随其后 显示 23 \b 后有新字符,新字符从光标位置(原 1 的位置)开始覆盖,导致原有字符被替换
read
[lyk@controller bin 15:16:18]$ cat read.sh #!/bin/shread -p "输入你想要说的话:" strecho "你想要说的话是:$str"[lyk@controller bin 15:16:22]$ bash read.sh 输入你想要说的话:aaa你想要说的话是:aaa# 不显示输入的内容[lyk@controller bin 15:16:39]$ read -s -p "请设置用户密码: " password 请设置用户密码: [lyk@controller bin 15:17:04]$ echo $password123
3. Shell 变量子串介绍
${parameter},返回变量 parameter 的内容。
${#parameter},返回变内容的长度(按字符),也适用于特殊变量。
......
${parameter/pattem/string},使用string代替第一个匹配的pattern。
${parameter//pattem/string},使用string代替所有匹配的pattern。
示例1: ${parameter}
[lyk@controller bin 15:17:19]$ str="abc123abc123"[lyk@controller bin 15:29:09]$ echo ${str}abc123abc123
示例2:${#parameter}
[lyk@controller bin 15:29:55]$ echo ${#str}12
示例{3..5}......
示例6:${parameter/pattem/string}
[lyk@controller bin 15:30:12]$ str="abc123abc123" #只替换第一个 [lyk@controller bin 15:31:21]$ echo ${str/abc/def} def123abc123
示例7:${parameter//pattem/string}
[lyk@controller bin 15:31:42]$ str="abc123abc123" #替换全部 [lyk@controller bin 15:31:56]$ echo ${str//abc/def} def123def123
3.1 变量子串的生产场景应用案例
示例1:替换文件名中特定字符串
[lyk@controller bin 15:35:11]$ touch stu-202212-snap.jpg [lyk@controller bin 15:35:20]$ ls stu-* stu-202212-snap.jpg [lyk@controller bin 15:35:24]$ file="stu-202212-snap.jpg" [lyk@controller bin 15:35:30]$ mv $file ${file/2022/2021} [lyk@controller bin 15:35:36]$ ls stu-* stu-202112-snap.jpg
示例2:删除文件名中特定字符串
[lyk@controller bin 15:36:46]$ touch stu-202212-snap.jpg [lyk@controller bin 15:36:50]$ ls stu-* stu-202212-snap.jpg [lyk@controller bin 15:36:52]$ file="stu-202212-snap.jpg" [lyk@controller bin 15:36:56]$ mv $file ${file/-snap/} [lyk@controller bin 15:37:01]$ ls stu-* stu-202212.jpg