関数のすべてのパラメータ連結/変数のすべてのスペースを削除する

関数のすべてのパラメータ連結/変数のすべてのスペースを削除する

関数のすべてのパラメータを連結する良い方法は何ですか?

今私が得ることは、それらを繰り返して連続して追加することです。

func(){
concat=
for arg in "$@"
do
    concat=$concat$arg
done
echo $concat
}

私は似たようなことをしたい:

another_func() {
echo $(remove_spaces $@)
}

答え1

concat () (
    IFS=''
    printf '%s\n' "$*"
)

この関数は、位置引数(引数)の値を区切り文字として最初の文字の値に関連付けられた単一の"$*"文字列に展開する(二重引用符が重要です)を使用します。$IFS

これをIFS空の文字列に設定します。つまり、"$*"すべての引数が区切り文字なしで連結されることを意味します。

$IFSまた、( ... )一般的な{ ... }

他の関数内でこの関数を呼び出すことは次のとおりです。

other_func () {
    printf '%s\n' "$( concat "$@" )"
}

あるいは、実際に関数を呼び出さずに短くすることもできますconcat

other_func () {
    ( IFS=''; printf '%s\n' "$*" )
}

引数リストからすべてのスペースを削除するには、次のようにします。

printf '%s\n' "$*" | tr -d ' '

例えば、

concat_delete_sp () {
    printf '%s\n' "$*" | tr -d ' '
}

テスト:

$ concat 1 2 3 "h h h" o o o
123h h hooo
$ concat_delete_sp 1 2 3 "h h h" o o o
123hhhooo

答え2

2番目の例のアプローチに基づいてリソースがほとんどない高速ソリューションの場合:

func(){
  a=$@;echo ${a// /}
}

これにより、すべてのスペースが削除されます。ただし、スペースを含むパラメータを使用したい場合は、@kusalanandaのアプローチを覚えておいてください。

答え3

zshシェルでは、j:separator:パラメータ拡張フラグを使用して配列要素を区切り文字として連結できます。だからあなたはこれを行うことができます:

concat=${(j::)argv}

または

concat=${(j::)@}

$argv$@このように、グローバルパラメータを変更せずに配列要素を連結します$IFS

Bourneなどのシェルを使用して引数を印刷したい場合は、いつでも次のことができます。

concat() {
  printf %s "$@" || return
  [ "$#" -eq 0 ] || printf '\n' # empty output if no argument
}

との組み込み関数はprintf結果を変数に保存することもできます。bashzsh

printf -v variable %s "$@"

fishシェルでは、次のものを使用できます。

echo -s -- $argv

(空のリストの場合は空白行が印刷されます$argv。)

関連情報