bash - 使用 kdialog bash 脚本创建动态选项菜单 : Printf can't do the job ? 引用问题

标签 bash printf quoting

我想用这样的 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 "choose your profile" $(for ((i = 0; i <=$(( ${#a[@]} -1 )) ; i++ )) ; do printf "\\'%s\\' %s " "${a[i]}" "${b[i]}" ; done)

解决方案

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

最佳答案

#!/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"won '按预期工作。

xargs 优于“eval kdialog $ARGS”,因为它可以避免命令注入(inject)


更新

根据您实际从文本文件加载值的更新示例,您可以在没有中间数组的情况下执行相同的操作:

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

关于bash - 使用 kdialog bash 脚本创建动态选项菜单 : Printf can't do the job ? 引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8443515/

相关文章:

linux - 如何使用 <ctrl>c 从 script-1.sh 杀死 script-0.sh?

bash - 头输出到特定行

c - 使用 strcpy 存储具有多个变量的字符串

c - 如何向字符添加引号?

linux - 即使文件具有完全权限,权限也被拒绝

windows - 通过 Cygwin 通过 "Windows Command"启动 Perl 脚本

sprintf 导致字符数组溢出

c - 我无法理解打印第一个八个数组元素的数组的输出

bash - if 语句内的变量替换

bash - 使用包含引号的字符串作为 bash 中命令的参数,无需额外转义