我想循环遍历文件中 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.
要循环
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
说明:
foreach
循环使用反引号命令替换迭代grep 'good' fridge
输出的行。echo
语句打印该行以及提取的水果和状态值。cut
命令用于在空格上分割行并提取第一个和第二个字段,使用fruit
命令将其分别分配给status
和set
变量。status
为“good”,则脚本使用 ${fruit}_dir
切换到相应的 pushd
目录,执行所需操作(示例中已注释掉),然后使用 popd
返回到原始目录。 >& /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
中设置变量。