4개의 항목으로 구성된 양식을 사용하여 4개의 요소로 구성된 배열을 만들려고 합니다.
new_prop=($(zenity --forms --title="my-script" --text="Insert the values" --separator=" " \
--add-entry="Name" \
--add-entry="Surname" \
--add-entry="Gender" \
--add-entry="Age"))
일반적으로 사용자는 Gender
이 필드를 비워 둘 수 있지만 나머지 3개 필드는 채워야 합니다.
문제는 항목이 비어 있으면 빈 요소가 생성되지 않고 그냥 건너뛴다는 것입니다 zenity
(모르겠어요 ). 예를 들어 and 를 yad
삽입하면 2 개의 요소가 있는 배열이 생성됩니다 .Name
Age
zenity
new_prop
양식의 항목이 비어 있는지 확인하는 방법은 무엇입니까? 양식이 사용되거나 zenity
만들어지는 것은 중요하지 않습니다 yad
.
감사합니다!
답변1
문제는 항목이 비어 있으면 zenity(yad에 대해서는 잘 모르겠습니다)가 빈 요소를 생성하지 않고 요소를 건너뛴다는 것입니다. 예를 들어, 이름과 나이를 삽입하면 zenity는 2개의 요소가 있는 new_prop 배열을 생성합니다.
항목이 비어 있으면 빈 요소가 생성되지만, 분할+glob 연산자와 공백 구분 기호를 사용하여 셸에서 출력을 분할합니다.
공백은 공백 문자이므로 $IFS
(기본적으로) 분할 부분에서 발견되면 선행 및 후행 문자가 무시되고 하나 이상의 IFS 공백 시퀀스가 하나로 처리됩니다. 물론 와일드카드를 요구하는 것은 의미가 없습니다.
사용하십시오(bash 4.4 이상이 wait "$!"
get zenity
의 종료 상태를 사용할 수 있다고 가정):
readarray -t new_prop < <(
zenity --forms \
--title="my-script" \
--text="Insert the values" \
--separator=$'\n' \
--add-entry={Name,Surname,Gender,Age}
) && wait "$!"
(값에 개행 문자가 포함될 수 없다고 가정)
분할+글로브를 사용하려면 공백이 아닌 구분 기호(최근 bash 버전에서는 로케일에서 단일 바이트 문자로 분류되고 이전 버전에서는 공백, 탭, 줄 바꿈만 해당)를 사용해야 하며 물론 사용하지 않는 글롭 부분도 비활성화해야 합니다. 원하지 않는다.
zenity
bash에서 IFS 분할에 필요한 구분 기호를 사용하고 명령 대체 스트립 후행 개행 문자를 사용 하면 상황이 더욱 복잡해집니다.
IFS=$'\36' # or any non-whitespace character not expected in the values
# here using ASCII RS (record separator) character.
set -o noglob
new_prop=(
$(
set -o pipefail
zenity --forms \
--title="my-script" \
--text="Insert the values" \
--separator="$IFS" \
--add-entry={Name,Surname,Gender,Age} |
sed "\$s/\$/$IFS/"
)
)
sed
bash에서 IFS 분할의 마지막 줄 끝에 RS를 추가하면 해당 필드가 비어 있어도 해당 필드를 볼 수 있습니다. 이는 또한 마지막 필드의 후행 줄 바꿈이 명령 대체에 의해 제거되는 것을 방지합니다.
이제 필드의 줄 바꿈은 더 이상 문제가 되지 않지만 RS 문자는 문제가 됩니다.
zsh
단일 문자뿐만 아니라 임의의 구분 기호와 해당 s
매개변수 확장 플래그를 사용할 수 있습니다 .
sep=$'\36@@%%@@\36'
new_prop=(
"${(@ps[$sep])$(
zenity --forms \
--title="my-script" \
--text="Insert the values" \
--separator=$sep \
--add-entry={Name,Surname,Gender,Age})}"
)
(이렇게 하면 명령 대체 때문에 마지막 필드(있는 경우)의 후행 개행 문자가 제거되지만).
1 내 테스트에서는 복사하여 붙여넣거나 다른 입력 방법(예: zenity
일부 시스템에서 유니코드 코드 포인트를 통해 문자를 입력하는 Ctrl++ )을 사용하는 Shift경우 줄 바꿈을 포함할 수 있습니다 . GUI에서는 ⏎로 렌더링되지만 stdout에서는 개행 문자로 출력됩니다.ua