我有一个shell脚本,它将文件读入数组。它与RHEL完美配合,但是当我在Ubuntu上运行相同的脚本时,我收到了一个错误。这是脚本。
file=/root/monitor.txt
while IFS=',' read -ra line ; do
echo -e "export MASTER_IP=${line[2]}" >> ~/.bashrc
source ~/.bashrc
done < $file
上述脚本在RHEL中完美运行。我在Ubuntu上运行时遇到的错误是
read: Illegal option -a
答案 0 :(得分:4)
read -a
是一种bash功能,但在Ubuntu上/bin/sh
指向dash
,它不支持-a
选项。有几种方法可以解决这个问题:
在Ubuntu上,只需在bash下运行脚本,将第一行更改为#!/bin/bash
(由Charles Duffy建议)
而不是read -a
,只需提供变量列表,例如read f1 f2 f3 f4 f5
,然后将字段引用为$f1
,$f2
等。例如,如果您有超过5个字段,则需要添加更多变量,否则$f5
将包含该行的其余部分。
使用awk
代替read
。 Awk非常适合这种字段处理任务:你可以用awk -F, '{print "export MASTER_IP=" $3}' $file >> ~/.bashrc
替换while循环,然后在结尾处替换源~/.bashrc
。
答案 1 :(得分:3)
while IFS=, read -r _ _ ip _; do
printf 'export MASTER_IP=%s\n' "$ip"
done <"$file" >>"$HOME/.bashrc"
这在某些方面更好:
/bin/sh
。但是,您可以做得更好 - 提高脚本的安全性 - 如果您将其shebang更改为#!/bin/bash
(或/usr/bin/env bash
,或者适用于您的平台):
#!/bin/bash
while IFS=, read -r _ _ ip _; do
printf 'export MASTER_IP=%q\n' "$ip"
done <"$file" >>"$HOME/.bashrc"
因为它使用%q
而不是%s
,所以它也会转义地址,因此它们不能包含$(rm -rf $HOME)
等恶意内容 - 您可能不希望将其注入你的~/.bashrc
。