$0 $# $n-->$[1..9] $* $@
1, 在 shell 中存在着一些特殊而又重要的变如:$1 $0 $#, 我们称为特殊的位置变量要从命令行, 函数, 脚本, 等传递参数时, 就需要在 shell 脚本中使用位置参数变量
$0: 显示当前的脚本文件名, 如果在执行脚本时添加了路径, 那么全部都会输出
$n: 获取当前执行的 shell 脚本的第 n 个参数值比如:[n=1..9], 如果 N 大于 9 那么就要使用 {} 来定义 比如 ${10}
$#: 获取当前 shell 脚本后面接的参数的个数
$*: 获取当前脚本的参数, 不加引号和 $@是一样的 加了引号; 例如 "$*" 则表示单个字符串. 相当于 "$1 $2 $3"
$@: 同样也是获取当前 shell 的参数, 不加引号和 $* 是一样的, 那么加了引号如:"$@" 表示将所有的参数视为不同独立的字符串, 相当于 "$1" "$2"..
总结:$* 和 $@不加双引号 是没有任何区别的, 有双引号两者就有区别 1)$1 $2 特殊变量实战
[root@yankerp src]# cat test.sh #查看脚本的内容
#!/bin/bash
echo $1 ---< 定义了 $1
[root@yankerp src]# source test.sh yankai #执行的脚本的时候将 yankai 赋值给脚本中的 1
yankai #输出 yankai
[root@yankerp src]#
例 2:
[root@yankerp src]# cat test.sh #脚本内容
#!/bin/bash
echo $1
[root@yankerp src]# source test.sh zhangsan lisi #zhansgan lisi 是两个字符串以空格分割
zhangsan #只输出了 zhangsan, 因为脚本中只定义了 $1
[root@yankerp src]#
例 3:
[root@yankerp src]# cat test.sh #查看脚本的内容
#!/bin/bash
echo $1
[root@yankerp src]# source test.sh "zhangsan lisi" #加双引号表示一个字符串参数
zhangsan lisi #最后输出结果为 zhangsan lisi
[root@yankerp src]#
例 4: 在脚本中添加 $1 $2 测试:
[root@yankerp src]# cat test.sh #查看脚本的内容
#!/bin/bash
echo $1 $2 定义了 $1 $2
[root@yankerp src]# source test.sh zhangsan lisi #在执行脚本的时候定义了两个字符串
zhangsan lisi #说明 zhangsan 赋值给了 $1 lisi 赋值给了 $2 输出结果为 zhangsan lisi
[root@yankerp src]#
同时也可以这样加双引号 如下:
[root@yankerp src]# cat test.sh #查看脚本的内容
#!/bin/bash
echo $1 $2
[root@yankerp src]# source test.sh "zhangsan lisi" yankai #"" 表示一个字符串
zhangsan lisi yankai # 输出结果
[root@yankerp src]#
2) 当我们一个个的输入 echo $1---15 时会感觉很慢我们可以使用以下命令来接收命令传递的 15 个参数
[root@yankerp src]# echo \${1..15}
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
将输出的内容导入到 test.sh 文件中
[root@yankerp src]# echo \${1..15} > test.sh
[root@yankerp src]# cat test.sh
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[root@yankerp src]#
我们在脚本第一行加入 echo
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
3) 打印 26 个字母如下:
[root@yankerp src]# 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
传入 26 个字母 a-z 作为 26 个参数
[root@yankerp src]# cat test.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 #脚本内容
[root@yankerp src]# source test.sh {a..z} #传入 26 个字母
a b c d e f g h i a0 a1 a2 a3 a4 a5 #位置参数大于 9 后, 输出的内容就不对了
[root@yankerp src]#
当位置参数大于 9 时 上面已经提到了我们可以使用 {} 来定义如下:
[root@yankerp src]# cat test.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
再次 . 执行
[root@yankerp src]# source test.sh {a..z}
a b c d e f g h i j k l m n o
4)$0 特殊变量实战
[root@yankerp src]# cat y.sh
#!/bin/bash
echo $0
当我们不带路径运行脚本, 它会打印脚本的名称, 如下:
[root@yankerp src]# sh y.sh
y.sh
当我们带绝对路径来执行脚本时, 它会输出路径 + 脚本名
[root@yankerp src]# sh /usr/local/src/y.sh
/usr/local/src/y.sh
介绍 dirname ---- basename
[root@yankerp src]# dirname /usr/local/src/y.sh
/usr/local/src
[root@yankerp src]# basename /usr/local/src/y.sh
y.sh
.dirname 功能: 获取脚本的路径
.basename: 获取脚本的名称
例如:
[root@yankerp src]# cat y.sh
#!/bin/bash
dirname $0
basename $0
[root@yankerp src]# sh /usr/local/src/y.sh
/usr/local/src
y.sh
[root@yankerp src]#
5)$# 特殊变量获取传参个数实践
[root@yankerp src]# cat test.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 < 9 个位置参数变量
echo $# <---- 加入 $#
[root@yankerp src]# source test.sh {a..z} < 传入 26 个字符
a b c d e f g h i -----< 只接收 9 个变量
26 ----< 传入 26 个字符. 因此这里显示 26
[root@yankerp src]#
实例 1: 条件表达式判断语句如下:
#!/bin/bash
[ $# -ne "2" ] && { #如果用户输入的传参个数不等于 2
echo "请输出正确的数值" #那么输出此信息
exit 1 #随后退出脚本
}
echo "输入正确" #如果输入的传参个数是 2 那么就输出此信息
运行脚本如下:
[root@yankerp src]# sh p.sh
请输出正确的数值
[root@yankerp src]# sh p.sh zhangsan lisi
输入正确
[root@yankerp src]#
IF 语句判断如下:
#!/bin/bash
if [ $# -ne "2" ] ------- 如果输入的传参个数不是 2
then ------ 那么
echo "/usr/local/src/ $0 请输入正确的值" -- 输出一个 / usr/local--- 路径加 $0 $0 表示输出运行脚本的名称
else
echo "输入正确"
fi
执行如下:
[root@yankerp src]# sh p.sh
/usr/local/src/ p.sh 请输入正确的值
[root@yankerp src]# sh p.sh zhangsan lisi
输入正确
[root@yankerp src]#
$* $@后续再出!!!
二, shell 进程中特殊状态变量
$? $(不常用) $!(不常用) $_(不常用)$ 和 $! 都是获取脚本进程号 PID, 但是有所不同这里不在演示
1,$? 特殊变量实践
[root@yankerp ~]# pwd
/root
[root@yankerp ~]# echo $?
0
[root@yankerp ~]
当我们执行每一条命令结束后, echo $? 如果它输出 0 那么就代表成功
[root@yankerp ~]# sfkljlfsdfsdf
bash: sfkljlfsdfsdf: 未找到命令...
[root@yankerp ~]# echo $?
127
[root@yankerp ~]#
非 0 则代表失败.
案例: 安装 Apache 判断是否安装成功
[root@yankerp ~]#yum install httpd -y
案例 2: 通过脚本控制命令及脚本执行返回值
#!/bin/bash
if [ "$#" -ne "3" ]
then
echo "/bin/bash $0" 请输出正确字符
exit 120 ---< 如果以上不成立 并指定 120 值退出脚本
else
echo "输入正确"
fi
运行如下:
[root@yankerp ~]# sh k.sh
/bin/bash k.sh 请输出正确字符
[root@yankerp ~]# echo $?
120
[root@yankerp ~]#
[root@yankerp ~]# sh k.sh zhangsan lisi wangwu
输入正确
[root@yankerp ~]# echo $?
0
[root@yankerp ~]#
声明: 以上文章是 << 跟着老男孩学 Linux 运维 Shell 编程实战 >> 第四章看完的总结;
再见~~~
来源: http://blog.csdn.net/qq_39591494/article/details/79206282