【问题标题】:Unix Shell Script Syntax for if and grep and -gtif 和 grep 和 -gt 的 Unix Shell 脚本语法
【发布时间】:2012-06-30 11:51:55
【问题描述】:

我正在使用下面的代码来复制文件。我在 if 语句中遇到错误..请帮助... $1 是一个数字,将在 $j 这是一个文件中搜索...如果有一些记录,我想复制该文件,否则什么都不会做...

for j in $2/$file_z
do
 if ``grep $1 $j | wc -l` -gt 0`
 then
  echo $j
  cp $j $3
 fi
done

【问题讨论】:

  • 以后请务必包含实际的错误信息;这次 Igor 做得很好 :) 但实际错误有时不太清楚。

标签: shell scripting if-statement grep


【解决方案1】:

您的脚本中有两个错误:

  • 不允许嵌套backticks
  • $2/$file_z 而不是 $(<$2/$file_z)

固定:

for j in `<$2/$file_z`
do
 if grep -q "$1" "$j" > /dev/null
 # if grep "$1" "$j" > /dev/null # if your grep does not support -q
 then
  echo $j
  cp $j $3
 fi
done

更优化:

for j in `<$2/$file_z`
do
 grep -l "$1" "$j" /dev/null && cp $j $3
done

grep本身可以打印文件名。

同样你也可以不用for:

cp -v $(grep -l "$1" `<$2/$file_z`) $3

该命令与您的整个脚本相同。

【讨论】:

  • 忘记后缀,已弃用,取而代之的是 $( ) 形式。正如你所说,反引号不支持嵌套元素。
  • 感谢伊戈尔,但它给了我以下错误。 grep:非法选项--q 用法:grep -hblcnsviw 模式文件。 . .
  • 如果 $j(path/file) 中存在 $1(数字参数),我想复制该文件,但您的语句将评估其中是否有记录?
  • @Dogar:当你的 grep 不支持 -q 时使用 grep ... &gt; /dev/null
  • 兄弟,它在我这边不起作用,说无法在&lt;$2/$file_z 中的 j 行打开文件??
【解决方案2】:
for j in $(<$2/$file_z); do
    echo "$1" | grep &>/dev/null "$j" && cp "$j" "$3"
done

这不是便携式的:

grep -q

这就是我改用grep &amp;&gt;/dev/null 的原因 =)

【讨论】:

  • 用法:grep -hblcnsviw 模式文件。 . . ./script.sh[14]: 87346346832: not found this iscoming now...
  • 谢谢 SPUTNICK...它现在对我有用...我会塑造它...谢谢...:-)
  • 原来grep -q 实际上是标准的:pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html 可以说它的便携性稍差,但它是标准的。另一方面,&amp;&gt; 作为重定向运算符不可移植,并且可能与标准冲突!
  • Dogar,当人们欣赏这里的回复时,他们会投票并接受问题;)这是 stackoverflow 表达感谢的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 2017-05-21
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多