bash 的特殊参数

位置参数

$0$1$2,等等

位置参数由命令行传给脚本或传给一个函数,或设置(set)给一个变量(参考例子 4-5例子 11-15)

$#

命令行参数[2]或者是位置参数的数量(参考例子 33-2)

$*

所有的位置参数都被当成单个单元。

Note

"$*"必须被引号引起来。

$@

和$*相同,但每个参数都是一个引起的字符串。那是说,参数都是没有被解析或扩展,是完整无缺地被传递的。这是说在参数列表中的每一个参数都被看作是一个单独的单元。

Note

当然,"$@"应该被引号引起来。


例子 9-6. arglist: 用$*和$@列出参数来

   1 #!/bin/bash
   2 # arglist.sh
   3 # 用几个参数来运行这个脚本,比如说"one two three".
   4 
   5 E_BADARGS=65
   6 
   7 if [ ! -n "$1" ]
   8 then
   9   echo "Usage: `basename $0` argument1 argument2 etc."
  10   exit $E_BADARGS
  11 fi  
  12 
  13 echo
  14 
  15 index=1          # 初始计数.
  16 
  17 echo "Listing args with \"\$*\":"
  18 for arg in "$*"  # 如果"$*"没有被引号引起来,会完全不能工作.
  19 do
  20   echo "Arg #$index = $arg"
  21   let "index+=1"
  22 done             # $* sees all arguments as single word. 
  23 echo "Entire arg list seen as single word."
  24 
  25 echo
  26 
  27 index=1          # Reset count.
  28                  # What happens if you forget to do this?
  29 
  30 echo "Listing args with \"\$@\":"
  31 for arg in "$@"
  32 do
  33   echo "Arg #$index = $arg"
  34   let "index+=1"
  35 done             # $@ sees arguments as separate words. 
  36 echo "Arg list seen as separate words."
  37 
  38 echo
  39 
  40 index=1          # Reset count.
  41 
  42 echo "Listing args with \$* (unquoted):"
  43 for arg in $*
  44 do
  45   echo "Arg #$index = $arg"
  46   let "index+=1"
  47 done             # Unquoted $* sees arguments as separate words. 
  48 echo "Arg list seen as separate words."
  49 
  50 exit 0

在一个shift命令的后面,变量$@会保存除掉先前参数列表的位置参数$1后剩下的命令行参数。

   1 #!/bin/bash
   2 # 以./scriptname 1 2 3 4 5执行
   3 
   4 echo "$@"    # 1 2 3 4 5
   5 shift
   6 echo "$@"    # 2 3 4 5
   7 shift
   8 echo "$@"    # 3 4 5
   9 
  10 # 每次"shift"后会丢掉$1.
  11 # 然后"$@"保存剩下的参数。

The $@ special parameter finds use as a tool for filtering input into shell scripts. The cat "$@" construction accepts input to a script either from stdin or from files given as parameters to the script. See Example 12-21 and Example 12-22.

Caution

依赖于$IFS变量的设置,$*和$@变量有时会表现不一致的令人迷惑的行为。


例子 9-7. $*和$@的不一致

   1 #!/bin/bash
   2 
   3 #  Erratic behavior of the "$*" and "$@" internal Bash variables,
   4 #+ depending on whether they are quoted or not.
   5 #  Inconsistent handling of word splitting and linefeeds.
   6 
   7 
   8 set -- "First one" "second" "third:one" "" "Fifth: :one"
   9 # Setting the script arguments, $1, $2, etc.
  10 
  11 echo
  12 
  13 echo 'IFS unchanged, using "$*"'
  14 c=0
  15 for i in "$*"               # quoted
  16 do echo "$((c+=1)): [$i]"   # This line remains the same in every instance.
  17                             # Echo args.
  18 done
  19 echo ---
  20 
  21 echo 'IFS unchanged, using $*'
  22 c=0
  23 for i in $*                 # unquoted
  24 do echo "$((c+=1)): [$i]"
  25 done
  26 echo ---
  27 
  28 echo 'IFS unchanged, using "$@"'
  29 c=0
  30 for i in "$@"
  31 do echo "$((c+=1)): [$i]"
  32 done
  33 echo ---
  34 
  35 echo 'IFS unchanged, using $@'
  36 c=0
  37 for i in $@
  38 do echo "$((c+=1)): [$i]"
  39 done
  40 echo ---
  41 
  42 IFS=:
  43 echo 'IFS=":", using "$*"'
  44 c=0
  45 for i in "$*"
  46 do echo "$((c+=1)): [$i]"
  47 done
  48 echo ---
  49 
  50 echo 'IFS=":", using $*'
  51 c=0
  52 for i in $*
  53 do echo "$((c+=1)): [$i]"
  54 done
  55 echo ---
  56 
  57 var=$*
  58 echo 'IFS=":", using "$var" (var=$*)'
  59 c=0
  60 for i in "$var"
  61 do echo "$((c+=1)): [$i]"
  62 done
  63 echo ---
  64 
  65 echo 'IFS=":", using $var (var=$*)'
  66 c=0
  67 for i in $var
  68 do echo "$((c+=1)): [$i]"
  69 done
  70 echo ---
  71 
  72 var="$*"
  73 echo 'IFS=":", using $var (var="$*")'
  74 c=0
  75 for i in $var
  76 do echo "$((c+=1)): [$i]"
  77 done
  78 echo ---
  79 
  80 echo 'IFS=":", using "$var" (var="$*")'
  81 c=0
  82 for i in "$var"
  83 do echo "$((c+=1)): [$i]"
  84 done
  85 echo ---
  86 
  87 echo 'IFS=":", using "$@"'
  88 c=0
  89 for i in "$@"
  90 do echo "$((c+=1)): [$i]"
  91 done
  92 echo ---
  93 
  94 echo 'IFS=":", using $@'
  95 c=0
  96 for i in $@
  97 do echo "$((c+=1)): [$i]"
  98 done
  99 echo ---
 100 
 101 var=$@
 102 echo 'IFS=":", using $var (var=$@)'
 103 c=0
 104 for i in $var
 105 do echo "$((c+=1)): [$i]"
 106 done
 107 echo ---
 108 
 109 echo 'IFS=":", using "$var" (var=$@)'
 110 c=0
 111 for i in "$var"
 112 do echo "$((c+=1)): [$i]"
 113 done
 114 echo ---
 115 
 116 var="$@"
 117 echo 'IFS=":", using "$var" (var="$@")'
 118 c=0
 119 for i in "$var"
 120 do echo "$((c+=1)): [$i]"
 121 done
 122 echo ---
 123 
 124 echo 'IFS=":", using $var (var="$@")'
 125 c=0
 126 for i in $var
 127 do echo "$((c+=1)): [$i]"
 128 done
 129 
 130 echo
 131 
 132 # Try this script with ksh or zsh -y.
 133 
 134 exit 0
 135 
 136 # 这个脚本由Stephane Chazelas所写,
 137 # 并由本书作者做了少些修改.

Note

$@$*仅仅在被双引号引住时不同。


例子 9-8. 当$IFS为空时的$*和$@

   1 #!/bin/bash
   2 
   3 #  如果$IFS被设置,但值是空的,
   4 #+ 则"$*"和"$@"不会像希望的那样显示位置参数。
   5 
   6 mecho ()       # 显示位置参数.
   7 {
   8 echo "$1,$2,$3";
   9 }
  10 
  11 
  12 IFS=""         # 设置了,但值是空的.
  13 set a b c      # 位置参数.
  14 
  15 mecho "$*"     # abc,,
  16 mecho $*       # a,b,c
  17 
  18 mecho $@       # a,b,c
  19 mecho "$@"     # a,b,c
  20 
  21 #  当$IFS为空时,
  22 #+ $*和$@的行为依赖于Bash或是sh正在运行.
  23 #  因此在一个脚本里使用这种“特性”是失策的。
  24 
  25 
  26 # 多谢Stephane Chazelas.
  27 
  28 exit 0

其它的特殊参数

$-

(使用set命令)传给脚本的标记. 参考例子 11-15.

Caution

这原本是一个ksh的结构,但被Bash采纳了,并且不幸的是,它看上去好像不能真正的在Bash脚本中工作。一个可能有用的地方是脚本用来测试自己本身是否是一个交互式的。

$!

在后台运行的最后一个作业的PID(进程ID)。

   1 LOG=$0.log
   2 
   3 COMMAND1="sleep 100"
   4 
   5 echo "Logging PIDs background commands for script: $0" >> "$LOG"
   6 # So they can be monitored, and killed as necessary.
   7 echo >> "$LOG"
   8 
   9 # Logging commands.
  10 
  11 echo -n "PID of \"$COMMAND1\":  " >> "$LOG"
  12 ${COMMAND1} &
  13 echo $! >> "$LOG"
  14 # PID of "sleep 100":  1506
  15 
  16 # 多谢Jacques Lederer的建议.

   1 possibly_hanging_job & { sleep ${TIMEOUT}; eval 'kill -9 $!' &> /dev/null; }
   2 # 强迫一个出错的程序结束退出.
   3 # 这很有用,尤其在初始化脚本中.
   4 
   5 # 多谢Sylvain Fourmanoit发现"!"变量创造性的用处.

$_

保存前一个命令最后一个参数的变量值。


例子 9-9. 下划线变量

   1 #!/bin/bash
   2 
   3 echo $_              # /bin/bash
   4                      # 只需调用/bin/bash来运行这个脚本.
   5 
   6 du >/dev/null        # 从命令行里没有输出.
   7 echo $_              # du
   8 
   9 ls -al >/dev/null    # 从命令行里没有输出.
  10 echo $_              # -al  (它是最后的参数)
  11 
  12 :
  13 echo $_              # :

$?

一个命令,函数或脚本自身的退出状态码(参考例子 23-7)

$$

脚本本身的进程PID。$$变量常被用于脚本中生成一个"唯一的"临时文件名(参考例子 A-13例子 29-6例子 12-28, 和例子 11-25). 这通常比调用mktemp还要简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值