bash引数をスペースを含む単一の文字列に連結します。

bash引数をスペースを含む単一の文字列に連結します。

Bash関数のすべてのパラメータを文字列で連結し、各パラメータをスペースで区切りたいとします。また、文字列全体に一重引用符を含める必要があります。

私が今まで持っているのは次のとおりです...

$array=("$@")
str="\'"
for arg in "${array[@]}"; do
    let $str=$str+$arg+" "
done
let $str=$str+"\'"

明らかにこれはうまくいきません。しかし、これを達成する方法があるかどうか疑問に思います。

答え1

私はこれがあなたが望む効果を得ると信じています。すべてのパラメータをスペースで区切って一重引用符で囲まれた文字列に入れます。

str="'$*'"

$*$IFSデフォルトでは、空白の最初の文字で区切られたすべてのスクリプト引数を生成します。

二重引用符で囲まれた文字列内では、一重引用符をエスケープする必要はありません。

はい

上記をスクリプトファイルに入れてみましょう。

$ cat script.sh 
#!/bin/sh
str="'$*'"
echo "$str"

次に、サンプルパラメータを使用してスクリプトを実行します。

$ sh script.sh one two three four 5
'one two three four 5'

スクリプトはPOSIXです。で動作しますbashが、必須ではありませんbash

バリエーション: スペースの代わりにスラッシュで連結

以下を調整して、スペースを別の文字に変更できますIFS

$ cat script.sh 
#!/bin/sh
old="$IFS"
IFS='/'
str="'$*'"
echo "$str"
IFS=$old

たとえば、

$ sh script.sh one two three four       
'one/two/three/four'

答え2

思ったより簡単です。

#!/bin/bash
array="${@}"

echo $array

chmod +xを押して実行します。

$ ./example.sh --foo bar -b az 
--foo bar -b az

答え3

修正する TL;DR、使用

"'${array[*]}'"

確かに言うと、コピーするつもりはありません。この回答。配列のすべての値を使用し@て逆参照することに微妙な違いがあることがわかりました。*

内部的には、$*argv$@のリストを参照する2つの配列です。

問題の観点からは、

私はすべての主張を一つにまとめようとしています。バッシュ機能入力する単一文字列各パラメータをスペースで区切ります。

2つのサブ質問があります。

  1. つながる大量にパラメータを文字列に入力します。
  2. 連結文字列を単一の引数としてシェル関数に渡します。

まず、配列を文字列に連結します。

array=("$@")
str="'${array[@]}'"
# or
str="'${array[*]}'"
# or
str=\'"${array[*]}"\'

次に、str関数に渡すときに関数が受け取る引数の数を数えましょう。

#!/usr/bin/env bash

arr=(a b c d)

function count_args() {
  echo '$#' $#
}

count_args "'${arr[@]}'"
count_args \'"${arr[@]}"\'
count_args "'${arr[*]}'"
count_args \'"${arr[*]}"\'

出力は次のとおりです

$# 4
$# 4
$# 1
$# 1

arr[*]配列をシェル関数の1つのパラメータにのみラップします。なぜですか?

から引用Bashスクリプトで配列を使用する方法、私はこれが私にとって効果的であることがわかりました。

echo ${array[*]}
echo ${array[@]}

どちらの構文も配列のすべての値にアクセスし、同じ結果を生成できます。拡張機能が参照しない限り。この場合には違いがあります。最初のケースでは、@を使用すると、展開時に配列内の各要素の単語が生成されます。

そして、それを使用すると、*拡張中に配列全体が1つのパラメータにグループ化されます。

関連情報