Создайте меню динамических опций с помощью скрипта kdialog bash: Printf не может выполнить эту работу?вопрос о цитировании - PullRequest
3 голосов
/ 09 декабря 2011

Я хотел бы создать меню с kdialog, как это

  kdialog --menu "choose your profile"  "\"-vcodec mpeg2\"" "mpeg" 
  "\"vcodec stuff -ab 100ak\"" "avi" "\"-acodec mp3 -ab 128k"\" "mp3"

сейчас

массив a содержит параметры массив b содержит имя профиля

кажется, что у kdialog есть какая-то проблема с "-ab", обычно кажется, что он принимает -stuff как параметр, поэтому он должен быть "\" - vcodec mpeg2 \ "".

В основном моя проблема - это проблема цитирования, я использовал printf, но не могу ее получить

это мой код:

a = (- vcodec mp3 -ab 128k, -vcodec mpeg2video -b 1200k -ab 128k -acodec mp3 -r 25 -ar 44100); b = (mp3, mpg); eval kdialog --menu "выбрать свой профиль" $ (для ((i = 0; i <= $ (($ {# a [@]} -1)); i ++)); do printf "\\ '% s \\ '% s "" $ {a [i]} "" $ {b [i]} "; готово) </p>

решение

файл для чтения $ HOME / FFmpeg_profiles.lst

mpeg  -vcodec mpeg2 -ab 1000k 
avi  -vcodec avi -ab 1000k   
mp3 -acodec mp3 -ab 128k

скрипт, который я сделал

function_load_profiles(){
k=0
while read line; do 

nameprofile[$k]="$(echo "$line" | awk '{print $1}')"
ffmpegoptionprofile[$k]="$(echo "$line" | awk '{ for(b=2; b<=NF; b++) {printf("%s ", $b)} } ' )"


 k=$(( $k+1 ))
done < "$HOME/FFmpeg_profiles.lst"

}

function_load_profiles 

ARGS="--menu \"choose your profile\" --"
for ((i=0; i<${#nameprofile[@]}; i++)); do
    ARGS="$ARGS \"${ffmpegoptionprofile[$i]}\" \"${nameprofile[$i]}\""
done

SELECTED_OPTIONS=$(echo $ARGS | xargs kdialog)
echo $SELECTED_OPTIONS

Ответы [ 3 ]

3 голосов
/ 09 декабря 2011
#!/bin/bash
A=("-vcodec mp3 -ab 128k"  
   "-vcodec mpeg2video -b 1200k -ab 128k -acodec mp3 -r 25 -ar 44100")
B=("mp3" "mpg")

# Build command line args
ARGS="--menu \"choose your profile\" --"
for ((i=0; i<${#A[@]}; i++)); do
    ARGS="$ARGS \"${A[$i]}\" \"${B[$i]}\""
done

SELECTED_OPTIONS=$(echo $ARGS | xargs kdialog)
echo $SELECTED_OPTIONS

Мы используем xargs, чтобы решить проблему, заключенную в том, что параметры в кавычках (с пробелами) рассматриваются как несколько аргументов, а не как один аргумент, т. Е. «kdialog $ARGS» не будет работать должным образом.

xargs предпочтительнее, чем "eval kdialog $ARGS", поскольку это может избежать инъекции команды .


Обновление

На основе вашего обновленного примера, в котором вы фактически загружаете значения из текстового файла, вы можете сделать то же самое без промежуточных массивов:

#!/bin/bash
PROFILE_FILE="FFmpeg_profiles.lst"
ARGS="--menu \"choose your profile\" --"

while read PROFILE OPTS; do
    ARGS="${ARGS} \"${OPTS}\" \"${PROFILE}\""
done < $PROFILE_FILE

echo $ARGS | xargs kdialog
1 голос
/ 09 декабря 2011

Это может работать для вас:

a=("-vcodec mpeg2" "mpeg" "vcodec stuff -ab 100ak" "avi" "-acodec mp3 -ab 128k" "mp3")
kdialog --menu "Choose your profile:" $(printf ' "%s" %s' "${a[@]}")

Используется только один массив a, если у вас есть два (a и b), просто объедините их в третий, например:

a=(a b c) b=(1 2 3) j=0
for i in ${!a[@]}; do c[j++]="${a[i]}"; c[j++]="${b[i]}" ;done
echo "${c[1]}"
1

EDIT:

Исходный вопрос был изменен, вот новое решение, которое может работать:

options=$(sed -e '1i\echo kdialog --menu "Choose your profile:"'\
              -e 's/\s*\(\w*\)\s*\(.*\S\)\s*/"\2" \1/' $HOME/FFmpeg_profile.lst |\
        paste -sd' ' | sh)
  1. Сборка команды kdialog из файла FFmpeg_profile.lst.
  2. Каждый параметр и тег меню находятся в отдельных строках, поэтому для их поворота используйте paste.
  3. Передайте команду kdialog через оболочку и сохраните интерполированный результат в переменной.
1 голос
/ 09 декабря 2011

поставить - чтобы указать конец обработки опции, как это:

kdialog --menu "choose your profile" -- "-vcodec mpeg2" "mpeg" "vcodec stuff -ab 100ak" "avi" "-acodec mp3 -ab 128k" "mp3"

Привет

...