Что лучше: высокая загрузка ЦП с низкой частотой или наоборот? [закрыто]

Eliminar letras de cadenas es fácil de hacer de una sola vez sin iterar sobre los caracteres de la cadena. Esto podría hacerse con trasí:

#!/bin/sh

perms="$( printf '%s' "$1" | tr -c -d 'rwx' )"

chmod u+"$perms" "$2"

Esto usa trpara eliminar primero todo del argumento de la primera línea de comando que no sea ninguno de los caracteres r, wo x, luego ejecuta chmod.

Tenga en cuenta la cita de las expansiones, especialmente "$2". Sin estas comillas, no podría usar su secuencia de comandos en archivos con espacios o caracteres de nombre de archivo en sus nombres (, consulte p. " ¿Por qué mi script de shell se ahoga con espacios en blanco u otros caracteres especiales? " ).

En bash, puede usar una sustitución de parámetro como

perms=${1//[!rwx]/}

Esto elimina todo lo que no es r, wo xde $1y asigna el resultado a perms.

El guión bashse convierte en

#!/bin/bash
chmod u+"${1//[!rwx]/}" "$2"

Usando

shift
chmod u+"$perms" "$@"

donde $permsse calcula de cualquiera de las formas anteriores(antes de el shift), incluso podría hacer que su secuencia de comandos realice el cambio en varios archivos a la vez. El shiftelimina el primer argumento de la línea de comando de la lista y "$@"se expandirá al resto de los argumentos,cada uno citado individualmente.


Si necesita absolutamente iterar sobre los caracteres de la cadena (no ), entonces puede hacerlo así:

#!/bin/bash

string="$1"

for (( i = 0; i < ${#string}; ++i )); do
    ch="${string:i:1}"
    if [[ "$ch" == [rwx] ]] && [[ "$new_string" != *$ch* ]]; then
        new_string+=$ch
    fi
done

printf 'The new string is "%s"\n' "$new_string"

Esto construye una nueva cadena a partir de la anterior agregando r, wo xsi el carácter actual en la cadena original es uno de esos caracteres, y si el el carácter aún no existe en la nueva cadena (no es necesario para la operación dechmod).

En lugar de usar seq, usamos un bucle forque va de cero a uno menos que la longitud de la cadena original, y para facilitar la lectura y no repetirnos, extraemos el carácter actual en chen cada iteración.

En lugar de tres pruebas en el carácter, realizamos una sola coincidencia de patrón para ver si es r, wo x.

4
15.01.2018, 14:16
0 ответов

Теги

Похожие вопросы