【转】Linux shll中的$符号 -- 读取命令行参数

原文链接

备忘

文件名test.sh


  1. USER=nihao
  2. echo “hello $USER”
  3. #$0 脚本名
  4. echo “script name is : basename $0
  5. #$1 第一个变量名
  6. echo “first param is : $1”
  7. #$* 所有变量
  8. echo “all params are : $*”
  9. #$# 变量长度
  10. echo “params’ length is : $# “
  11. #$@ 所有变量
  12. echo “all params are : ‘$@’”
  13. #$$ 当前脚本进程
  14. echo “process id of this script is : $$”
  15. #$? exit 退出状态
  16. echo “exit status is : $?”
  17. #$! 最后一个守护进程pid,last daemon process (&) process id
  18. echo “last daemon process id is : $!”


输出结果:


  • [admin@v035114 shuohai]$ ./test.sh a b c

  • hello nihao
  • script name is : test.sh
  • first param is : a
  • all params are : a b c
  • params’ length is : 3
  • all params are : ‘a b c’
  • process id of this script is : 10837
  • exit status is : 0
  • last daemon process id is :


  • 选择第一个参数、最后一个、倒数第二个、从第二个连续的几个参数


  • [admin@arch036088.sqa.cm4 ~]$ cat test.sh

  • #all params 全部参数
  • echo $@
  • #all params 全部参数
  • echo $*
  • #length of params 参数的长度
  • echo $#
  • #first param 第一个参数
  • echo $1
  • #last param 最后一个参数
  • echo ${@:${ #@} }
  • #last 2 param 最后两个参数
  • echo ${@:${ #@}-1}
  • #last 2nd param 倒数第二个参数
  • echo ${@:${ #@}-1:1}
  • #from 2nd to last param 从第二个到最后一个参数
  • echo ${@:2}
  • #from 2nd, count 2 从第2个参数开始,连续2个参数
  • echo ${@:2:2}


  • 输出结果


  • 12 23 43 3 34

  • 12 23 43 3 34
  • 5
  • 12
  • 34
  • 3 34
  • 3
  • 23 43 3 34
  • 23 43


  • 读取最后一个参数另一种方法 ${$# } 但是大括号中不能使用美元$符号,要用! 代替


  • [admin@v035114 shuohai]$ cat ./test.sh

  • echo ${!# }
  • [admin@v035114 shuohai]$ ./test.sh 12 34 4 5
  • 5


  • 遍历所有参数的另一种方法


  • [admin@v035114 shuohai]$ cat ./test.sh

  • INDEX=1
  • for param in $@
  • do
    5.6. echo $INDEX “–” $param
  • INDEX=$[ $INDEX+1 ]
  • done
    9.10. INDEX=1
  • for param in $*
  • do
  • echo $INDEX “–” $param
  • INDEX=$[ $INDEX+1 ]
  • done
  • [admin@v035114 shuohai]$ ./test.sh 12 34 4 5
  • 1 – 12
  • 2 – 34
  • 3 – 4
  • 4 – 5
  • 1 – 12
  • 2 – 34
  • 3 – 4
  • 4 – 5


  • 只打印第2个到第4个参数,一共5个参数


  • [admin@v035114 shuohai]$ cat param.sh

  • INDEX=1
  • for param in $@
  • do
  • if [ $INDEX -ge 2 ] && [ $INDEX -le 4 ]; then
  • echo $INDEX “–” $param
  • fi
  • INDEX=$[ $INDEX+1 ]
  • done
    10.11. [admin@v035114 shuohai]$ ./param.sh 12 34 4 5
  • 2 – 34
  • 3 – 4
  • 4 – 5


  • 访问第10个参数之后,不能直接使用$10访问了,要使用大括号


  • [admin@v035114 shuohai]$ cat test.sh

  • echo $*
  • echo $11 #错误的方式
  • echo $[ ${10} ]
  • echo $[ ${11} ]
  • [admin@v035114 shuohai]$ ./test.sh 12 34 4 5 5 6 7 8 9 10 11
  • 12 34 4 5 5 6 7 8 9 10 11
  • 121
  • 10
  • 11