剪切脚本命令错误 shell
erreur commande cut script shell
当我想执行这个脚本时,执行在 cut 命令处被阻止并且显示了 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
the content of text files
我的脚本使用上下文数据 (newcontext)、当前配置和适配规则生成新配置 (newconfig)。
您需要使用示例执行剪切命令:
var1=$(cut -f1 -d " " <<< $i)
您正在尝试执行剪切命令,就好像 $i 包含一个文件名,而实际上它包含文本。
很难知道您是否正在尝试从变量 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 循环中的 none 命令会消耗标准输入中的任何内容。 (因此 <&-
关闭了 sed
和 cat
的文件描述符,这在这些情况下并不是绝对必要的,但演示了如何确保您不会无意中从输入中消耗到循环。)做这样的事情可能更干净:
while read -u 5 var1 var2; do
...
done 5< newcontext
我的脚本旨在生成新配置 (newconfig)。此配置是使用上下文数据(新上下文)、适应规则(adaptrules)和当前配置(currentconfig)生成的。该脚本的工作方式如下:对于每个上下文数据(newcontext 中的字段 var1),我们寻找它的操作(adaptrules 中的字段 cc)。然后我们验证当前配置中是否存在此操作。然后,如果当前配置中存在所选上下文数据的操作,并且上下文数据的字段 var2 等于 false,则从当前配置中删除该操作;否则,如果当前配置中不存在该操作,并且上下文数据的 var2 等于true,因此该操作已添加到当前配置中。我修改了我的脚本,但它生成了一个错误 "sed, command c expects followed by text"。
新代码如下
#!/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
谢谢
当我想执行这个脚本时,执行在 cut 命令处被阻止并且显示了 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
the content of text files
我的脚本使用上下文数据 (newcontext)、当前配置和适配规则生成新配置 (newconfig)。
您需要使用示例执行剪切命令:
var1=$(cut -f1 -d " " <<< $i)
您正在尝试执行剪切命令,就好像 $i 包含一个文件名,而实际上它包含文本。
很难知道您是否正在尝试从变量 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 循环中的 none 命令会消耗标准输入中的任何内容。 (因此 <&-
关闭了 sed
和 cat
的文件描述符,这在这些情况下并不是绝对必要的,但演示了如何确保您不会无意中从输入中消耗到循环。)做这样的事情可能更干净:
while read -u 5 var1 var2; do
...
done 5< newcontext
我的脚本旨在生成新配置 (newconfig)。此配置是使用上下文数据(新上下文)、适应规则(adaptrules)和当前配置(currentconfig)生成的。该脚本的工作方式如下:对于每个上下文数据(newcontext 中的字段 var1),我们寻找它的操作(adaptrules 中的字段 cc)。然后我们验证当前配置中是否存在此操作。然后,如果当前配置中存在所选上下文数据的操作,并且上下文数据的字段 var2 等于 false,则从当前配置中删除该操作;否则,如果当前配置中不存在该操作,并且上下文数据的 var2 等于true,因此该操作已添加到当前配置中。我修改了我的脚本,但它生成了一个错误 "sed, command c expects followed by text"。
新代码如下
#!/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
谢谢