本脚本是《Advanced Bash-Scripting Guide》第9章的一个示例,它的作用主要是说明$*和$@在使用上的差别和注意事项,并作出总结。

 
  
  1. #!/bin/bash 
  2.  
  3. # $*和$@仅在被双引号括起来时才有区别:  
  4. # 1、如果$*被双引号括起来,则参数列表整个变成单个字符串。 
  5. # 2、如果$@被双引号括起来,则参数列表中的每个参数均是一个单独的字符串。 
  6. # 3、无引号时,两者功效相同,均以空格进行分隔。 
  7.  
  8.  
  9. # IFC 即分隔符,默认为空格。 
  10. # 1、指定IFC,有引号内的$*或者变量与未指定IFC一样,整个参数列表依然是单个字符串。 
  11. # 2、指定IFC,无引号$*则在原参数基础上,对含有分隔符的参数进行分隔。 
  12.  
  13. set -- "First one" "second" "third:one" "" "Fifth: :one" 
  14. # 脚本文件内设置脚本参数的一种方式, 作用等同于 shellfile aa bb cc。 
  15. # 以上面方式设置参数后,则脚本名后带的参数无效,即aa bb cc无效。 
  16.  
  17. echo 
  18.  
  19. echo 'IFS unchanged, using "$*"' 
  20. c=0 
  21. for i in "$*"               # 双引号 
  22.     do echo "$((c+=1)): [$i]"    
  23. done 
  24. echo -------------------- 
  25. # 输出结果如下: 
  26. # 1: [First one second third:one  Fifth: :one] 
  27.  
  28.  
  29. echo 'IFS unchanged, using $*' 
  30. c=0 
  31. for i in $*                 # 无双引号,默认以空格分隔 
  32.     do echo "$((c+=1)): [$i]" 
  33. done 
  34. echo -------------------- 
  35. "First one" "second" "third:one" "" "Fifth: :one" 
  36. # 输出结果如下: 
  37. # 1: [First
  38. # 2: [one] 
  39. # 3: [second
  40. # 4: [third:one] 
  41. # 5: [Fifth:] 
  42. # 6: [:one] 
  43.  
  44. echo 'IFS unchanged, using "$@"' 
  45. c=0 
  46. for i in "$@"               # 有双引号,原引号内的内容作为一个元素 
  47. do echo "$((c+=1)): [$i]" 
  48. done 
  49. echo -------------------- 
  50. "First one" "second" "third:one" "" "Fifth: :one" 
  51. # 输出结果如下: 
  52. # 1: [First one] 
  53. # 2: [second
  54. # 3: [third:one] 
  55. # 4: [] 
  56. # 5: [Fifth: :one] 
  57.  
  58.  
  59. echo 'IFS unchanged, using $@' 
  60. c=0 
  61. for i in $@                 # 输出内容与$*相同 
  62. do echo "$((c+=1)): [$i]" 
  63. done 
  64. echo -------------------- 
  65. "First one" "second" "third:one" "" "Fifth: :one" 
  66. # 输出结果如下: 
  67. # 1: [First
  68. # 2: [one] 
  69. # 3: [second
  70. # 4: [third:one] 
  71. # 5: [Fifth:] 
  72. # 6: [:one] 
  73.  
  74.  
  75. # 指定分隔符对双引号内的$*或者其变量无效 
  76. IFS=: 
  77. echo 'IFS=":", using "$*"' 
  78. c=0 
  79. for i in "$*" 
  80.     do echo "$((c+=1)): [$i]" 
  81. done 
  82. echo -------------------- 
  83. "First one" "second" "third:one" "" "Fifth: :one" 
  84. # 输出结果如下: 
  85. # 1: [First one:second:third:one::Fifth: :one] 
  86.  
  87.  
  88. # 指定IFC,无引号$*则在原参数基础上,对含有分隔符的参数进行分隔 
  89. echo 'IFS=":", using $*' 
  90. c=0 
  91. for i in $* 
  92.     do echo "$((c+=1)): [$i]" 
  93. done 
  94. echo -------------------- 
  95. "First one" "second" "third:one" "" "Fifth: :one" 
  96. # 输出结果如下: 
  97. # 1: [First one] 
  98. # 2: [second
  99. # 3: [third] 
  100. # 4: [one] 
  101. # 5: [] 
  102. # 6: [Fifth] 
  103. # 7: [ ] 
  104. # 8: [one] 
  105.  
  106. # 指定分隔符对双引号内的$*或者其变量无效 
  107. var=$* 
  108. echo 'IFS=":", using "$var" (var=$*)' 
  109. c=0 
  110. for i in "$var" # 跟直接“$*”输出相同 
  111.     do echo "$((c+=1)): [$i]" 
  112. done 
  113. echo -------------------- 
  114. "First one" "second" "third:one" "" "Fifth: :one" 
  115. # 输出结果如下: 
  116. # 1: [First one:second:third:one::Fifth: :one] 
  117.  
  118. echo 'IFS=":", using $var (var=$*)' 
  119. c=0 
  120. for i in $var   # 跟直接$*输出相同 
  121.     do echo "$((c+=1)): [$i]" 
  122. done 
  123. echo -------------------- 
  124. "First one" "second" "third:one" "" "Fifth: :one" 
  125. # 输出结果如下: 
  126. # 1: [First one] 
  127. # 2: [second
  128. # 3: [third] 
  129. # 4: [one] 
  130. # 5: [] 
  131. # 6: [Fifth] 
  132. # 7: [ ] 
  133. # 8: [one] 
  134.  
  135.  
  136. var="$*" 
  137. echo 'IFS=":", using $var (var="$*")' 
  138. c=0 
  139. for i in $var 
  140.     do echo "$((c+=1)): [$i]" 
  141. done 
  142. echo -------------------- 
  143. "First one" "second" "third:one" "" "Fifth: :one" 
  144. # 输出结果如下: 
  145. # 1: [First one] 
  146. # 2: [second
  147. # 3: [third] 
  148. # 4: [one] 
  149. # 5: [] 
  150. # 6: [Fifth] 
  151. # 7: [ ] 
  152. # 8: [one] 
  153.  
  154.  
  155. echo 'IFS=":", using "$var" (var="$*")' 
  156. c=0 
  157. for i in "$var" 
  158.     do echo "$((c+=1)): [$i]" 
  159. done 
  160. echo -------------------- 
  161. "First one" "second" "third:one" "" "Fifth: :one" 
  162. # 输出结果如下: 
  163. # 1: [First one:second:third:one::Fifth: :one] 
  164.  
  165. echo 'IFS=":", using "$@"' 
  166. c=0 
  167. for i in "$@" 
  168.     do echo "$((c+=1)): [$i]" 
  169. done 
  170. echo -------------------- 
  171. "First one" "second" "third:one" "" "Fifth: :one" 
  172. # 输出结果如下: 
  173. # 1: [First one] 
  174. # 2: [second
  175. # 3: [third:one] 
  176. # 4: [] 
  177. # 5: [Fifth: :one] 
  178.  
  179.  
  180. echo 'IFS=":", using $@' 
  181. c=0 
  182. for i in $@ 
  183.     do echo "$((c+=1)): [$i]" 
  184. done 
  185. echo -------------------- 
  186. "First one" "second" "third:one" "" "Fifth: :one" 
  187. # 输出结果如下: 
  188. # 1: [First one] 
  189. # 2: [second
  190. # 3: [third] 
  191. # 4: [one] 
  192. # 5: [] 
  193. # 6: [Fifth] 
  194. # 7: [ ] 
  195. # 8: [one] 
  196.  
  197. var=$@ 
  198. echo 'IFS=":", using $var (var=$@)' 
  199. c=0 
  200. for i in $var 
  201.     do echo "$((c+=1)): [$i]" 
  202. done 
  203. echo -------------------- 
  204. "First one" "second" "third:one" "" "Fifth: :one" 
  205. # 输出结果如下: 
  206. # 1: [First one second third one  Fifth   one] 
  207.  
  208. echo 'IFS=":", using "$var" (var=$@)' 
  209. c=0 
  210. for i in "$var" 
  211.     do echo "$((c+=1)): [$i]" 
  212. done 
  213. echo -------------------- 
  214. "First one" "second" "third:one" "" "Fifth: :one" 
  215. # 输出结果如下: 
  216. # 1: [First one second third one  Fifth   one] 
  217.  
  218. var="$@" 
  219. echo 'IFS=":", using "$var" (var="$@")' 
  220. c=0 
  221. for i in "$var" 
  222.     do echo "$((c+=1)): [$i]" 
  223. done 
  224. echo -------------------- 
  225. "First one" "second" "third:one" "" "Fifth: :one" 
  226. # 输出结果如下: 
  227. # 1: [First one second third:one  Fifth: :one] 
  228.  
  229. echo 'IFS=":", using $var (var="$@")' 
  230. c=0 
  231. for i in $var 
  232.     do echo "$((c+=1)): [$i]" 
  233. done 
  234. "First one" "second" "third:one" "" "Fifth: :one" 
  235. # 输出结果如下: 
  236. # 1: [First one second third] 
  237. # 2: [one  Fifth] 
  238. # 3: [ ] 
  239. # 4: [one] 
  240.  
  241. echo 
  242. exit 0 
  243.  
  244. # This example script by Stephane Chazelas, 
  245. and slightly modified by the document author.