こんにちは皆さん、よろしくお願いします。
私の状況についてフォーラムを検索しましたが、解決策が見つかりませんでした。コマンドラインから引数/オプション/パラメータを渡すスクリプトがあります。値の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
)。