BASH FAQ # 50: "Estou tentando colocar um comando em uma variável, mas os casos complexos sempre falham!"
Sou muito novo no shell de scripts e na criação de um script para um projeto. Eu estou tendo um problema ao fazer "stat" em um nome de arquivo, para verificar o tamanho, que tem espaços nele. O problema é que não consigo escrever o comando diretamente, e primeiro tenho que armazenar em uma variável então tenho que executá-lo via aquela variável. Por exemplo, meu script é:
##test.sh
###Start
OIFS=$IFS
IFS=$'\n'
filename=$1
a=stat
b=-c
c=%s
d=${filename}
CMD="$a $b $c $d"
result='$CMD'
echo "Size is:"$result
IFS=$OIFS
###END
Configurei o IFS = $ '\ n' para passar o nome do arquivo com espaço como parâmetro. quando eu executo, então eu recebo:
[root@abhargava ~]# ./test.sh dirLevel1/file\ Level1.txt
./test.sh: line 9: stat -c %s dirLevel1/file Level1.txt: No such file or directory
Size is:
Por causa do IFS, acho que o shell está tratando o comando como uma única unidade sem dividi-lo em partes e, se eu remover essa configuração do IFS, ele diz:
[root@abhargava ~]# ./test.sh dirLevel1/file\ Level1.txt
stat: cannot stat 'dirLevel1/file': No such file or directory
stat: cannot stat 'Level1.txt': No such file or directory
Size is:
Portanto, trata-se o parâmetro como dois arquivos diferentes. Eu não posso usar "$ @" também porque eu estou recebendo o nome do arquivo de alguma outra lógica de listagem de arquivos em um diretório como
for i in 'find ${arg} -type f'
do
calling the test.sh
done
Por favor me ajude o mais rápido possível .. !! Agradecemos antecipadamente .... !!
Concordo com Ignacio, manter os scripts Bash simples é a melhor abordagem a ser adotada. A partir disso, simplifiquei o script para permitir que ele trabalhasse com espaços. Para permitir que ele manipule espaços, colocar o nome do arquivo entre aspas permitiu que o script lidasse com espaços no nome do arquivo.
##test.sh
###Start
result='stat -c %s "$1"'
echo "Size is:"$result
###END