liuxiaoyun111 发表于 2018-8-20 13:06:35

shell编程(二)

1)、使用set设置位置参数(同命令行脚本的传参)  
# set -- "I am" smart boy.
  
# echo $#
  
3
  
# echo $1
  
I am
  
# echo $2
  
smart
  
# echo $3
  
boy.
  
2)、测试$*和$@,没有带双引号
  
# echo $*
  
I am smart boy.
  
# echo $@
  
I am smart boy.
  
使用for循环输出所有参数:
  
# for i in $*;do echo $i;done
  
I
  
am
  
smart
  
boy.
  
# for i in $@;do echo $i;done
  
I
  
am
  
smart
  
boy.
  
3)、测试"$*" 和 "$@" ,注意使用了双引号
  
# echo "$*"
  
I am smart boy.
  
# echo "$@"
  
I am smart boy.
  
使用for输出所有参数:
  
# for i in "$*";do echo $i;done
  
I am smart boy.
  
# for i in "$@";do echo $i;done
  
I am
  
smart
  
boy.
  

  
小结:
  
回顾开头我们写的概念分析:
  
$*和$@不加引号,输出所有参数,在for语句中,如果有空格分隔的字符串,会拆分输出
  
$*和$@都加上引号,例"$*" "$@",此时区别:
  
    $* 会将所有参数,作为完整的字符串输出,如上所示
  
    $@ 会将所有参数,作为独立的单个字符输出,如果有空格分隔的字符串,不会拆分输出,作为独立的单个字符输出.
  

  
注释:
  
set 和eval命令的使用详解:
  
set可以同命令行一样,可以传参
  
eval命令:首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时被称为复杂变量
  
例如:
  
# A="cat t1.sh"
  
# echo $A
  
cat t1.sh
  
# eval $A#>==此时eval命令对变量进行置换,还执行了其中的命令
  
I am smart boy.
  

  
set与eval的使用,在编写脚本会用到的例子:
  
例1)、
  
# Number=$(set -- $(cat t4.sh); eval "echo \$$#")
  
注释:set 设置传入的参数,    eval进行两次扫描,$#:输出所有的位置参数总数,
  
         $$#:将总数,也就是最后一个位置参数的值,赋值给Number
  
# echo $Number
  
5
  
例2)、
  
# runlevel
  
N 5
  
# Runlevel=$(set -- $(runlevel);eval "echo \$$#")
  
# echo $Runlevel
  
5


页: [1]
查看完整版本: shell编程(二)