当我想执行此脚本时,执行被切断命令阻止,并显示了man cut
脚本代码
#!/bin/bash
for i in `cat newcontext` ;do
var1=`cut –f1 –d" " $i`
var2=`cut –f2 –d" " $i`
if [ $var2 = false ];then
for j in `cat adaptrules`;do
c=`cut -f1 -d" " $j`
cc=`cut -f2 -d" " $j`
if [ $c = $var1 ];then
r=$cc
fi
done
sed /$var1/d currentconfig>>newconfig
else
for k in `cat adaptrules`;do
var3=`cut –f1 –d" " $k`
var4=`cut –f2 –d" " $k`
if [ $var3 = $var1 ];then
action=$var4
fi
done
cat $action >> newconfig
fi
done
答案 0 :(得分:1)
很难知道您是否尝试从变量i
,j
和k
中命名的文件进行读取,或者您是否尝试解析newcontext
和adaptrules
。在任何一种情况下,您根本不应该使用cut
。如果您正在尝试后者,则可以执行以下操作:
#!/bin/bash
while read var1 var2 ; do
if test "$var2" = false; then
while read c cc ; do
if test "$c" = "$var1"; then
r=$cc
fi
done < adaptrules
<&- sed /$var1/d currentconfig>>newconfig #WTF: multiple iterations with only one line omitted?
else
while read var3 var4 ; do
if test "$var3" = "$var1"; then
action=$var4
fi
done < adaptrules
<&- cat $action >> newconfig # Does $action really name a file?
# I'm guessing this should be 'echo'
fi
done < newcontext
我发现问题中代码的格式化使其难以阅读,因此我不会花费大量时间来验证此逻辑是否与您的逻辑匹配。似乎变量r
完全未使用,sed
和cat
似乎不正确......但这会让您有所了解。
此外,将内部部分写为:
可能在风格上更清晰if test "$var2" = false; then
while read c cc; do
...
done
else
while read var3 var4; do
...
done
...
fi < adaptrules
请注意,您需要注意外部while循环中的所有命令都不会消耗stdin中的任何内容。 (因此<&-
关闭了sed
和cat
的文件描述符,这在这些情况下并不是绝对必要的,但演示了如何确保不会无意中将输入消耗到循环。)做以下事情可能更清晰:
while read -u 5 var1 var2; do
...
done 5< newcontext
答案 1 :(得分:0)
我的脚本使用上下文数据(newcontext),当前配置和调整规则生成新配置(newconfig)。
答案 2 :(得分:0)
您需要使用示例执行cut命令:
var1=$(cut -f1 -d " " <<< $i)
您正在尝试执行cut命令,就好像$ i包含实际包含文本的文件名一样。
答案 3 :(得分:0)
我的脚本旨在生成新配置(newconfig)。此配置是使用上下文数据(新上下文),自适应规则(自适应)和当前配置(currentconfig)生成的。该脚本的工作原理如下:对于每个contextdata(newcontext中的字段var1),我们寻找它的动作(自适应中的字段cc)。然后我们验证当前配置中是否存在此操作。然后,如果所选的contextdata的操作存在于currentconfig中且contextdata的字段var2等于false,则如果currentconfig中没有该操作且contextdata的var2等于,则从currentconfig中删除该操作。是的,因此将操作添加到currentconfig。我修改了我的脚本,但它生成了一个错误&#34; sed,命令c期望后跟文本&#34;。
新代码如下
#!/bin/bash
while read var1 var2 ;do
while read c cc;do
if test "$c" = "$var1" ;then
r=$cc
fi
done <adaptrules
exist=false
while read var; do
if test "$var" = "$r";then
exist=true
fi
done < currentconfig
if test "$var2" = false && test "$exist" = true; then
sed -i "/$r/d" currentconfig
fi
if test "$var2" = true && test "$exist" = false; then
echo "$r">> currentconfig
fi
done < newcontext
谢谢