页面“Shell too many arguments”与“Shell 多行注释详解”之间的差异

来自linux中国网wiki
(页面间的差异)
跳到导航 跳到搜索
(导入1个版本)
 
docker>Evan
 
第1行: 第1行:
=too many arguments=
+
在我们写 shell 脚本的时候,特别在调试的时候经常需要注释多行命令,但在每一行前输入 # ,显得有些麻烦。
 +
 
 +
基于 shell 命令的灵活性,我们可以使用下面的方法:
 +
 
 +
=方法一(这是比较稳妥的作法):可以采用 HERE DOCUMENT 特性,实现多行注释=
 
<pre>
 
<pre>
Question:
+
<<'COMMENT'
+ webcode='[Errno 111] Connection refused'
+
...
+ '[' '[Errno' '111]' Connection refused -eq 200 ']'
+
 
/data/update/sh/readup.sh: line 27: [: too many arguments
+
COMMENT
  
Solve Solutions:
+
举例如下:
if [ $webcode -eq 200 ] 变为
 
  
webcode=` /data/mon/monitor_http.py http://47.106.6.9:80/xtwlztdj_read_interface/cmd/version`
+
#!/bin/bash
if [ "$webcode" -eq "200" ]
+
echo "Say Something"
then
+
<<COMMENT
echo "read is sucess"
+
    your comment 1
fi
+
    comment 2
 +
    blah
 +
COMMENT
 +
echo "Do something else"</pre>
  
Cause:
+
=方法二 ,直接采用 : =
养成将所有字符串自变量用双引号括起的习惯,将除去很多类似的编程错误。
+
<pre>这个命令的特殊作用,但这种做法有很多局限性,而且会影响性能,下面会介绍它的原理及性能分析。
  
如果环境变量没放在双引号中,那么bash 认为条件中的自变量过多。
+
如下是最简单的使用方法:
  
可以用双引号将字符串自变量括起来消除该问题。
+
: '
 +
COMMENT1
 +
COMMENT2
 +
'
 +
 
 +
即 : + 空格 + 单引号。
 +
 
 +
解释如下:
 +
 
 +
首先要知道 : 在 shell 中的特殊作用,它是内置的命令,先看一下它的帮助说明:
 +
 
 +
$ help :
 +
:: :
 +
Null command.
 +
No effect; the command does nothing.
 +
Exit Status:
 +
Always succeeds.
 +
 
 +
即,: 它也是一个命令,既然是命令就会可以给它传参数,但因它会过滤掉这些参数,而单引号括起来的是普通的代码部分表示字符串,所以我们刚好可将来用来代表注释,表示在 : 后的 单引号括起来的部分在程序执行的时候忽略。
 +
 
 +
另外如果不好理解,直接把它当作汇编中的 NOP, python 中的 pass ,它只是一个占位,每次返回都是真,即 $? 的话,结果会是 0 。
 +
 
 +
如此一来,此方法是不是很绝妙? 但事实上里面潜藏着很多问题:
 +
 
 +
它不会注释 shell 脚本中本身带有单引号的语句部分,除非你将程序中的单引号全部换成又引号,这样不爽。
 +
还是就是,虽然 : 会忽视后面的参数,但其实参数部分还是可能会被执行些操作,比如替换操作,文件截取操作等。所以这样会影响到代码的执行效率。
 +
例如:
 +
: > file 会截取 file 。
 +
: $(dangerous command) 这个替换操作照样会执行。
 +
所以第二种方法,只能临时用用。</pre>
 +
 
 +
=第三种方法,即:采用 : + << 'COMMENT' 的方式=
 +
<pre>
 +
#!/bin/bash
 +
echo "Say Something"
 +
: <<'COMMENT'
 +
    your comment 1
 +
    comment 2
 +
    blah
 +
COMMENT
 +
echo "Do something else"
  
看来是要养成将所有字符串自变量用双引号括起的习惯,将除去很多类似的编程错误。
+
注意:要加上单引号部分,有时候虽然不加不会有什么问题,但还是要加,以防出现莫名其妙的意外发生,比如发生字符扩展,命令替换等。
</pre>
 
  
=see also=
+
但最保险的方法还是每行前加上 #</pre>
[https://blog.csdn.net/wang_cir/article/details/6120101 关于Shell 脚本中的"[: too many arguments"错误]
 
  
[[category:shell]]
+
[[category:ops]]  [[category:shell]]

2018年8月24日 (五) 10:02的版本

在我们写 shell 脚本的时候,特别在调试的时候经常需要注释多行命令,但在每一行前输入 # ,显得有些麻烦。

基于 shell 命令的灵活性,我们可以使用下面的方法:

方法一(这是比较稳妥的作法):可以采用 HERE DOCUMENT 特性,实现多行注释

<<'COMMENT'
...

COMMENT

举例如下:

#!/bin/bash
echo "Say Something"
<<COMMENT
    your comment 1
    comment 2
    blah
COMMENT
echo "Do something else"

方法二 ,直接采用 :

这个命令的特殊作用,但这种做法有很多局限性,而且会影响性能,下面会介绍它的原理及性能分析。

如下是最简单的使用方法:

: '
COMMENT1
COMMENT2
'

即 : + 空格 + 单引号。

解释如下:

首先要知道 : 在 shell 中的特殊作用,它是内置的命令,先看一下它的帮助说明:

$ help : 
:: : 
Null command. 
No effect; the command does nothing. 
Exit Status: 
Always succeeds.

即,: 它也是一个命令,既然是命令就会可以给它传参数,但因它会过滤掉这些参数,而单引号括起来的是普通的代码部分表示字符串,所以我们刚好可将来用来代表注释,表示在 : 后的 单引号括起来的部分在程序执行的时候忽略。

另外如果不好理解,直接把它当作汇编中的 NOP, python 中的 pass ,它只是一个占位,每次返回都是真,即 $? 的话,结果会是 0 。

如此一来,此方法是不是很绝妙? 但事实上里面潜藏着很多问题:

它不会注释 shell 脚本中本身带有单引号的语句部分,除非你将程序中的单引号全部换成又引号,这样不爽。
还是就是,虽然 : 会忽视后面的参数,但其实参数部分还是可能会被执行些操作,比如替换操作,文件截取操作等。所以这样会影响到代码的执行效率。 
例如: 
: > file 会截取 file 。 
: $(dangerous command) 这个替换操作照样会执行。
所以第二种方法,只能临时用用。

第三种方法,即:采用 : + << 'COMMENT' 的方式

#!/bin/bash
echo "Say Something"
: <<'COMMENT'
    your comment 1
    comment 2
    blah
COMMENT
echo "Do something else"

注意:要加上单引号部分,有时候虽然不加不会有什么问题,但还是要加,以防出现莫名其妙的意外发生,比如发生字符扩展,命令替换等。

但最保险的方法还是每行前加上 #