공백이 포함 된 인수 목록을 작성하십시오
-
03-07-2019 - |
문제
Bash에서는 공백이 포함 된 인수를 피할 수 있습니다.
foo "a string"
이것은 또한 명령 또는 함수에 대한 인수에도 적용됩니다.
bar() {
foo "$@"
}
bar "a string"
지금까지 너무 좋았지 만 전화하기 전에 논쟁을 조작하고 싶다면 어떨까요? foo
?
이것은 작동하지 않습니다.
bar() {
for arg in "$@"
do
args="$args \"prefix $arg\""
done
# Everything looks good ...
echo $args
# ... but it isn't.
foo $args
# foo "$args" would just be silly
}
bar a b c
그렇다면 인수에 공백이 포함되어있을 때 어떻게 인수 목록을 작성합니까?
해결책
이를 수행하는 두 가지 방법이 있습니다.
배열을 사용하고 사용하여 확장하십시오
"${array[@]}"
:bar() { local i=0 args=() for arg in "$@" do args[$i]="prefix $arg" ((++i)) done foo "${args[@]}" }
그래서 우리는 무엇을 배웠습니까?
"${array[@]}"
그렇습니다${array[*]}
무엇"$@"
그렇습니다$*
.또는 배열을 사용하지 않으려면 사용해야합니다.
eval
:bar() { local args=() for arg in "$@" do args="$args \"prefix $arg\"" done eval foo $args }
다른 팁
다음은 숫자 색인을 사용할 필요가없는 짧은 버전입니다.
(예 : a find
명령)
dir=$1
shift
for f in "$@" ; do
args+=(-iname "*$f*")
done
find "$dir" "${args[@]}"
작은 디테일이 변경된 상태에서 제안한대로 배열을 사용할 수 있습니다. Foo를 호출하는 줄은 읽어야합니다
foo "${args[@]}"
나는 이것에도 문제가 있었다. Bash 스크립트를 작성하여 Windows 컴퓨터 (Cygwin)의 중요한 파일을 백업했습니다. 배열 접근 방식도 시도했지만 여전히 몇 가지 문제가있었습니다. 내가 어떻게 고정했는지 정확히 잘 모르겠지만, 여기에 도움이 될 경우 내 코드의 부분이 중요합니다.
WORK="d:\Work Documents\*"
# prompt and 7zip each file
for x in $SVN $WEB1 $WEB2 "$WORK" $GRAPHICS $W_SQL
do
echo "Add $x to archive? (y/n)"
read DO
if [ "$DO" == "y" ]; then
echo "compressing $x"
7zip a $W_OUTPUT "$x"
fi
echo ""
done
제휴하지 않습니다 StackOverflow