오프 챈스에서 쉘을 재사용하기 위해 따옴표를 처리하려고하면 따옴표를 제거 하지 않고도이 작업을 수행 할 수 있습니다. 죽은 것도 간단합니다.
aq() { sh -c 'for a do
alias "$((i=$i+1))=$a"
done; alias' -- "$@"
}
이 함수 쉘은 사용자가 건네주는 arg 배열을 인용하고 반복 가능한 인수마다 출력을 증가시킵니다.
여기에 몇 가지 인수가 있습니다.
aq \
"here's an
ugly one" \
"this one is \$PATHpretty bad, too" \
'this one```****```; totally sucks'
산출
1='here'"'"'s an
ugly one'
2='this one is $PATHpretty bad, too'
3='this one```****```; totally sucks'
그 출력은 dash
일반적으로와 같이 작은 따옴표로 묶은 출력을 안전 인용합니다 '"'"'
. bash
할 것 '\''
입니다.
하나의 공백이 아닌의 선택을 교체, 또 다른 단일 바이트와 null 이외의 바이트 가능성이 어떤 POSIX 쉘에서 가장 빠른을 수행 할 수 있습니다 $IFS
와 $*
.
set -f; IFS=\"\'\`; set -- $var; printf %s "$*"
산출
"some ""crazy """"""""string ""here
거기에서 나는 printf
그것을 볼 수 있도록하지만, 내가 한 경우 물론 :
var="$*"
... printf
명령 $var
값 대신 출력에 표시됩니다.
set -f
쉘 에 glob 하지 말라고 지시 할 때 -문자열에 glob 패턴으로 해석 될 수있는 문자가 포함되어있는 경우. 쉘 파서 는 변수에서 필드 분할을 수행 한 후 glob 패턴 을 확장하기 때문에이 작업을 수행합니다. 글 로빙은 다음과 같이 다시 활성화 할 수 있습니다 set +f
. 일반적으로-스크립트에서-내 강타를 다음과 같이 설정하는 것이 유용하다는 것을 알았습니다.
#!/usr/bin/sh -f
그리고 내가 원하는 라인에서 명시 적으로 글 로빙 을 활성화set +f
합니다.
필드 분할은의 문자를 기준으로 수행됩니다 $IFS
.
공백과 공백이 아닌 두 종류의 $IFS
값 이 있습니다 . 공백 (공백, 탭, 줄 바꿈)으로 구분 된 필드는 단일 필드 로 순서대로 제거 되도록 지정 되거나 다른 필드 보다 우선하지 않으면 전혀 없습니다 .$IFS
$IFS
$IFS
IFS=\ ; var=' '; printf '<%s>' $var
<>
그러나 다른 모든 항목은 발생마다 단일 필드로 평가되도록 지정되며 잘리지 않습니다.
IFS=/; var='/////'; printf '<%s>' $var
<><><><><>
모든 변수 확장은 기본적으로 $IFS
구분 된 데이터 배열 $IFS
입니다. 에 따라 필드가 분리됩니다 . "
1 을 인용하면 해당 배열 속성을 재정의하고 단일 문자열로 평가합니다.
그래서 내가 할 때 ...
IFS=\"\'\`; set -- $var
쉘의 인수 배열을 의 확장에 $IFS
의해 생성 된 많은 구분 된 필드로 설정하고 $var
있습니다. 확장되면 포함 된 문자의 구성 값 $IFS
이 손실 됩니다 \0NUL
. 현재 필드 구분자 일뿐입니다 .
"$*"
-다른 큰 따옴표로 묶은 변수 확장과 마찬가지로-의 필드 분할 품질도 무시합니다 $IFS
. 그러나 또한 $IFS
구분 된 각 필드 에 대해 첫 번째 바이트를 대체합니다 "$@"
. 따라서 모든 후속 분리 문자"
의 첫 번째 값이에 있기 때문 입니다 . 그리고 필요에 있지 하거나, 당신이 그것을 분할 할 때. 당신은 변경할 수 후 다른 값으로 완전히 그 새로운 첫 번째 바이트는 다음의 필드 구분 기호 올라올 것입니다 . 또한 다음과 같은 흔적을 모두 제거 할 수 있습니다.$IFS
"
"$*"
"
$IFS
$IFS
set -- $args
"$*"
set -- $var; IFS=; printf %s "$*"
산출
some crazy string here
tr
. BASH의 PE는 좋지만이 경우 tr이 훨씬 빠릅니다. 예를 들어,echo "$OUTPUT" | tr -dc '[[:alpha:]]'
당신은 단지 영숫자 갖고 싶어하기 때문에