Remover letras de strings é fácil de fazer de uma só vez sem iterar os caracteres da string. Isso pode ser feito com tr
assim:
#!/bin/sh
perms="$( printf '%s' "$1" | tr -c -d 'rwx' )"
chmod u+"$perms" "$2"
Isso usa tr
para primeiro remover tudo do primeiro argumento da linha de comando que não é nenhum dos caracteres r
, w
ou x
e, em seguida, executa o chmod
.
Observe as citações das expansões, especialmente "$2"
. Sem essas citações, você não seria capaz de usar seu script em arquivos com espaços ou caracteres globbing de nomes de arquivo em seus nomes (consulte, por exemplo, " Por que meu script de shell sufocar em espaços em branco ou outros caracteres especiais? ").
Em bash
, você pode usar uma substituição de parâmetro como
perms=${1//[!rwx]/}
Isso remove tudo o que não é r
, w
ou x
de $1
e atribui o resultado a perms
.
O script bash
torna-se
#!/bin/bash
chmod u+"${1//[!rwx]/}" "$2"
Usando
shift
chmod u+"$perms" "$@"
onde $perms
é calculado de qualquer uma das maneiras acima ( antes do shift
), você pode até fazer com que o seu script execute a alteração em vários arquivos de uma vez. O shift
remove o primeiro argumento de linha de comando da lista e "$@"
expandirá para o restante dos argumentos, cada um citado individualmente.
Se você precisar absolutamente para iterar os caracteres da string (você não precisa), então você pode fazer assim:
#!/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"
Isso cria uma nova seqüência de caracteres antiga adicionando r
, w
ou x
a ela se o caractere atual na sequência original for um desses caracteres e, se o caractere ainda não existe na nova string (não é necessário para a operação de chmod
).
Em vez de usar seq
, usamos um loop for
que vai de zero a um menor que o tamanho da string original e, para facilitar a leitura e não nos repetir, extraímos o caractere atual em ch
em cada iteração.
Em vez de três testes no personagem, realizamos uma única correspondência de padrão para ver se é r
, w
ou x
.