3

このようなkdialogでメニューを作りたい

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

配列aにはオプションが含まれています配列bにはプロファイルの名前が含まれています

kdialogには「-ab」に問題があるようです。一般的には-オプションのようなものが必要と思われるため、「\"-vcodecmpeg2\"」である必要があります。

基本的に私の問題は見積もりの​​問題です。printfを使用しましたが、取得できません。

これは私のコードです:

a =(-vcodec mp3 -ab 128k、-vcodec mpeg2video -b 1200k -ab 128k -acodec mp3 -r 25 -ar 44100); b =(mp3、mpg); eval kdialog --menu "choose your profile" $(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[@]}")

これは1つの配列のみを使用しaます。2つ(aおよびb)がある場合は、次のようにそれらを3つ目にマージします。

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. ファイルkdialogからコマンドを作成しFFmpeg_profile.lstます。
  2. 各オプションとメニュータグは別々の行にあるため、を使用pasteしてピボットします。
  3. コマンドをシェルにパイプしkdialog、補間された結果を変数に保存します。
于 2011-12-09T11:12:37.890 に答える