shell脚本命令行参数传递问题

系统 1250 0

1.
 #-------------------------------------------------------------------------
 9 #  强烈注意,在赋值的前后一定不要有空格
10 # 如果有空格会发生什么?
11 
12 #  如果"VARIABLE =value",
13 #              ^
14 #+ 脚本将尝试运行一个"VARIABLE"的命令,带着一个"=value"参数.
15 
16 #  如果"VARIABLE= value",
17 #               ^
18 #+ script tries to run "value" command with
18 #+ 脚本将尝试运行一个"value"的命令,带着
19 #+ the environmental variable "VARIABLE" set to "".
19 #+ 一个被赋成""值的环境变量"VARIABLE".
20 #-------------------------------------------------------------------------

2.
################################Start Script#######################################
 1 #!/bin/bash
 2 #  "裸体"变量
 3 
 4 echo
 5 
 6 # 变量什么时候是"裸体"的,比如前边少了$的时候.
 7 # 当它被赋值的时候,而不是被引用的时候.
 8 
 9 # 赋值
10 a=879
11 echo "The value of /"a/" is $a."
12 
13 # 使用let赋值
14 let a=16+5
15 echo "The value of /"a/" is now $a."
16 
17 echo
18 
19 # 在for循环中
20 echo -n "Values of /"a/" in the loop are: "
21 for a in 7 8 9 11
22 do
23   echo -n "$a "
24 done
25 
26 echo
27 echo
28 
29 # 在read命令状态中
30 echo -n "Enter /"a/" "
31 read a
32 echo "The value of /"a/" is now $a."
33 
34 echo
35 
36 exit 0
################################End Script#########################################

3.位置参数
就是从命令行中传进来的参数,$0, $1, $2, $3...
$0就是脚本文件的名字,$1是第一个参数,$2为第2个...,参见[1](有$0的说明),$9
以后就需要打括号了,如${10},${11},${12}...

shift命令重新分配位置参数,其实就是向左移动一个位置.
$1 <--- $2, $2 <--- $3, $3 <--- $4, 等等.
老的$1将消失,但是$0(脚本名)是不会改变的.如果你使用了大量的位置参数,那么
shift命令允许你存取超过10个参数.虽然{}表示法也允许这样.

例:
#!/bin/sh 
# we have less than 3 arguments. Print the help text: 
if [ $# -lt 3 ] ; then 
cat < 
ren -- renames a number of files using sed regular expressions 
USAGE: ren 'regexp' 'replacement' files... 
EXAMPLE: rename all *.HTM files in *.html: 
ren 'HTM$' 'html' *.HTM 
HELP 
exit 0 
fi 
OLD="$1" 
NEW="$2" 
# The shift command removes one argument from the list of 
# command line arguments. 
shift 
shift 
# $* contains now all the files: 
for file in $*; do 
if [ -f "$file" ] ; then 
newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"` 
if [ -f "$newfile" ]; then 
echo "ERROR: $newfile exists already" 
else 
echo "renaming $file to $newfile ..." 
mv "$file" "$newfile" 
fi 
fi 
done 

讲解: 这是一个复杂一些的例子。让我们详细讨论一下。第一个if表达式判断输入命令行参数是否小于3个 (特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。 如果输入参数等于或大于3个,我们就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用 shift命令将第一个和第二个参数从 参数列表中删除,这样原来的第三个参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。 接着我 们判断该文件是否存在,如果存在则通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了我们的目 的:得到了旧文件名和新文件名。然后使用mv命令进行重命名。

4.
通常用 " [ ] "   来表示条件测试。 注意这里的空格很重要。 要确保方括号的空格。  
[ -f "somefile" ] 
判断是否是一个文件  
[ -x "/bin/ls" ]  :
判断/ bin /ls 是否存在并有可执行权限  
[ -n "$var" ]  :
判断$var 变量是否有值
[ -e "somefile" ]:判断文件是否存在
[ -d "somefile" ]:判断是否为文件夹
[ -r "somefile" ]:判断文件是否可读
[ -w "somefile" ] :判断文件是否可写
[ -x "somefile" ]:判断文件是否可执行

[ "$a" = "$b" ]  :
判断$a 和$a 是否相等  

5. 双引号、单引号和反引号(后置引用)
双引号: 阻止了所有在引号中的特殊字符的重新解释--包括变量名--但是$,`(后置引用)和/除外.保留$,作为特殊字符的意义,是为了能够在双引号中也能够正常地引用变量("$var")。
使用""来防止单词分割.[4]如果在参数列表中使用双引号,将使得双引号中的参数作为一个参数.即使双引号中的字符串包含多个单词(也就是包含空白部分),也不会变为多个参数。

单引号:
单引号操作总体上和""很像,但不允许引用变量.因为$的特殊含义被关闭了.在''中除了',其他
字符都没有特殊的含义了.所以单引号比双引号严格. 因为即使是/,在''中都被关闭了,所以你想在''中显示'的含义,将得不到预期的效果.

反引号(后置引用): 命令替换将会重新分配一个命令甚至是多个命令的输出;:它会将命令的输出如实地添加到另一个上下文中。使用命令替换的典型形式是使用后置引用(`...`). 后置引用形式的命令(就是被反引号括起来)将会产生命令行文本。
使用后置引用的意义在于:命令的输出可以被当成传递到另一个命令的参数, 或者保存到变量中, 甚至可以用来产生for 循环的参数列表.

例如:
#!/bin/sh
file abc.zip    # 执行并输出,但无法将其命令行输出赋值给一个变量
file_type=`file abc.zip`  # 可执行并把其输出赋值给变量file_type

shell脚本命令行参数传递问题


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论