When I do a while loop in which there is a command 'ssh', the while loop just goes only one iteration and quits. The problem is from 'ssh' read stdin so that 'while' cannot read anymore and stop afterwards, for example,
while read CompName
do
ssh $CompName 'ls'
echo "Done"
done <>
In the example, only one iteration is conducted (including the echo line). The solutions are provided by google searching. One is general one, I think. 1) Redirect ssh stdin by
< /dev/null ssh $CompName 'ls'
2) ssh-specified trick: use '-n':
ssh -n $CompName 'ls'
Wednesday, November 12, 2008
linux:shell: broken 'while' loop
Tuesday, February 26, 2008
Linux: command: how to use getopt
A simple example is here:
http://tldp.org/LDP/abs/html/extmisc.html#EX33A
From http://www.tomshardware.com/ucg/commands/getopt-15186.html
getopt
UNIX Shell: Shells (ash, bash, bsh, csh, ksh, sh, tcsh, zsh)
Function
Cleans up and checks options given to a shell script. It split option given together and place each option in its own variable. Any additional arguments is placed after --
Syntax
set -- `getopt optstring $*`
getopt optstring parameter
Linux: [ options... ] -- optstring parameter
Linux: getopt [ options... ] -o optstring [ options... ] [ -- ] parame
optstring Specifies a string of option letters that is recognized by the script.
NOTE: If a letter is followed by a colon (:) it will take an argument.
parameter Specifies the options to check. (This is often $*, the argument list to the script).
set -- Sets the argument list $* .
Linux:
-a Allows long options to start with a single -.
-h Shows help information.
-l longoptions Specifies a long option that will be recognized.
-n progname Specifies a program to use to report errors
-o optstring Specifies a list of short options.
-q Disables error reporting
-Q Doesn't generate any output. Errors are reported unless -q is also given.
-s shell Uses quoting conversions of the specified shell (sh, bash, csh or tcsh)
-u Doesn't quote the output.
-T Will test if this is the enhanced version.
-V Shows version information.
File Name: getopt Directory: /usr/bin/ Type: External
Note:
This is very useful to make easy option check in a shell script.
set -- `getopt ab:c $*`
Specifies that a and c don't take an argument but c will.
If argument is: -ac -b hello
It will be converted to: -a -c -b hello --
If argument is: -bhello ucg
It will be converted to: -b hello -- ucg
set -- `getopt -l help ab:c $*`
Also recognizes the long option --help
