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

时间:2016-01-26 13:55:35

标签: 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.

我希望结果会有四个变量。

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

有人能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

我改用阵列。 mapfile bash builtin将行读入数组:

FCMAN="QLogic Corp. QLogic Corp. QLogic Corp. QLogic Corp."
mapfile -t fcmen < <( tr . '\n' <<<"$FCMAN")
declare -p fcmen
# ==> declare -a fcmen='([0]="QLogic Corp" [1]=" QLogic Corp" [2]=" QLogic Corp" [3]=" QLogic Corp" [4]="")'

答案 1 :(得分:0)

你说你的脚本应该在所有类型的Unix上运行;那么,您期望在哪里使用哪种外壳(或其他工具)?即使你指望sh(Bourne Shell),它也会有所不同:在Linux上,sh只是调用bash,虽然应该是向上兼容,但不是每个Bourne shell脚本在bash下执行时产生相同的结果,如this article所示。

使用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版本。