シェルスクリプトで、コマンドにスペースを含む引数を渡しますか? [コピー]

シェルスクリプトで、コマンドにスペースを含む引数を渡しますか? [コピー]

下記の編集内容をご覧ください。ありがとうございます。

次のテストスクリプトがあります(重要:この部分は変更できません):

while (($#)); do
  echo $1
  shift
done

このコマンドを実行すると、 ./test aaa "bbbb cccc" ddd 次の出力が生成されます。

aaa
bbbb cccc
ddd

これは正気の人なら誰でも期待できるのです。

別のスクリプトがあります。

mode="good"
status="okay"
name="bro"
description="very good man dood"
extra=""

# ----

PARAMS=""

// $1: key, $2: value
function addParam {
    if [ ! -z "$2" ]; then
        PARAMS="$PARAMS --$1 \"$2\""
    fi
}

addParam "mode" "$mode"
addParam "status" "$status"
addParam "name" "$name"
addParam "description" "$description"
addParam "extra" "$extra"

echo ./test $PARAMS
./test $PARAMS

の出力はechoなので、./test --mode "good" --status "okay" --name "bro" --description "very good man dood"予想出力./test $PARAMSは次のようになります。

--mode
good
--status
okay
--name
bro
--description
very good man dood

ただし、何らかの理由で以下の結果が表示されます。

--mode
"good"
--status
"okay"
--name
"bro"
--description
"very
good
man
dood"

出力をコピーしてecho ./test $PARAMS貼り付けると、予想される出力が得られます./test。だから私は最後の実行行を削除し、./testそのecho行を最後に保持しようとしましたが、それはまだ$(./script)機能していないと理解できません。

私は何が間違っていましたか?


編集する:@steeldriverのソリューションは動作しますが、別の制限があります。ユーザーが自分のパラメータを送信できるようにする必要があります。

したがって、次のスクリプトがあります(@steeldriverのおかげで):

#!/bin/bash

mode="good"
status="okay"
name="bro"
description="very good man dood"
extra=""
arguments="--config \"blablabla=yes\" --config2 \"bla2=no problem\""

# ----

declare -a PARAMS

# $1: key, $2: value
function addParam {
    if [ ! -z "$2" ]; then
        PARAMS+=("--$1" "$2")
    fi
}

addParam "mode" "$mode"
addParam "status" "$status"
addParam "name" "$name"
addParam "description" "$description"
addParam "extra" "$extra"

# (1)
PARAMS+=("$arguments")

# (2)
PARAMS+=($arguments)

echo ./test "${PARAMS[@]}" 
./test "${PARAMS[@]}"

希望の出力は次のとおりです。

--mode
good
--status
okay
--name
bro
--description
very good man dood
--config
blablabla=yes
--config2
bla2=no problem

しかし、私が得た結果は次のとおりです。

そして(1)

--mode
good
--status
okay
--name
bro
--description
very good man dood
--config "blablabla=yes" --config2 "bla2=no problem"

そして(2)

--mode
good
--status
okay
--name
bro
--description
very good man dood
--config
"blablabla=yes"
--config2
"bla2=no
problem"

ありがとうございます!

ベストアンサー1

文字列変数の代わりに配列を使用してください。

#!/bin/bash

mode="good"
status="okay"
name="bro"
description="very good man dood"
extra=""

# ----

declare -a PARAMS

# $1: key, $2: value
function addParam {
    if [ ! -z "$2" ]; then
        PARAMS+=("--$1" "$2")
    fi
}

addParam "mode" "$mode"
addParam "status" "$status"
addParam "name" "$name"
addParam "description" "$description"
addParam "extra" "$extra"

echo ./test "${PARAMS[@]}"
./test "${PARAMS[@]}"

テスト

$ ./other.sh
./test --mode good --status okay --name bro --description very good man dood
--mode
good
--status
okay
--name
bro
--description
very good man dood

おすすめ記事