현재 나는 다음을 가지고 있습니다:
#!/bin/bash
screen -p 'ScreenName' -x eval 'stuff '"'"$@"'"'\015'
echo eval 'stuff '"'"$@"'"'\015'
하지만 스크립트를 호출하면 다음과 같습니다.
# script.sh asd "asd" 'asd'
내 주장은 다음과 같습니다.자폐 스펙트럼 장애 자폐 스펙트럼 장애
나는 출력을 얻습니다 :
eval stuff 'asd asd asd'\015
나는 하나를 제외하고:자폐 스펙트럼 장애 "자폐 스펙트럼 장애" "자폐 스펙트럼 장애"
전체 매개변수 줄을 모두 따옴표로 전달하도록 스크립트를 어떻게 변경합니까?
답변1
쉘이 스크립트에 따옴표를 전달하지 않습니다. 따옴표를 전달하려면 백슬래시로 이스케이프 처리하세요.
# ./script.sh asd \"asd\" \'asd\'
답변2
sh -c "screen -x 'ScreenName' -X eval 'stuff \"$@\"\015'"
답변3
참고: 일반적인 경우에는 작동하지 않습니다.껍데기하지만불다
유일한 해결책은 다음과 같이 이것이 구문이 아니라 실제 콘텐츠임을 쉘에 표시하는 것입니다.
script.sh $'asd "asd" \'asd\''
# ^^ ^ ^ ^
# || | | |
# 12 3 3 2
1: 의미를 변경하여 문자열 접두사를 붙이고 $
백슬래시로 이스케이프된 따옴표를 허용합니다. cfhttps://unix.stackexchange.com/a/30904/383566
2: 단일 인수로 처리되어야 함을 쉘에 나타내기 위해 작은따옴표 사이에 값을 묶습니다
. 3: 작은따옴표가 묶는 구문으로 사용되므로 백슬래시로 작은따옴표를 이스케이프 처리합니다(2 참조).
입증하다:
# defining a function to test
> function count_and_print_args() { # if not using bash, remove the "function"
echo $# # print the number of arguments
for arg in "$@" # for each of all arguments
do
echo "$arg" # print the argument on a newline
done;
}
> count_and_print_args
0
> count_and_print_args a b c
3
a
b
c
> count_and_print_args $'asd "asd" \'asd\''
1
asd "asd" 'asd'