나는 시도한다:
- Bash에서 입력을 수락하고 저장합니다.말 그대로파일로
- 고양이파일의 내용입니다.
특수문자도 써야함말 그대로파일로.
입력 샘플
./verbatim.sh -a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''
예상 출력
-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''
실제 출력
내부 인용문이 제거됩니다.
-a smb 'ngrep -i -d $INTERFACE s.?a.?m.?b.?a.*[[:digit:]]'
암호
#!/bin/bash
#
# Script Name: verbatim.sh
chars='[ !"#$&()*,;<>?\^`{|}]'
for arg
do
if [[ $arg == *\'* ]]
then
arg=\""$arg"\"
elif [[ $arg == *$chars* ]]
then
arg="'$arg'"
fi
allargs+=("$arg") # ${allargs[@]} is to be used only for printing
done
printf '%s\n' "${allargs[*]}" > /tmp/pse.tmp
cat /tmp/pse.tmp
bash가 내가 요청한 것을 수행할 수 있는지 잘 모르겠습니다.
읽기 또는 IFS를 사용하는 것이 더 낫습니까? 내 스크립트의 목표는 특정 서비스에 대한 "빠른 참조"로 사용될 파일에 사용자 입력을 추가하는 것입니다.
답변1
제목에 대한 질문
변수에 특정 문자열이 포함되면 해당 변수는 다시 확장되지 않습니다(인용된 경우).
따라서 제안한 예제 사례의 경우(모두 '
로 변환됨 '\''
):
var='-a smb '\''ngrep -i -d $INTERFACE '\''s.?a.?m.?b.?a.*[[:digit:]]'\'''\'''
또는 조금 줄이려면(실제로는 필요하지 않지만 Continuous를 제거하는 것이 더 좋습니다 ''
):
var='-a smb '\''ngrep -i -d $INTERFACE '\''s.?a.?m.?b.?a.*[[:digit:]]'\'\'
다음을 인쇄합니다(원하는 문자열).
$ echo "$var"
-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''
스크립트에 동일한 문자열을 제공합니다.
$ ./verbatim.sh "$var"
if( verbatim.sh
) 스크립트는 다음과 같습니다.
#!/bin/bash
printf '<%s>' "$@"; echo
다음과 같이 인쇄됩니다.
$ ./verbatim.sh "$var"
<-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''>
당신이 쓴 내용을 축어적으로 표현한 문자열입니다.
파일에 쓰기:
해당 입력을 파일에 쓰려면 verbatim.sh
스크립트를 다음과 같이 확장할 수 있습니다.
#!/bin/bash
printf '<%s>' "$@"; echo
printf '%s\n' "$var" > /tmp/pse.tmp
그런 다음:
$ cat /tmp/pse.tmp
-a smb 'ngrep -i -d $INTERFACE 's.?a.?m.?b.?a.*[[:digit:]]''
요청한 출력을 제공합니다.
질문
위의 내용은 "$var" 내부의 문자열을 다음과 같이 조심스럽게 다루었기 때문에 작동합니다.하나의매개변수가 아닌 문자열입니다.
스크립트가 가장 먼저 수행하는 작업은 다음 매개변수 목록을 요청하는 것입니다.
for arg do .......
매개변수는 문자열 하나만 있습니다. 매개변수 목록이 필요한 경우 절차는 완전히 달라야 합니다.
그런 다음 각 개별 매개변수를 큰따옴표나 작은따옴표로 인용해 보세요. 아니요, 그것도 작동하지 않습니다.
또한 제공하신 문자열의 내용을 읽어보면 명령을 구성하고 실행하려는 것으로 보입니다. 그것은 더욱 나쁘다. 너~ 해야 하다읽다명령을 변수에 넣으려고 했지만 복잡한 경우는 항상 실패합니다!
그런 다음 배열을 매개변수로 사용하도록 질문을 편집할 수 있습니다.
답변2
이건 불가능 해.
다음 명령을 실행하면
myprog a
myprog \a
myprog "a"
myprog 'a'
그런 다음 4가지 경우 모두 첫 번째 인수에 대해 얻은 값은 myprog
string 에 대한 포인터가 되며 "a"
어떤 값이 주어졌는지 알 수 없습니다. 따라서 myprog
호출 전에도 인수가 처리되기 때문에 주어진 내용을 문자 그대로 작성할 수 없습니다 .