二、Shell变量二之位置参数变量变量

在Shell中存在一些特殊且重要的变量,例如:01、$#,我们称之为特殊位置参数变量。要从命令行、函数或脚本执行等处传递参数时,就需要在Shell脚本中使用位置参数变量。

复制代码
$0:
获取当前执行的shell脚本的文件名,如果执行脚本包含了路径,那么就包含脚本的路径。

$n:
获取当前执行的shell脚本的第n个参数值,n=1..9,当n=0时表示脚本的文件名;如果n>9,则用大括号括起来,如${11} ${12},2个参数中间使用空格隔开。

$#
获取当前执行的shell脚本后面接的参数的总个数。

$*
获取当前shell脚本所有传参的参数,不加引号和$@相同;如果给$*加上双引号,如:"$*",则表示将所有的参数视为单个字符串,相当于"$1 $2 $3"

$@
获取当前shell脚本所有传参的参数,不加引号和$*相同;如果给$@加上双引号,如:"$@",则表示将所有的参数视为不同的独立字符串,相当于"$1" "$2" "$3" "..."。这是将多参数传递给其它程序的最佳方式,因为它会保留所有的内嵌的每个参数丽的任何空白。当"$@""$*"都加双引号时,两者是有区别的;都不加双引号时,两者无区别。
复制代码

案例:

$1$2…​$9​${10}${11}..特殊变量实践

复制代码
[root@node1 tmp]# cat /tmp/test.sh 
#! /bin/bash
echo $1

[root@node1 tmp]# bash /tmp/test.sh ywx1 ywx2
ywx1
#只显示$1的值
[root@node1 tmp]# bash /tmp/test.sh "ywx1 ywx2"
ywx1 ywx2
#把ywx1和ywx2用双引号括起来,则表示一个参数
复制代码
复制代码
[root@node1 tmp]# cat test2.sh 
#! /bin/bash
echo $1
echo $2

[root@node1 tmp]# bash /tmp/test2.sh ywx1 ywx2 ywx3
ywx1
ywx2
#在显示$1 $2的值

[root@node1 tmp]# bash /tmp/test2.sh ywx  "king seal" kaka
ywx
king seal
#"king seal"被双引号引起作为$2
复制代码

设置15个位置参数(15),用于接收命令行传递的15个参数。

复制代码
[root@node1 tmp]# cat test3.sh 
#! /bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15

[root@node1 tmp]# echo {a..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

[root@node1 tmp]# bash /tmp/test3.sh {a..z}
a b c d e f g h i a0 a1 a2 a3 a4 a5
#在$9之后显示错误了

#更改test3.sh脚本
[root@node1 tmp]# cat test3.sh
#! /bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}

[root@node1 tmp]# bash /tmp/test3.sh {a..z}
a b c d e f g h i j k l m n o
#加上大括号则正常
复制代码

$0特殊变量的作用及变量实践

[root@node1 tmp]# cat test.sh 
#! /bin/bash
echo $0

[root@node1 tmp]# bash /tmp/test.sh ywx1 ywx2
/tmp/test.sh
#显示文件名

dirname及basename命令自身的功能和用法

dirname取脚本的路径
[root@node1 tmp]# dirname /tmp/test.sh
/tmp

basename取脚本的名字
[root@node1 tmp]# basename /tmp/test.sh 
test.sh

$#特殊变量获取脚本传参个数的实践

[root@node1 tmp]# cat /tmp/test.sh 
#! /bin/bash
echo $#

[root@node1 tmp]# sh /tmp/test.sh ywx1 ywx2 ywx3
3

$*和$@特殊变量功能及区别说明

利用set设置位置参数(同命令行脚本的传参)。

复制代码
[root@node1 tmp]# set -- "I am" handsome ywx #<==通过set设置三个字符串参数,“——”表示清除所有的参数变量,重新设置后面的参数变量。
[root@node1 tmp]# echo $#
3
[root@node1 tmp]# echo $1
I am
[root@node1 tmp]# echo $2
handsome
[root@node1 tmp]# echo $3
ywx
#$*和$@不加引号
[root@node1 tmp]# echo $*
I am handsome ywx
[root@node1 tmp]# echo $@
I am handsome ywx
#$*和$@不加引号,使用for循环打印参数
[root@node1 tmp]# for i in $*;do echo $i;done 
I
am
handsome
ywx
[root@node1 tmp]# for i in $@;do echo $i;done 
I
am
handsome
ywx
#不加双引号,会输出所有的内容,第一个参数$1="I am"会被拆开

#$*和$@加引号
[root@node1 tmp]# echo "$*"
I am handsome ywx
[root@node1 tmp]# echo "$@"
I am handsome ywx
#$*和$@加引号,使用for循环打印参数
[root@node1 tmp]# for i in "$*"; do echo $i ;done
I am handsome ywx #"$*" 输出的参数"$1 $2 $3..."
[root@node1 tmp]# for i in "$@"; do echo $i ;done
I am
handsome
ywx #"$@" 输出的参数是"$1" "$2" "$3" ...
复制代码

shift向右偏移n个变量

复制代码
[root@node1 tmp]# cat test.sh 
#! /bin/bash
echo $1
shift 1
echo $1
shift 2
echo $1

[root@node1 tmp]# sh /tmp/test.sh ywx1 ywx2 ywx3 ywx4
ywx1
ywx2 #在ywx1 ywx2 ywx3 ywx4上向右偏移1个,跳过ywx1,偏移后的$1=ywx2
ywx4 #在ywx2 ywx3 ywx4上向右偏移2个,跳过ywx2 ywx3,偏移后的$1=ywx4
复制代码

 

posted @   yaowx  阅读(463)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
历史上的今天:
2019-10-04 DNS实战
点击右上角即可分享
微信分享提示