빈 문자열 제거를 방지하지 않고 단어 분할을 방지하는 방법은 무엇입니까?

빈 문자열 제거를 방지하지 않고 단어 분할을 방지하는 방법은 무엇입니까?

매개변수 확장을 프로그램 매개변수로 전달해야 합니다. 확장된 결과는 공백이 포함된 파일 이름입니다. 그래서 파일 이름을 한 단어로 만들기 위해 큰따옴표를 사용했습니다 "$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 

관련 정보