我正在尝试创建一个与 #!/bin/sh 兼容的 string_split 函数,该函数具有与 read 命令类似的命令语法,以便您可以传入要拆分的字符串以及要分配给字符串的变量。
这是我想出的函数,但我不知道如何像读取命令那样使新值在函数外部可用。
#!/bin/sh
split_str() {
input_original=$1
input=$1
input_delimiter=$2
input=$(echo "$input" | sed -e "s/$input_delimiter/ /g")
set -- "$input_original" "$input_delimiter" $input
}
所需的命令使用如下形式:
split_str "Hello World" " " word1 word2
echo "$word1"
# Output: Hello
echo "$word2"
# Output: World
解决方案
使用下面的 bac0ns 答案,我能够得到这个解决方案,它可以与传递的任意数量的输出参数一起使用。谢谢你的帮助@bac0n
#!/bin/sh
split_str() {
input=$1
input_delimiter=$2
# Isolate the output parameters
output_params=$(echo "${@}" | sed -e "s/$input $input_delimiter//g")
# Add an extra variable argument to catch any overflow.
# This prevents any extra parts of the sub string from being added to the
# passed parameters.
output_params="$output_params overflow"
# Split the string by reading the values in with read
IFS="$input_delimiter" read -r $output_params << EOF
$1
EOF
}
答案1
函数在与当前 shell 相同的上下文中运行,在函数内部设置并从调用范围使用它们word1
是完全没问题的:word2
split(){
local a=$1 b=$2
shift 2
IFS=$b read -r $@ _ << \
EOF
$a
EOF
}
split "hello world" " " word1 word2
printf %s\\n "1:$word1" "2:$word2"