3

我想用 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 "选择你的个人资料" $(for ((i = 0; i <=$(( ${#a[@]} -1 )) ; i++ )) ; do printf "\\'%s \\' %s " "${a[i]}" "${b[i]}" ; 完成)

解决方案

文件读取 $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
4

3 回答 3

4
#!/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
于 2011-12-09T11:02:19.990 回答
1

放一个 -- 表示选项处理结束,如下所示:

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

问候

于 2011-12-09T10:23:49.447 回答
1

这可能对您有用:

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

这仅使用一个数组a,如果您有两个 (ab),只需将它们合并为第三个,如下所示:

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

编辑:

原始问题已被修改,这是一个可能有效的新解决方案:

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. kdialogFFmpeg_profile.lst文件构建命令。
  2. 每个选项和菜单标签都在不同的行上,因此请使用paste它们来旋转它们。
  3. 通过 shell将命令通过管道传输kdialog并将插值结果保存在变量中。
于 2011-12-09T11:12:37.890 回答