【问题标题】:Parameter expansion with replacement, avoid additional variable带替换的参数扩展,避免额外的变量
【发布时间】:2021-11-04 18:09:10
【问题描述】:

我正在尝试加入输入$*,这是一个由所有参数相加而成的参数。

这行得通。

#!/bin/bash

foo() {
    params="${*}"
    echo "${params//[[:space:]]/-}"
}

foo 1 2 3 4
1-2-3-4

但是,是否可以跳过变量的赋值?

"${"${*}"//[[:space:]]/-}"

我收到bad substitution 错误。

我也可以

: "${*}"
echo "${_//[[:space:]]/-}"

但感觉很hacky。

【问题讨论】:

    标签: bash parameter-expansion


    【解决方案1】:

    一种选择是在本地将 的内部字段分隔符IFS 设置为-,而仅设置echo "$*"

    foo() {
        local IFS=$'-'
        echo "$*"
    }
    

    【讨论】:

    • join(){ IFS=$1;shift;printf %s\\n "$*";};join - 1 2 3 4 是通用的且对 POSIX 友好。
    • @LéaGris 酷!把它放上去,你就会有投票权。
    • @LéaGris 你明白了! :-)
    【解决方案2】:

    要回答您的问题,您可以对位置参数进行全局模式替换,如下所示:

    ${*//pat/sub}
    ${@//pat/sub}
    

    还有这样的数组:

    ${arr[*]//pat/sub}
    ${arr[@]//pat/sub}
    

    这不会加入参数,而是在其中替换。

    将 IFS 设置为破折号会在 echo "$*"p=$* 的每个参数之间添加一个破折号,但不会替换参数内部的任何内容。

    例如:

    $ set -- aa bb 'cc   cc'
    $ IFS=-
    $ echo "$*"
    aa-bb-cc   cc
    

    要删除所有空格,包括参数内的空格,您可以将它们组合起来:

    IFS=-
    echo "${*//[[:space:]]/-}"
    

    或者只是先分配一个名字,就像你做的那样:

    no_spaces=$*
    echo "${no_spaces//[[:space:]]/-}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 2018-12-30
      • 2010-12-25
      • 2015-03-11
      相关资源
      最近更新 更多