CSH 循环 grep 的结果没有给出期望的结果

问题描述 投票:0回答:1

我想循环遍历文件中 grep cmd 的输出。这些行遵循一种格式,其中将有一个与 grep 匹配/不匹配的单词,然后是其他程序必须处理的其他单词。期望有适当的子目录可用。

cat > fridge << BYE
 apple good
 banana bad
 cherry good
BYE

foreach ln (`grep good fridge`)
  echo "line is= ${ln}"
  set fruit= `echo ${ln} | cut -d' ' -f1`
  set status= `echo ${ln} | cut -d' ' -f2`
  echo "fruit= ${fruit} is ${status}"
  pushd ${fruit}_dir
  #<do something>
  popd
end

我首先希望看到打印出的行。 示例:line=苹果好

但我只看到苹果。这是错误#1

然后变量有错误。这是错误#2。

我期望以下输出

line= apple good
fruit= apple is good
Some stuff from do something with apple
line= cherry good
fruit= cherry is good
Some stuff from do something with cherry

但是它不起作用。

line is= apple
set: Variable name must begin with a letter.
loops grep csh
1个回答
0
投票

要循环

grep
输出的行并按照
csh
中所述处理它们,您可以使用带有反引号命令替换的
foreach
循环。以下是修改脚本的方法:

cat > fridge << BYE
apple good
banana bad
cherry good
BYE

foreach ln (`grep 'good' fridge`)
    echo "line is= $ln"
    set fruit = `echo "$ln" | cut -d' ' -f1`
    set status = `echo "$ln" | cut -d' ' -f2`
    echo "fruit= $fruit is $status"
    if ( "$status" == "good" ) then
        pushd "${fruit}_dir" >& /dev/null
        # <do something>
        popd >& /dev/null
    endif
end

说明:

  1. foreach
    循环使用反引号命令替换迭代
    grep 'good' fridge
    输出的行。
  2. 在循环内,
    echo
    语句打印该行以及提取的水果和状态值。
  3. cut
    命令用于在空格上分割行并提取第一个和第二个字段,使用
    fruit
    命令将其分别分配给
    status
    set
    变量。
  4. 如果
    status
    为“good”,则脚本使用
    ${fruit}_dir
    切换到相应的
    pushd
    目录,执行所需操作(示例中已注释掉),然后使用
    popd
    返回到原始目录。
  5. >& /dev/null
    pushd
    popd
    的任何输出重定向到
    /dev/null
    以抑制它。

这应该会给你预期的输出:

line is= apple good
fruit= apple is good
# Some stuff from do something with apple
line is= cherry good
fruit= cherry is good
# Some stuff from do something with cherry

注意:在

csh
中,变量名称必须以字母或下划线开头,这就是原始脚本抛出“变量名称必须以字母开头”错误的原因。修改后的脚本使用正确的语法在
csh
中设置变量。

© www.soinside.com 2019 - 2024. All rights reserved.