将“awk”或“nawk”分配给shell脚本中的变量

将“awk”或“nawk”分配给shell脚本中的变量

我有一个可以在 Solaris 和 Red Hat 系统上运行的脚本。我想在 Solaris 中使用“nawk”,在 Red Hat 系统中使用“awk”作为文本处理工具。为此,我的脚本中有如下代码片段:

...
if [ "$SYSTEM_OS" = "SunOS" ]; then
cibi_seperator="nawk"
elif [ "$SYSTEM_OS" = "Linux"  ]; then
cibi_seperator="awk"
fi
...

当我运行脚本时,出现以下错误:

    bash-3.00$ ./cibi_awk_both_os.sh 
./cibi_awk_both_os.sh: line 75: -F,: command not found
./cibi_awk_both_os.sh: line 77: -F: command not found
./cibi_awk_both_os.sh: line 77: -F=: command not found
./cibi_awk_both_os.sh: line 77: -v: command not found
./cibi_awk_both_os.sh: line 79: -F,: command not found
./cibi_awk_both_os.sh: line 85: -F,: command not found
./cibi_awk_both_os.sh: line 107: -F,: command not found
./cibi_awk_both_os.sh: line 108: -F,: command not found

脚本第75行:

$cibi_seperator -F, 'NR==1,NR==2{print $0;}' cibi.csv > section_header.csv

所有其他有问题的行(77、79、85、107、108)也使用变量 $cibi_seperator。如何在我的脚本中正确使用这个变量?谢谢,穆拉特

答案1

发现问题:我设置参数:

SYSTEM_OS=`uname -a`

在 if 语句之前。然而,我应该将其设置为:

SYSTEM_OS=`uname -s`

带来不便敬请谅解。

答案2

case "$SYSTEM_OS" in
(SunOS)
    cibi_separator=nawk;;
(Linux)
    cibi_separator=awk;;
(*)
    echo "[$SYSTEM_OS] unsupported"; exit 1;;
esac

...

$cibi_separator -F, 'NR==1,NR==2{print $0;}' cibi.csv > section_header.csv

答案3

我会用

cibi_seperator="awk" # general case, use plain awk

if [ "$SYSTEM_OS" = "SunOS" ]; then
cibi_seperator="nawk"
elif [ "$SYSTEM_OS" = "fooOS"  ]; then
cibi_seperator="/bin/special/awk"
elif ...
fi

这样,cibi_seperator 始终被设置,仅对需要特殊 awk 的操作系统(如Solaris)进行测试。

相关内容