说明的
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}
代码说明:
attr
是一个数组,使用此page for
循环运行15次(它等于lsattr
返回的文件属性数量),并在每次循环中验证未设置的属性&#34; - &#34;,如果设置了属性,则追加&#34; true attr [j] attr [k]&#34;到values
并将属性附加到setted
(以后用于目的)或追加&#34; false attr [j] attr [k]&#34;到values
zenity
values
醇>
启动输出:
Zenity window
它告诉我&#34; s&#34;属性已设置但不是真的,因为lsattr
输出为-------------e-- file
。我注意到page中的属性多于lsattr
输出
注意:的
我知道,也许我没有使用正确的方法,所以如果你能找到一个更好的方法,那么我全都是耳朵。
感谢。
答案 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[@]}"