我有一个可以在 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)进行测试。