2009-10-15 5 views
3

Je suis en train d'écrire un petit script qui accepte un certain nombre d'arguments de ligne de commande qui imprime les rwx autorisations pour un fichier (non répertoire)

Ce que j'est

[email protected]  
if [ -f $file ] ; then  
ls -l $file  
fi 

Cela n'accepte cependant qu'un seul argument de ligne de commande. Merci pour toute aide.

+0

Je suis intrigué, cela semble étroitement lié à certaines de vos autres questions - vous voulez donner plus de fond? –

Répondre

0

La variable bash pour tous les arguments passés à un script est "$ *". Essayez:

for file in $*; do 
    if [ -f $file ] ; then 
    ls -l $file 
    fi 
done 

(non testé)

+0

Cela ne fonctionne pas avec les arguments contenant des espaces. Utilisez toujours "$ @" à la place et citez toutes vos variables. – Philipp

1

Vous pourriez utilement boucler sur tous les fichiers spécifiés comme ceci:

for file in "[email protected]"; do 
    ls -l "$file" 
done 

Si vous voulez bien vérifier que le nom spécifié est pas un répertoire, vous pouvez le faire:

for file in "[email protected]"; do 
    if [ ! -d "$file" ]; then 
    ls -l "$file" 
    fi 
done 
+0

'$ @' et '$ file' doivent être placés entre guillemets pour protéger les espaces et autres caractères spéciaux. – Cascabel

+0

Tout à fait raison - j'étais trop paresseux dans ma pensée. Merci beaucoup. Maintenant corrigé. :-) – Tim

3

Que diriez-vous celui-ci :

for file 
do 
    test -f "$file" && ls -l "$file" 
done 

La boucle par défaut fonctionne sur $ @ pour, de sorte que vous ne devez pas en parler. Notez que vous devrez citer "$ file" dans le cas où le nom du fichier contient de l'espace. Par exemple, si vous enregistrez votre script « myll.sh »:

$ myll.sh "My Report.txt" file1 file2 

Puis « Mon Report.txt » sera transmis comme un jeton entier au lieu de 2 jetons séparés: « Mon » Rapport et ». txt "

+1

Je pense qu'il est généralement préférable d'inclure le '$ @' de toute façon pour plus de clarté. – Cascabel

+0

C'est une question de goût, mais je suis d'accord avec vous. J'ai inclus $ @ depuis longtemps, mais j'ai juste arrêté de le faire récemment. –

2

La variable que vous voulez est en effet [email protected] - ceci contient tous les arguments de ligne de commande en tant que mots séparés, chacun transmis intact (pas d'expansion). ($* les traite tous comme un seul mot - bonne chance de le trier si vous avez des espaces dans les noms de fichiers).

Vous pouvez boucler, si vous le souhaitez. Ceci est facilement étendu à des actions plus complexes que ls.

for file in "[email protected]"; do 
    if [ -f "$file" ]; then 
     ls -l "$file" 
    fi 
done 

Note: vous devez citer [email protected] pour protéger les caractères spéciaux à l'intérieur! Vous devriez également citer $file pour la même raison - en particulier dans le test. S'il y a une chaîne vide dans [email protected], file sera également vide, et sans guillemets, -f essayera d'agir sur le ']'. Des erreurs s'ensuivent.

De plus, si tout ce que vous devez faire est ls (sauter votre if) vous pouvez simplement faire ceci:

ls -l "[email protected]" 
8

Voici une démonstration de quelques-unes des différences entre $* et [email protected], avec et sans citations:

#/bin/bash 
for i in $*; do 
    echo "\$*: ..${i}.." 
done; echo 
for i in "$*"; do 
    echo "\"\$*\": ..${i}.." 
done; echo 
for i in [email protected]; do 
    echo "\[email protected]: ..${i}.." 
done; echo 
for i in "[email protected]"; do 
    echo "\"\[email protected]\": ..${i}.." 
done; echo 

Son exécution:

[email protected]$ ./paramtest abc "space here" 
$*: ..abc.. 
$*: ..space.. 
$*: ..here.. 

"$*": ..abc space here.. 

[email protected]: ..abc.. 
[email protected]: ..space.. 
[email protected]: ..here.. 

"[email protected]": ..abc.. 
"[email protected]": ..space here.. 
Questions connexes