空の文字列の削除を防ぐことなく単語の分割を防ぐ方法は?

空の文字列の削除を防ぐことなく単語の分割を防ぐ方法は?

パラメーター拡張をプログラム・パラメーターに渡す必要があります。拡張結果は、スペースを含むファイル名です。そのため、ファイル名を1つの単語にするために二重引用符を使用しました"$var"

ファイル名が含まれている限り、$varプログラムは単語引数を取得し、正しく機能します。ただし、場合によっては拡張によって空の文字列が生成され、引数として渡されるとプログラムが中断されることがあります(変更できません)。

Bashリファレンスマニュアルによると、空の文字列を削除しないことが指定された動作です。

値のないパラメータを二重引用符で拡張すると、空のパラメータが生成され保持されます。

しかし、変数を引用する必要がありますが、空の文字列拡張も削除する必要がある状況をどのように管理しますか?

編集する:

George Vasiliouのおかげで、私の質問に欠けている詳細があることがわかりました(短くしようとしています:))。プログラムの実行は、次のように短縮された長いJava呼び出しです。

java -cp /etc/etc MyClass param1 param2 "$var" param4

実際、ifGeorgeが説明した説明を使用すると問題が解決します。ただし、これには、句に「$ var」がある呼び出しと句thenelse「$ var」がない呼び出しがそれぞれ必要です。

重複を避けるために、単一の呼び出しを使用して "$var"が空のときに拡張を削除する方法があるかどうかを確認したかったのです。

答え1

これ${parameter:+word} パラメータ拡張フォームが操作を完了しているようです。

( xyz=2; set -- ${xyz:+"$xyz"}; echo $# )
1

( xyz=; set -- ${xyz:+"$xyz"}; echo $# )
0

( unset xyz; set -- ${xyz:+"$xyz"}; echo $# )
0

したがって、これは次のように翻訳する必要があります。

program ${var:+"$var"}

あなたの場合

答え2

bash同様の配列をサポートするシェルでは、次のことができます。

# default is an empty array
param=()

# if $var is not empty then add it to array
[[ "$var" ]] && param=("$var")

# use the $@-like magic for arrays
java -cp /etc/etc MyClass param1 param2 "${param[@]}" param4

デモ

demo() {
  [[ "$var" ]] && param=("$var") || param=()

  echo -n 'output: '
  printf '<%s> ' before "${param[@]}" after
  echo
}

demo # output: <before> <after> 

var=''
demo # output: <before> <after> 

var='foo bar'
demo # output: <before> <foo bar> <after> 

ノート

また、見ることができますhttps://github.com/koalaman/shellcheck/wiki/SC2086#例外入場場所イルバル答えをもう一度説明しました。

答え3

何をしたいのか分かりませんが、十分であれば簡単ではありませんか?たとえば、

[[ ! -z "$var" ]] && call_program_with_arg "$var" 

または

if [[ ! -z "$var" ]];then call_program "$var";fi

$ varが空の場合、何も起こりません。空でない場合は、目的のプログラムを呼び出します。

質問を更新した後:

parameters=( "Param1" "Param2" )
[[ ! -z "$var" ]] && parameters+=( "$var" "Param4") || parameters+=( "Param4" )
java -cp /etc/etc MyClass "${parameters[@]}"

テスト:

$parameters=( "Param1" "Param2" );var="my file.java";[[ ! -z "$var" ]] && parameters+=( "$var" "Param4") || parameters+=( "Param4" );echo java -cp /etc/etc MyClass "${parameters[@]}"                                                                                                              
>java -cp /etc/etc MyClass Param1 Param2 my file.java Param4
$parameters=( "Param1" "Param2" );var="";[[ ! -z "$var" ]] && parameters+=( "$var" "Param4") || parameters+=( "Param4" );echo java -cp /etc/etc MyClass "${parameters[@]}"                                                                                                               
>java -cp /etc/etc MyClass Param1 Param2 Param4 

関連情報