使用点分隔符拆分unix shell脚本中的变量

使用点分隔符拆分unix shell脚本中的变量,shell,unix,Shell,Unix,我在试着跟随 echo $FCMAN |cut -d'.' -f1 | read FCMAN1 echo $FCMAN |cut -d'.' -f2 | read FCMAN2 echo $FCMAN |cut -d'.' -f3 | read FCMAN3 echo $FCMAN |cut -d'.' -f4 | read FCMAN4 $FCMAN的值如下所示 QLogic Corp. QLogic Corp. QLogic Corp. QLogic Corp. 我预计结果会有以下四个变

我在试着跟随

echo $FCMAN |cut -d'.' -f1 | read FCMAN1
echo $FCMAN |cut -d'.' -f2 | read FCMAN2
echo $FCMAN |cut -d'.' -f3 | read FCMAN3
echo $FCMAN |cut -d'.' -f4 | read FCMAN4
$FCMAN
的值如下所示

QLogic Corp. QLogic Corp. QLogic Corp. QLogic Corp.
我预计结果会有以下四个变量

$FCMAN1 = QLogic Corp.
$FCMAN2 = QLogic Corp.
$FCMAN3 = QLogic Corp.
$FCMAN4 = QLogic Corp.

有人能帮我一下吗?

我想用数组代替。
mapfile
bash内置将行读入数组:

FCMAN=“QLogic公司QLogic公司QLogic公司QLogic公司QLogic公司。”

mapfile-t fcmen<您说您的脚本应该在所有类型的Unix上运行;那么,您希望在任何地方都可以使用什么shell(或其他工具)?即使您使用
sh
(Bourne Shell),情况也会有所不同:在Linux上,
sh
只是调用
bash
,尽管应该具有向上兼容性,但并非每个Bourne Shell脚本在bash下执行时都会产生相同的结果,如图所示

对于Korn Shell,差异甚至更大——不同的实现,一个实现行的不同版本。某些设置甚至可能没有在/usr/bin中安装Korn Shell

如果您对原始代码的结果感到满意,可以通过使用循环使其更加优雅:

for n in 1 2 3 4
do
    echo $FCMAN|cut -d'.' -f$n|read FCMAN$n
done

另一种可能是使用
Perl
。虽然不一定是每个Unix安装的一部分,但我还没有看到一个不安装Perl的安装。尽管您有许多不同的Perl版本,但它肯定是5.xx版本,而且您的案例非常简单,可以用任何Perl版本编写它

您希望每个
周围的空格发生什么变化?你用的是哪个外壳?也许你可以考虑一个数组而不是这些编号的变量。对这些变量的操作进行一些解释也很有用。我正在从一个中央管理系统收集光纤通道适配器信息,如(制造商、型号等),该系统可以在所有类型的服务器上远程运行脚本。无论适配器的数量如何,I ma使用的命令都会在一行中给出结果。我们拥有的适配器的最大数量是4个。稍后,我想将这些信息提供给DB,这就是我需要拆分它们的原因。脚本将在Solaris(x86或SPARC)、LINUX或HPUX上执行,因此可以使用不同的shell。希望这能解释。这会丢失
,并且不清楚OP是否在使用bash。该脚本将在所有类型的UNIX(Solaris、HPUX和LINUX)上运行,因此我不想依赖仅适用于bash的东西。@rora:有没有没有没有没有bash的操作系统?如果你不想依赖新的bash版本的特性,我可以理解,但即使是bash版本3现在也已经有10多年的历史了……我的意思是korn shell,或者可能是一些操作系统使用了其他东西。如果没有bash的操作系统,那么为什么人们会问这个问题呢?i、 e“不清楚OP是否在使用bash”问题是我的原始代码没有结果,因此使用循环对我也没有帮助。但是将FCMAN设置为您发布的字符串将得到所需的结果。与您的原始代码相同。FCMAN中有velue“QLogic Corp.QLogic Corp.QLogic Corp.QLogic Corp.QLogic Corp.”,但FCMAN1/2/3/4是空的。使用哪个shell?我不是说您应该使用“which”命令,这两个信息都没有说明您实际使用了哪个shell来运行shell。既然您正在编写脚本,那么您肯定应该知道您使用的是什么shell语言。您可以通过在命令行上显式地声明一个shell来调用脚本,或者使用一个shee-bang行来命名shell。