Shell编程之特殊变量的笔记小结

$0 $# $n-->$[1..9] $* $@

1、在shell中存在着一些特殊而又重要的变如:$1 $0 $#,我们称为特殊的位置变量要从命令行,函数,脚本,等传递参数时,就需要在shell脚本中使用位置参数变量

  1. $0:显示当前的脚本文件名,如果在执行脚本时添加了路径,那么全部都会输出
  2. $n:获取当前执行的shell脚本的第n个参数值比如:[n=1..9],如果N大于9那么就要使用{}来定义 比如${10}
  3. $#:获取当前shell脚本后面接的参数的个数
  4. $*:获取当前脚本的参数,不加引号和$@是一样的 加了引号;例如"$*" 则表示单个字符串。相当于"$1 $2 $3"
  5. $@:同样也是获取当前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" ] &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编程实战>>第四章看完的总结;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Shell编程中的特殊变量之进程状态变量介绍
  • Shell编程中的特殊变量之位置变量介绍
(0)

相关推荐

  • Shell编程中的特殊变量之进程状态变量介绍

    进程状态变量 1.$$获取当前shell的进程号(PID) 2.$!执行上一个指令的PID 3.$?获取执行上一个命令的返回值(0为成功,非零为失败,这个很常用) 4.$_在此之前执行的命令或脚本的最后一个参数 复制代码 代码如下: cat> test$.sh echo'$$='$$ echo'$!='$! echo'$?='$? echo'$@='$@ echo'$_='$_ #输出如下 sh test\$.sh 1 2 3 $$=2556 $!= $?=0 $@=1 2 3 $*和$@的区别

  • Shell编程中的特殊变量之位置变量介绍

    1.$0 获得当前脚本的文件名,包括路径. 复制代码 代码如下: #写一个测试脚本 vim test.sh #内容如下 dirname$0 basename$0 #执行一下 bash$(pwd)/test.sh #输出如下 /home/jane test.sh 2.$n 获取当前执行脚本的第n个参数,n=1..9,$0,为当前脚本名.如果n大于9,使用${10} 复制代码 代码如下: echo'echo '$(seq-s " $"1 5|sed's/1/$1/') > test_

  • Shell编程之特殊变量的笔记小结

    $0 $# $n-->$[1..9] $* $@ 1.在shell中存在着一些特殊而又重要的变如:$1 $0 $#,我们称为特殊的位置变量要从命令行,函数,脚本,等传递参数时,就需要在shell脚本中使用位置参数变量 $0:显示当前的脚本文件名,如果在执行脚本时添加了路径,那么全部都会输出 $n:获取当前执行的shell脚本的第n个参数值比如:[n=1..9],如果N大于9那么就要使用{}来定义 比如${10} $#:获取当前shell脚本后面接的参数的个数 $*:获取当前脚本的参数,不加引号和

  • shell编程入门之变量,字符串,数组,函数使用方法总结

    一. 变量 变量定义 定义变量时,变量名不加美元符号 your_name="jb51.net" 注意,变量名和等号之间不能有空格. 除了显式地直接赋值,还可以用语句给变量赋值,如, for file in `ls /etc` 或 for file in $(ls /etc) 已定义的变量,可以被重新定义,如, your_name="tom" echo $your_name your_name="alibaba" echo $your_name 注

  • Shell编程之特殊变量和扩展变量详解

    特殊变量 在Shell中的特殊变量主要分别两种位置参数变量.状态变量两种. 位置参数变量 Shell中的位置参数变量主要是指0.0.1.$#等,主要用于从命令行.函数或脚本执行等地方传递参数.详细说明如下所示: $0:获取当前执行的Shell脚本的文件名,如脚本中包含路径,则输出也包括路径 $n:获取当前执行的Shell脚本的第n个参数值,如n>9,则需要使用用大括号,如${10},各参数间用空格进行分隔 $#:获取当前执行的Shell脚本传入参数的总个数 $*:获取当前执行的Shell所有传入

  • shell编程中的字符串截取方法小结

    一.Gnu Linux shell 截取字符变量的前8位,有方法如下: 1.expr substr "$a" 1 8 2.echo $a|awk '{print substr(,1,8)}' 3.echo $a|cut -c1-8 4.echo $ 5.expr $a : '\(.\\).*' 6.echo $a|dd bs=1 count=8 2>/dev/null   二.按指定的字符串截取 1.第一种方法: ${varible##*string} 从左向右截取最后一个str

  • Shell编程中Shift的用法小结

    位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常有用的 Unix 命令:shift.我们知道,对于位置变量或命令行参数,其个数必须是确定的,或者当 Shell 程序不知道其个数时,可以把所有参数一起赋值给变量$*.若用户要求 Shell 在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在 $1 后为 $2,在 $2 后面为 $3 等

  • shell脚本编程之循环语句学习笔记

    本篇博客很简单,看一下shell编程使用到的循环语句,包括for循环,while循环,until循环,for后边跟一个变量,然后是一个集合,将集合中的东西赋给这个变量,每次循环执行,这跟java中的foreach很像,while循环和if使用同样的条件判断,满足条件执行语句,until和while相反,不满足条件执行语句,是不是很简单啊,下面看一下代码吧. 复制代码 代码如下: #!/bin/sh #for循环最基本的用法 for var in "hello" "xiao t

  • shell编程基础知识小结

    1.文件类型介绍linux系统中主要包括以下七种文件类型: d 目录 - 普通文件 l 符号链接 s 套接字文件 b 块设备文件 c 字符设备文件 p 命名管道文件 2.正则表达式正则表达式在shell编程中非常重要. 从一个文件或命令输出中抽取或过滤文本时.可使用正则表达式(RE),正则表达式是一些特殊或不很特殊的字符串模式的集合. 基本的元字符集:^ 只匹配行首.$ 只匹配行尾.* 一个单字符后紧跟*,匹配0个或多个此单字符.[] 匹配[]内字符,可以是一个单字符,也可以是字符序列.可以使用

  • 深入浅出Shell编程 Shell变量介绍

    •深入浅出Shell编程: Shell 变量 ◦1 系统变量 ◦2 Shell用户变量 ■2.1 基础 ■2.2 使用技巧 ■2.3 shell 中的数组 ◦3 shell 环境变量 先不要管Shell的版本,来看看Shell 变量,在Shell中有三种变量:系统变量,环境变量,用户变量.其中用户变量在编程过程中使用最多,系统变量在对参数判断和命令返回值判断会使用,环境变量主要是在程序运行的时候需要设置. 1 系统变量 Shell常用的系统变量并不多,但却十分有用,特别是在做一些参数检测的时候.

  • 详解Shell编程之变量数值计算(二)

    OK,数值运算(上)是我看完的一小部分,大概的结束脚本如下:(回顾~~) #!/bin/bash a=$1 b=$2 expr $1 + 1 &>/dev/null if [ "$?" -ne "0" ] then echo "请输入数字" exit 1 fi if [ "$#" -ne "2" ] then echo "请输入两个数字" exit 1 fi echo &q

  • 详解Shell编程之变量数值计算(一)

    如果要执行运算,那就少不了运算符,和其他的编程语言相似,shell也有很多的运算符如下: +.-.:代表着加号 和减号 或者,负号 *./.%:代表着乘号,除号,和取模. **   : 幂运算 ++.-- :表示着增加或者减少,它可以放在前置,也可以放在变量的结尾 !.||.&&.(取反)(或) (and) <.<=.>.>=  :比较符号,小于.小于等于.大于.大于等于 ==.!=.= :相等,不相等, =表示相等于 <<     >> 

随机推荐