如何在bash中将字符串拆分为两个变量?

如何在bash中将字符串拆分为两个变量?,bash,shell,scripting,Bash,Shell,Scripting,我有一个字符串,它是以“firstname lastname”格式从文件中读入的。我想将该字符串拆分为两个单独的变量$first和$last。最简单的方法是什么?read可以自己进行拆分,例如 $first=`echo $line | sed -e 's/([^ ])+([^ ])+/\1/'` $last=`echo $line | sed -e 's/([^ ])+([^ ])+/\2/'` read first last < name.txt echo "$first" ech

我有一个字符串,它是以“firstname lastname”格式从文件中读入的。我想将该字符串拆分为两个单独的变量
$first
$last
。最简单的方法是什么?

read可以自己进行拆分,例如

$first=`echo $line | sed -e 's/([^ ])+([^ ])+/\1/'`
$last=`echo $line | sed -e 's/([^ ])+([^ ])+/\2/'`
read  first last < name.txt

echo "$first"
echo "$last"
readfirst last
cut可以将字符串拆分为由所选字符分隔的部分:

first=$(echo $str | cut -d " " -f 1)
last=$(echo $str | cut -d " " -f 2)

这可能不是最优雅的方式,但肯定很简单。

根据fgm的答案展开,每当您有一个字符串,其中包含由单个字符分隔的令牌,这些字符不是任何令牌的一部分,并且以换行符结尾时,您可以使用内部字段分隔符(
IFS
)然后
读取
将其拆分。一些例子:

echo 'John Doe' > name.txt
IFS=' ' read first last < name.txt
echo "$first"
John
echo "$last"
Doe

echo '+12 (0)12-345-678' > number.txt
IFS=' -()' read -a numbers < number.txt
for num in "${numbers[@]}"
do
    echo $num
done
+12
0
12
345
678
或者,如果文本存储在变量中,则可以重定向:

name='John Doe'
read first last <<< "$name"
echo $first
John
echo $last
Doe
name='John Doe'

先读后读,或者如果变量中已经有它们,
set-$variable;第一个=1美元;last=$2
hmm。。。看起来我需要重新阅读我的unix工具书,它确实不起作用,我只是写了我记忆中的东西。很抱歉
name='John Doe'
read first last <<< "$name"
echo $first
John
echo $last
Doe