用于chattr和lsattr的Zenity GUI

时间:2017-11-13 02:18:16

标签: bash zenity

说明

Hello Stackers ,我目前正在为命令chattr制作zenity GUI。我想要做的是使用zenity --list --checklist来显示和更改文件的属性,以勾选我想要的属性,但我面临的主要问题是我不知道 lsattr 输出的顺序是什么,例如: -------------e-- file

代码示例:

attr=("A" "Solo escritura" "a" "No actualizar" "c" "Comprimido" "C" "No copiar en escritura" "D" "Actualización de directorio sincrónica" "d" "Ignorar en backup" "E" "Error de compreción" "e" "Usando extents" "h" "Archivo enorme" "I" "Indexación hashed trees" "i" "Archivo inmutable" "j" "Registro de datos" "s" "Borrado seguro" "S" "Actualización sincrónica" "T" "Directorio tope" "t" "Archivo sin cola" "u" "Deshacer borrado" "X" "Acceso crudo dec compreción" "Z" "Archivo comprimido sucio" "-v" "Generar verción de archivo")

fileattr=$(lsattr "$file") ; j=0 ; k=1

for (( i=1; i<=15; i++ )); do
    [[ "${fileattr:$i:1}" != "-" ]] && values+="true ${attr[$j]} ${attr[$k]//' '/_} " && setted+="${attr[$j]} " ||\
    values+="false ${attr[$j]} ${attr[$k]//' '/_} "
    ((j+=2)) ; ((k+=2))
done

zenity --list --checklist --column="Estado" --column="Atributo" --column="Descripción" ${values}

代码说明:

  1. attr是一个数组,使用此page
  2. 进行排序
  3. for循环运行15次(它等于lsattr返回的文件属性数量),并在每次循环中验证未设置的属性&#34; - &#34;,如果设置了属性,则追加&#34; true attr [j] attr [k]&#34;到values并将属性附加到setted(以后用于目的)或追加&#34; false attr [j] attr [k]&#34;到values
  4. 最后使用收集的zenity
  5. 致电values

    启动输出:

    Zenity window 它告诉我&#34; s&#34;属性已设置但不是真的,因为lsattr输出为-------------e-- file。我注意到page中的属性多于lsattr输出

    中的属性

    注意:

    我知道,也许我没有使用正确的方法,所以如果你能找到一个更好的方法,那么我全都是耳朵。

    感谢。

1 个答案:

答案 0 :(得分:0)

Associative arrays will be useful in this task.

Let's define a list of all the possible attributes:

valueList=acdeijstuACDST

Let's define an associative array to store the values:

declare -A valueMap

Initialize the map with all false values for all attributes:

for ((i = 0; i < ${#valueList}; i++)); do
    name=${valueList:i:1}
    valueMap[$name]=false
done

Loop over characters in fileattr to update values in the map to true:

for ((i = 0; i < 16; i++)); do
    name=${fileattr:i:1}
    [[ $name != - ]] && valueMap[$name]=true
done

Combine valueMap and your original attr to create an array of values to pass to Zenity:

zenityValues=()
for ((i = 0; i < ${#attr[@]}; i+=2)); do
    name=${attr[i]}
    description=${attr[i+1]}
    zenityValues+=(${valueMap[name]} "$name" "$description")
done

And finally call Zenity as you did, but passing zenityValues as an array:

zenity ... "${zenityValues[@]}"