bash 스크립트에 따옴표 및 큰따옴표 매개변수 전달

bash 스크립트에 따옴표 및 큰따옴표 매개변수 전달

현재 나는 다음을 가지고 있습니다:

#!/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'

관련 정보