オプション/パラメータ/パラメータをスペースでスクリプトから関数に渡す

オプション/パラメータ/パラメータをスペースでスクリプトから関数に渡す

こんにちは皆さん、よろしくお願いします。

私の状況についてフォーラムを検索しましたが、解決策が見つかりませんでした。コマンドラインから引数/オプション/パラメータを渡すスクリプトがあります。値の1つにスペースが含まれていて、二重引用符で囲みました。たとえば、説明する方が簡単かもしれません。パラメータ/オプション/パラメータを使用することをご了承ください。

$:  ./test1.ksh -n -b -d "Home Videos"

私の問題は、変数を「ホームビデオ」に設定して一緒に使用することです。私の例では、-dはディレクトリを指定します。すべてのディレクトリにスペースがあるわけではありませんが、私の場合、いくつかのディレクトリにスペースがありました。

以下は私のコードサンプルですが、期待どおりに機能しません。

#!/bin/ksh

Function1()
{
echo "Number of Args in Function1: $#"
echo "Function1 Args: $@"
SetArgs $*
}

SetArgs()
{
echo -e "\nNumber of Args in SetArgs: $#"
echo "SetArgs Args: $@"
while [ $# -gt 0 ]
do
  case $1 in
    -[dD])
    shift
    export DirectoryName=$1
    ;;
    -[nN])
    export Var1=No
    shift
    ;;
    -[bB])
    export Var2=Backup
    shift
    ;;
    *)
    shift
    ;;
  esac
done
Function2
}

Function2()
{
echo "Directory Name: ${DirectoryName}"
}

Function1 $*

このコマンドを実行すると、「Home Videos」の代わりに「Home」のDirectoryNameのみが取得されます。下記をご覧ください。

 $ ./test1.ksh -n -b -d "Home Videos"
 Number of Args in Function1: 5
 Function1 Args: -n -b -d Home Videos

 Number of Args in SetArgs: 5
 SetArgs Args: -n -b -d Home Videos
 Var1 is set to:  No
 Var2 is set to:  Backup
 Directory Name: Home

私が期待したが達成できなかったのは次のとおりです。

 $ ./test1.ksh -n -b -d "Home Videos"
 Number of Args in Function1: 4
 Function1 Args: -n -b -d "Home Videos"

 Number of Args in SetArgs: 4
 SetArgs Args: -n -b -d "Home Videos"
 Var1 is set to:  No
 Var2 is set to:  Backup
 Directory Name: Home Videos     <-- Without double quotes in the final usage.

私が得ることができるどんな助けにも感謝します...私は二重引用符を脱出しようとしましたが、成功しませんでした。

この問題を解決するのに役立つ時間と労力を投資していただきありがとうございます。

ありがとう、ダニエル

ベストアンサー1

引用符の有無にかかわら$*$@いいえ言葉になりますね。

"$*"は、位置パラメータリストの最初の文字(またはシェルに応じてバイト)と位置パラメータを連結したものです$IFS"$@"

引用符がないと、同じですが引用符を持たない他の引数拡張と同様に分割+グローブされます(またはnullで削除されます)(一部のシェルは、ifがnullの場合でもzsh引数を分割します)。$*$IFS

ここでパラメータリストを渡したいと思います。現状のままあなたの機能に応じて:

SetArgs "$@"
[...]
Function1 "$@"

ksh88では、$IFS正しく機能するために空白文字を(デフォルトで)含める必要があります(Bourneシェルから継承されたバグ、ksh93で修正されました)。

また、一部の実装ではksh(例:以前のバージョンのzshエミュレーションksh

export DirectoryName=$1

Split+Glob 呼び出し状況です。exportシェルコードを評価できるKornシェルのコマンドの1つです。配列インデックスによる算術評価) そうですね。このような場合は、コマンド注入の脆弱性が発生しないように変数を引用することが重要です。

例:

$ (exec -a ksh zsh-4.0.1 -c 'export x=$a' ksh 'foo psvar[0`uname>&2`]')
Linux

これは[ $# -gt 0 ]別の分割+glob呼び出しなので意味がありません(少なくともデフォルトに問題がある可能性はありません$IFS)。

おすすめ記事