解决方案

解决方案

我正在尝试创建一个与 #!/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"

相关内容