bash引数をスペースを含む単一の文字列に結合する


39

Bash関数のすべての引数を、各引数をスペースで区切った1つの文字列に結合しようとしています。また、文字列全体を単一引用符で囲む必要があります。

ここに私がこれまで持っているものがあります...

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

明らかにこれは機能しませんが、これを達成する方法があるかどうか疑問に思っていますか?

回答:


54

私はこれがあなたが望むことをすると信じています。すべての引数をスペースで区切った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'

さて、これは素晴らしく機能し、私が必要としたものを正確に実行しました。引数を使用するだけで、これを使用してディレクトリを名前にスペースを含むディレクトリに変更しようとしています。最終的にこれが必要だったのは、ディレクトリにスペースが空いている場合にアポストロフィを入力せずにディレクトリを変更する関数を作成することでした。私が試したのは次のとおりです:cdm(){str = "'$ *'" cd $ str} strの最初の引数にのみアクセスします例:cdm test 2結果: 'test:No
such

@Schwagmister:必要に応じて(文字列)変数に保存できますが、特にその必要がない場合は、cd "$*"十分だと思います。
スコット

@Schwagmister単一引用符はそこでは役に立ちません。:試してみてくださいcdm(){ str="$*"; cd "$str"; }、スコットが示唆するように、またはcdm(){ cd "$*"; }。また、$*連続する複数のスペースを単一のスペースに置き換えることに注意してください。ディレクトリ名に複数の連続したスペース、タブ、または改行が含まれる場合、それらの文字は関数に渡すにエスケープする必要がありcdmます。
ジョン1024

テスト2トライアル1のようなものであれば、このcdコマンドを正しく機能させるにはどうすればよいですか?また、これは私が本当に感謝している素晴らしい助けです。@スコット
シュワグミスター

@Schwagmister最良の方法は、次のように呼び出すときにコマンドラインに単一引用符を付けることcdmですcdm 'test 2 trial 1'。これは、奇妙な名前のすべての荘園を処理します。ただし、空白が単一のスペースに制限されている限り、それはcdmとして実行できますcdm test 2 trial 1
John1024

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.