매개변수 확장을 프로그램 매개변수로 전달해야 합니다. 확장된 결과는 공백이 포함된 파일 이름입니다. 그래서 파일 이름을 한 단어로 만들기 위해 큰따옴표를 사용했습니다 "$var"
.
파일 이름이 포함되어 있는 한 $var
프로그램은 단어 인수를 가져오고 제대로 작동합니다. 그러나 때로는 확장으로 인해 빈 문자열이 생성되어 인수로 전달될 때 프로그램이 중단되는 경우가 있습니다(변경할 수 없음).
Bash 참조 매뉴얼에 따르면 빈 문자열을 제거하지 않는 것이 지정된 동작입니다.
값이 없는 매개변수를 큰따옴표로 확장하면 빈 매개변수가 생성되고 유지됩니다.
하지만 변수를 인용해야 하지만 빈 문자열 확장도 삭제해야 하는 상황을 어떻게 관리합니까?
편집하다:
George Vasiliou 덕분에 내 질문에 누락된 세부 정보가 있음을 발견했습니다(짧게 유지하려고 노력 중입니다 :)). 프로그램을 실행하는 것은 다음과 같이 축약된 긴 Java 호출입니다.
java -cp /etc/etc MyClass param1 param2 "$var" param4
실제로 if
George가 설명한 설명을 사용하면 문제가 해결될 것입니다. 그러나 이를 위해서는 절에 "$var"가 있는 호출 then
과 else
절에 "$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